国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

webpack dll打包重復問題優化

NicolasHe / 2797人閱讀

摘要:關于的使用,我這里不做過多介紹,網上都有,一擼一大把,今天我要說的是在使用過程中出現的一個包依賴問題,這個問題導致打出來的包會包含重復的代碼。

關于webpack dll的使用,我這里不做過多介紹,網上都有,一擼一大把,今天我要說的是在使用dll plugin過程中出現的一個包依賴問題,這個問題導致打出來的包會包含重復的代碼。

優化背景

最近在給公司項目優化的時候,由于內部CDN上傳文件大小限制了500K,所以用了webpack dll來進行拆分打包,我將拆分的包分為三部分:

vue生態包(vuevuexvue-routervuex-classvue-class-component等周邊生態的庫)

vue插件包(vee-validate、內部UI庫,圖片預覽等vue插件庫)

第三方包(axios、內部一些錯誤統計、上報,員工水印等這些脫離于vue的第三方庫)

三部分的包名分別是vue.dll.jsplugin.dll.jslib.dll.js,這樣的好處是結構清晰,最重要的原因還是分解包的大小,降低到500K以內

但是在進行dll打包后,我驚奇地發現vue.dll.jsplugin.dll.js中會包含重復的vue的dist代碼

下面是分別是前兩部分的bundle分析圖

可以看到這倆dll都包含了vue

那么要分析問題原因,先說一下我的DLL的配置吧

DLL配置

因為webpack支持多entry,所以一般多入口dll打包的話,首先會考慮一個webpack配置,多個entry入口,所以可能會出現

// webpack.dll.conf.js

module.exports = {
    // 其他配置先省略
        entry: {
             vue: ["vue", "vuex", "vue-router", ...],
             plugin: ["vee-validate", "內部UI庫", ...],
             lib: ["axios", "dayjs", ...]
        },
    plugins: [
        new webpack.DllPlugin({
            // dll.配置
        })
    ]
}

但是親測這樣打包出來的文件依然有上述問題

所以結合我在之前公司所實踐的webpack multi compiler方式,參考webpack multi compiler,我把webpack的配置一分為三,每一個dll包都有一個webpack配置,即

// config.js

exports.dll = [
    {
        name: "vue",
        libs: ["vue", "vuex", "vue-router", "vuex-class", "vue-class-component"]
    },
    {
        name: "lib",
        libs: [axios", "dayjs", "第三方庫"]
    },
    {
        name: "plugin",
        libs: ["vee-validate", "v-viewer", "vue插件庫"]
    }
]
// webpack.dll.conf.js

module.exports = config.dll.map(function (vendor) {
    return {
        // 省略其他配置
        entry: {
            [vendor.name]: vendor.libs
        },
        plugins: [
            new webpack.DllPlugin({
                // dll.配置
            })
        ]
    }
})
// dll.js

const dllConfig = require("./webpack.dll.conf")

webpack(dllConfig, function (err, stats) {
    if (err) throw err
    // 處理stats相關信息
})

本以為這樣可以解決問題,但是現實卻是不能,所以得先分析一下問題所在

分析問題

經過仔細的排查,發現是由于內部UI庫中多帶帶引用了vue,即在庫中有

import Vue from "vue"

// ...
// Vue相關操作
// Vue.prototype.$isServer等

這樣不管是多入口打包還是multi compiler方式下都會出現重復的包

解決方法

分析dll的原理,其實dll在打包的時候會將所有包含的庫做一個索引,寫在一個manifest文件中,然后在引用dll的時候只需要引用這個manifest文件即可

所以我就在想,如果plugin.dll.js依賴于vue.dll.js中的vue,那么是否可以先打包vue.dll.js,然后在打包plugin.dll.js的時候引用vue.dll.js呢?

心動不如行動,趕緊嘗試一下,做出如下修改

// config.js

exports.dll = [
    {
        name: "vue",
        libs: ["vue", "vuex", "vue-router", "vuex-class", "vue-class-component"]
    },
    {
        name: "lib",
        libs: [axios", "dayjs", "第三方庫"]
    },
    {
        name: "plugin",
        libs: ["vee-validate", "v-viewer", "vue插件庫"],
        ref: "vue"
    }
]
// webpack.dll.conf.js

// generate config
const gen = function (vendors) {
    return vendors.map(function (item) {
        const base = {
            entry: {
                [item.name]: item.libs
            },
            plugins: [
                new webpack.DllPlugin({
                    // dll配置
                })
            ]
        }
        
        if (item.ref) {
            // 重點在這
            // 在有ref的dll配置中,插入dll reference的plugin,內容是所依賴的dll包的manifest
            base.plugins.push(new webpack.DllReferencePlugin({
                // dll reference其他配置
                manifest: "所依賴的dll包的manifest文件路徑"
            }))
        }
        
        return base
    })
}

// 根據是否有ref依賴項,區分base config和ref config
const [baseVendors, refVendors] = config.dll.vendors.reduce((config, v) => {
    config[v.ref ? 1 : 0].push(v)
    return config
}, [
    [],
    []
])

// 生成base config
const getConfig = function () {
    return gen(baseVendors)
}

// 生成ref config
const getRefConfig = function () {
    return gen(refVendors)
}

module.exports = {
    getConfig,
    getRefConfig
}
// dll.js

const dllConfig = require("./webpack.dll.conf")

// 因為ref config依賴于base config,所以要保證base config先打包出來
const runWebpack = function (config) {
    return new Promise(function (resolve) {
        webpack(config, function (err, stats) {
            if (err) throw err
            // ...
            resolve()
        })
    })
}

module.exports = function run () {
    runWebpack(dllConfig.getConfig())
        .then(() => runWebpack(dllConfig.getRefConfig()))
}

整體變成了如下結構

最關鍵的一步就是plugin.dl.js會引用vue.dll.js的manifest文件,這樣公共部分vue,就只會出現在vue.dll.js中了,plugin.dll.js打包后的bundle分析圖如下

可以很明顯地看到plugin.dll.js中已經沒有vue dist的身影了,包的體積得到了優化??

可優化項

上述優化其實只考慮了一個依賴項,那么如果plugin.dll.js同時依賴于vue.dll.js和lib.dll.js呢?如果此時vue.dll.js也依賴于lib.dll.js呢?

如果出現上述情況,那么請先考慮dll包是否需要拆分?拆分是否合理?

然后再思考如何根據依賴順序思考打包順序,以及如果出現循環依賴,該怎么辦?

由于目前優化需求中還未出現這種情況(這種情況應該很少很少很少見),所以我這邊就沒有解決這些問題了

總結

參考平常打包通過dll reference plugin來引用dll包的manifest的方式,如果多個dll包內出現了依賴,導致打包重復,那么是可以在依賴包中運用dll reference plugin來引用被依賴包的dll manifest,不過這樣的話,需要注意dll包的打包順序,被依賴包的dll要先于依賴包dll進行打包

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/98253.html

相關文章

  • React系列---Webpack環境搭建(三)打包性能優化

    摘要:的選項中,是文件的輸出路徑是暴露的對象名,要跟保持一致是解析包路徑的上下文,這個要跟下面要配置的保持一致。最后修改一下模板,增加引用文件給入口文件再加點依賴模塊,方便打包觀察運行打包可以看到,入口文件里依賴的,模塊,直接引用了。 React系列---Webpack環境搭建(一)手動搭建React系列---Webpack環境搭建(二)不同環境不同配置React系列---Webpack環境...

    Jason_Geng 評論0 收藏0
  • 記一次使用 vue-admin-template 的優化歷程

    摘要:同時也要引入對應版本的先引入引入組件庫因為依賴是從外部引入的,所以需要告知在打包時,依賴的來源。然后在中加入一條命令執行或者即可完成打包。因此將此次優化記錄下來,并傳上了中。 本文原文 前言 公司有好幾個項目都有后臺管理系統,為了方便開發,所以選擇了 vue 中比較火的 后臺模板 作為基礎模板進行開發。但是,開始用的時候,作者并沒有對此進行優化,到項目上線的時候,才發現,打包出來的文件...

    xumenger 評論0 收藏0
  • webpack 基礎與項目優化實踐總結

    摘要:前言本文基于,主要涉及基本概念基本配置和實際項目打包優化。關于概念方面參考官網,常用配置來自于網絡資源,在文末有相關參考鏈接,實踐部分基于自己的項目進行優化配置。同一文件中,修改某個影響其他。 前言:本文基于weboack4.x,主要涉及webpack4 基本概念、基本配置和實際項目打包優化。關于概念方面參考官網,常用配置來自于網絡資源,在文末有相關參考鏈接,實踐部分基于自己的項目進行...

    Scorpion 評論0 收藏0
  • webpack4.0優化那些事兒

    摘要:配置以何種方式導出庫。當檢測文件不再發生變化,會先緩存起來,等等待一段時間后之后再通知監聽者,這個等待時間通過配置。發布到線上給用戶使用的運行環境。 一 縮小文件搜索范圍 1 include & exclude 1) action 限制編譯范圍 2) useage module: { rules: [ { test...

    levy9527 評論0 收藏0
  • 【Vue項目總結】webpack常規打包優化方案

    摘要:由于新建項目發版打包時間大概需要分鐘,發版時嚴重拖慢下班時間,所以特意查看了相關文檔來優化打包速度,爭取早點下班,。分析打包文件要優化,先分析。 由于新建項目發版打包時間大概需要30分鐘,發版時嚴重拖慢下班時間,所以特意查看了相關文檔來優化打包速度,爭取早點下班,^_^。 分析打包文件 要優化,先分析。我們先要知道到底是哪里拖慢我們的打包速度呢? 打包后生成文件分析 可以利用webpa...

    andong777 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<