https://blog.csdn.net/weixin_33936401/article/details/92055588
webpack-bundle-analyzer(可視化)
模塊功能:
- 意識到你的文件打包壓縮后中真正的內(nèi)容
- 找出哪些模塊組成最大的大小
- 找到錯誤的模塊
- 優(yōu)化它!
- 最好的事情是它支持縮小捆綁!它解析它們以獲得實際大小的捆綁模塊。它也顯示他們的gzipped大?。?/li>
安裝和使用
npm install --save-dev webpack-bundle-analyzer
在webpack.config.js中:
let BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
module.exports = {
plugins: [new BundleAnalyzerPlugin()]
}
==BundleAnalyzerPlugin== 構(gòu)造函數(shù),可以采用默認(rèn)的可選配置對象:
new BundleAnalyzerPlugin({
// 可以是`server`,`static`或`disabled`。
// 在`server`模式下,分析器將啟動HTTP服務(wù)器來顯示軟件包報告。
// 在“靜態(tài)”模式下,會生成帶有報告的單個HTML文件。
// 在`disabled`模式下,你可以使用這個插件來將`generateStatsFile`設(shè)置為`true`來生成Webpack Stats JSON文件。
analyzerMode: 'server',
// 將在“服務(wù)器”模式下使用的主機啟動HTTP服務(wù)器。
analyzerHost: '127.0.0.1',
// 將在“服務(wù)器”模式下使用的端口啟動HTTP服務(wù)器。
analyzerPort: 8888,
// 路徑捆綁,將在`static`模式下生成的報告文件。
// 相對于捆綁輸出目錄。
reportFilename: 'report.html',
// 模塊大小默認(rèn)顯示在報告中。
// 應(yīng)該是`stat`,`parsed`或者`gzip`中的一個。
// 有關(guān)更多信息,請參見“定義”一節(jié)。
defaultSizes: 'parsed',
// 在默認(rèn)瀏覽器中自動打開報告
openAnalyzer: true,
// 如果為true,則Webpack Stats JSON文件將在bundle輸出目錄中生成
generateStatsFile: false,
// 如果`generateStatsFile`為`true`,將會生成Webpack Stats JSON文件的名字。
// 相對于捆綁輸出目錄。
statsFilename: 'stats.json',
// stats.toJson()方法的選項。
// 例如,您可以使用`source:false`選項排除統(tǒng)計文件中模塊的來源。
// 在這里查看更多選項:https: //github.com/webpack/webpack/blob/webpack-1/lib/Stats.js#L21
statsOptions: null,
logLevel: 'info' 日志級別??梢允?信息','警告','錯誤'或'沉默'。
})
啟動服務(wù):
生產(chǎn)環(huán)境查看:npm run build --report 或 正常build 即可啟動查看器
開發(fā)環(huán)境查看:webpack -p --progress 或啟動正常devServer服務(wù)即可啟動查看器!
拆包
引用的庫太多時,vendor的體積會很大,借助 Webpack 的分析工具,看了下各個依賴的體積分布
找到原因,是 Highchharts 和 Element-UI占了較大體積,導(dǎo)致性能減弱。
optimization配置如下
optimization: {
namedChunks: true,
moduleIds: 'hashed',
splitChunks: {
maxInitialRequests: 6,
cacheGroups: {
highchharts: {
chunks:'all',
test: /[\\/]node_modules[\\/](highchharts)[\\/]/,
name: 'dll',
priority: 2,
enforce: true,
reuseExistingChunk: true
},
ui: {
chunks:'all',
test: /[\\/]node_modules[\\/](element-ui|antd)[\\/]/,
name: 'dll',
priority: 5,
enforce: true,
reuseExistingChunk: true
},
superSlide: {
chunks:'all',
test: /[\\/]src[\\/]assets[\\/]js[\\/]/,
name: 'superSlide',
priority: 1,
enforce: true,
reuseExistingChunk: true
},
commons: {
name: 'commons',
minChunks: 2,//Math.ceil(pages.length / 3), 當(dāng)你有多個頁面時,獲取pages.length,至少被1/3頁面的引入才打入common包
chunks:'all',
reuseExistingChunk: true
}
}
},
runtimeChunk: {
name: 'manifest'
},
},