Webpack 作為目前最流行的前端構(gòu)建工具之一,在 vue/react 等 Framework 的生態(tài)圈中都占據(jù)重要地位。在開(kāi)發(fā)現(xiàn)代 Web 應(yīng)用的過(guò)程中,Webpack 和我們的開(kāi)發(fā)過(guò)程和發(fā)布過(guò)程都息息相關(guān),如何改善 Webpack 構(gòu)建打包的性能也關(guān)系到我們開(kāi)發(fā)和發(fā)布部署的效率。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、重慶小程序開(kāi)發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了丹寨免費(fèi)建站歡迎大家使用!以下是一些關(guān)于優(yōu)化 Webpack 構(gòu)建性能的幾點(diǎn)建議:
webpack 的 devtool 配置,決定了在構(gòu)建過(guò)程中怎樣生成 sourceMap 文件。通常來(lái)說(shuō)eval的性能最高,但是不能生成的 sourceMap 文件解析出來(lái)的代碼,和源代碼差異較大。 source-map 的性能較差,但是可以生成原始版本的代碼。 在大多數(shù) Development 場(chǎng)景下 cheap-module-eval-source-map 是最佳的選擇。
下圖是各個(gè) Devtool 配置的對(duì)比(+號(hào)越多,代表速度越快,-號(hào)越多,代表速度越慢, o代表中等速度)
注意* : 在 production 配置中,如果需要生成 sourceMap 文件來(lái)進(jìn)行異常分析, 應(yīng)該使用 hidden-source-map 或者 nosources-source-map, source-map 等配置。并且不要把 sourceMap 文件也放在部署目錄下。
Webpack 和一些 Plugin/Loader 都有 Cache 選項(xiàng)。開(kāi)啟 Cache 選項(xiàng),有利用提高構(gòu)建性能。
比如:使用 babel-loader 的時(shí)候開(kāi)啟 cacheDirectory 選項(xiàng),會(huì)較為明顯的提升構(gòu)建速度
module: { rules: [{ test: /\.js$/, use: ['babel-loader?cacheDirectory'], include: path.join(__dirname, 'app') }] }
使用 CommonsChunksPlugin 提取多個(gè) chunk 之間的通用模塊,減少總體的代碼體積
把部分依賴轉(zhuǎn)移到 CDN 上,避免在每次編譯過(guò)程中都由 Webpack 處理
對(duì)于支持局部引入的類庫(kù),在開(kāi)發(fā)的過(guò)程中使用局部引入的方式,避免引入無(wú)用的文件
比如 lodash 就支持部分引入:
import isArray from 'lodash/isArray';
參考: [Don't import whole lodash] (https://github.com/lodash/lodash/issues/3450)
在進(jìn)行這一優(yōu)化手段的時(shí)候,可以借助可視化工具進(jìn)行 chunk 體積和內(nèi)容的分析。方便進(jìn)一步調(diào)整 webpack 的配置。主要有以下兩種方法:
1. 使用 webpack 的 profile 命令生成 JSON 文件,并且把 JSON 上傳到相應(yīng)的在線網(wǎng)站進(jìn)行可視化分析。
```bash webpack --profile --json > stat.json ```
使用 webpack-visualizer 進(jìn)行分析:
2. 使用第三方 plugin,在編譯過(guò)程中進(jìn)行體積分析,并且以圖表方式輸出:
推薦使用 webpack-bundle-analyzer:
在使用 loader 的時(shí)候,通過(guò)指定 exclude 和 incude 選項(xiàng),減少 loader 遍歷的目錄范圍,從而加快 Webpack 編譯速度。
比如指定 babel-loader 只處理業(yè)務(wù)代碼:
{ test: /\.js$/, use: ['babel-loader'], include: path.join(__dirname, 'app') }
resolve.alias 可以配置 webpack 模塊解析的別名,對(duì)于比較深的解析路徑,可以對(duì)其配置 alias. 可以提升 webpack 的構(gòu)建速度。
alias: { Utilities: path.resolve(__dirname, 'src/utilities/'), Templates: path.resolve(__dirname, 'src/templates/') }
Webpack 的 DllPlugin 和 DllReferencePlugin 是在新版本中推出的 Plugin,其思路就是把改變頻率比較小的第三方庫(kù)等依賴單獨(dú)打包構(gòu)建,在打包整個(gè)項(xiàng)目的時(shí)候,如果解析到了通過(guò) Dll 形式進(jìn)行打包的依賴,會(huì)在正常的打包過(guò)程中跳過(guò),同時(shí)把對(duì)這些依賴的引入導(dǎo)入到 Dll 模塊上去。 這樣會(huì)大大提升在對(duì)業(yè)務(wù)代碼進(jìn)行打包時(shí)候的速度。
1. 新建一個(gè)單獨(dú)的 webpack 配置文件,比如 webpack.dll.config.js
2. 在這個(gè)配置文件中,使用 webpack DllPlugin 生成 manifest.json 文件和 Dll 模塊文件。也可以引入諸如 uglifyPlugin 對(duì)第三方依賴進(jìn)行壓縮等處理。
import path from 'path'; import pkg from './package.json'; import webpack from 'webpack';var vendorPackages = Object.keys(pkg.dependencies);const config = { entry: { vendor: vendorPackages }, output: { filename: 'dll.[name].js', path: path.resolve(__dirname, 'build', 'dll'), library: '[name]' }, plugins: [ new webpack.DllPlugin({ context: __dirname, name: "[name]_[hash]", path: path.join(__dirname, "manifest.json"), }), new webpack.optimize.UglifyJsPlugin({ sourceMap: true, minimize: true, cache: true, parallel: true }), ] } export default config;
3. 在正常的 webpack 配置文件中,使用 webpack DllReferencePlugin 解析上一步生成的 manifest.json
new webpack.DllReferencePlugin({ context: path.join(__dirname), manifest: require('./manifest.json') })
在具體的使用過(guò)成中, 在 Dll 中包含的依賴沒(méi)有變化的場(chǎng)景下,可以先執(zhí)行單次 webpack --config webpack.dll.config.js。然后可以多次執(zhí)行業(yè)務(wù)代碼的構(gòu)建過(guò)程。由于把第三方依賴進(jìn)行了剝離,業(yè)務(wù)代碼的構(gòu)建會(huì)快很多。
以下是一些關(guān)于 Webpack 構(gòu)建性能的文章:
1):使用 DllPlugin 提升性能
2): PrefetchPlugin 的使用
3): webpack 打包分析與性能優(yōu)化
4): webpack 使用優(yōu)化
轉(zhuǎn)載請(qǐng)注明出自:葡萄城控件
葡萄城成立于1980年,是全球大的控件提供商,世界領(lǐng)先的企業(yè)應(yīng)用定制工具、企業(yè)報(bào)表和商業(yè)智能解決方案提供商,為超過(guò)75%的全球財(cái)富500強(qiáng)企業(yè)提供服務(wù)。葡萄城于1988年在中國(guó)設(shè)立研發(fā)中心,在全球化產(chǎn)品的研發(fā)過(guò)程中,不斷適應(yīng)中國(guó)市場(chǎng)的本地需求,并為軟件企業(yè)和各行業(yè)的信息化提供優(yōu)秀的軟件工具和咨詢服務(wù)。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。