掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
如何輸出Webpack構(gòu)建分析

成都創(chuàng)新互聯(lián)公司主要從事網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)邵武,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108
1. 方案一:通過可視化分析工具Webpack Analyse,是個(gè)在線Web應(yīng)用,上傳starts.json文件就可以;
2. 方案二:安裝webpack-bundle-analyzer工具npm i -g webpack-bundle-analyzer,生成starts.json后直接在其文件夾目錄執(zhí)行webpack-bundle-analyzer后,瀏覽器會(huì)打開對(duì)應(yīng)網(wǎng)頁并展示構(gòu)建分析文檔地址webpack-bundle-analyzer
3. webpack-dashboard是一款統(tǒng)計(jì)和優(yōu)化webpack日志的工具,可以以表格形勢(shì)展示日志信息。其中包括構(gòu)建過程和狀態(tài)、日志以及涉及的模塊列表
4. jarvis是一款基于webapck-dashboard的webpack性能分析插件,性能分析的結(jié)果在瀏覽器顯示,比webpack-bundler-anazlyer更美觀清晰GitHub文檔地址
- const Jarvis = require("webpack-jarvis");
- plugins: [
- new Jarvis({
- watchOnly: false,
- port: 3001 // optional: set a port
- })
- ];
webpack配置優(yōu)化
1. 根據(jù)導(dǎo)入語句尋找對(duì)應(yīng)的要導(dǎo)入的文件;
2. 在根據(jù)要導(dǎo)入的文件后綴,使用配置中的Loader去處理文件(如使用ES6需要使用babel-loader處理)
1. 優(yōu)化Loader配置
- {
- test: /\.js$/,
- use: [
- 'babel-loader?cacheDirectory',//開啟轉(zhuǎn)換結(jié)果緩存
- ],
- include: path.resolve(__dirname, 'src'),//只對(duì)src目錄中文件采用babel-loader
- exclude: path.resolve(__dirname,' ./node_modules'),//排除node_modules目錄下的文件
- },
2. 優(yōu)化resolve.modules配置
- resolve: {
- modules: [path.resolve(__dirname, 'node_modules')],
- }
3. 優(yōu)化resolve.extensions配置
1. 頻率出現(xiàn)高的文件后綴優(yōu)先放在前面;
2. 列表盡可能的??;
3. 書寫導(dǎo)入語句時(shí),盡量寫上后綴名
使用DllPlugin優(yōu)化
1. 將依賴的第三方模塊抽離,打包到一個(gè)個(gè)單獨(dú)的動(dòng)態(tài)鏈接庫中
2. 當(dāng)需要導(dǎo)入的模塊存在動(dòng)態(tài)鏈接庫中時(shí),讓其直接從鏈接庫中獲取
3. 項(xiàng)目依賴的所有動(dòng)態(tài)鏈接庫都需要被加載
1. DllPlugin插件:用于打包出一個(gè)個(gè)單獨(dú)的動(dòng)態(tài)鏈接庫文件;
2. DllReferencePlugin:用于在主要的配置文件中引入DllPlugin插件打包好的動(dòng)態(tài)鏈接庫文件
- const path = require('path');
- const DllPlugin = require('webpack/lib/DllPlugin');
- module.exports = {
- mode: 'production',
- entry: {
- // 將React相關(guān)模塊放入一個(gè)動(dòng)態(tài)鏈接庫
- react: ['react','react-dom','react-router-dom','react-loadable'],
- librarys: ['wangeditor'],
- utils: ['axios','js-cookie']
- },
- output: {
- filename: '[name]-dll.js',
- path: path.resolve(__dirname, 'dll'),
- // 存放動(dòng)態(tài)鏈接庫的全局變量名,加上_dll_防止全局變量沖突
- library: '_dll_[name]'
- },
- // 動(dòng)態(tài)鏈接庫的全局變量名稱,需要可output.library中保持一致,也是輸出的manifest.json文件中name的字段值
- // 如react.manifest.json字段中存在"name":"_dll_react"
- plugins: [
- new DllPlugin({
- name: '_dll_[name]',
- path: path.join(__dirname, 'dll', '[name].manifest.json')
- })
- ]
- }
- const DllReferencePlugin = require('webpack/lib/DllReferencePlugin');
- ...
- plugins: [
- // 告訴webpack使用了哪些動(dòng)態(tài)鏈接庫
- new DllReferencePlugin({
- manifest: require('./dll/react.manifest.json')
- }),
- new DllReferencePlugin({
- manifest: require('./dll/librarys.manifest.json')
- }),
- new DllReferencePlugin({
- manifest: require('./dll/utils.manifest.json')
- }),
- ]
1. webpack --progress --colors --config ./webpack.dll.config.js
2. webpack --progress --colors --config ./webpack.prod.js
HappyPack并行構(gòu)建優(yōu)化
1. 安裝:npm i -D happypack
2. 重新配置rules部分,將loader交給happypack來分配:
- const HappyPack = require('happypack');
- const happyThreadPool = HappyPack.ThreadPool({size: 5}); //構(gòu)建共享進(jìn)程池,包含5個(gè)進(jìn)程
- ...
- plugins: [
- // happypack并行處理
- new HappyPack({
- // 用ID來代表當(dāng)前HappyPack是用來處理一類特定文件的,與rules中的use對(duì)應(yīng)
- id: 'babel',
- loaders: ['babel-loader?cacheDirectory'],//默認(rèn)設(shè)置loader處理
- threadPool: happyThreadPool,//使用共享池處理
- }),
- new HappyPack({
- // 用唯一ID來代表當(dāng)前HappyPack是用來處理一類特定文件的,與rules中的use對(duì)應(yīng)
- id: 'css',
- loaders: [
- 'css-loader',
- 'postcss-loader',
- 'sass-loader'],
- threadPool: happyThreadPool
- })
- ],
- module: {
- rules: [
- {
- test: /\.(js|jsx)$/,
- use: ['happypack/loader?id=babel'],
- exclude: path.resolve(__dirname,' ./node_modules'),
- },
- {
- test: /\.(scss|css)$/,
- //使用的mini-css-extract-plugin提取css此處,如果放在上面會(huì)出錯(cuò)
- use: [MiniCssExtractPlugin.loader,'happypack/loader?id=css'],
- include:[
- path.resolve(__dirname,'src'),
- path.join(__dirname, './node_modules/antd')
- ]
- },
- }
1. threads:代表開啟幾個(gè)子進(jìn)程去處理這一類文件,默認(rèn)是3個(gè);
2. verbose:是否運(yùn)行HappyPack輸出日志,默認(rèn)true;
3. threadPool:代表共享進(jìn)程池,即多個(gè)HappyPack示例使用一個(gè)共享進(jìn)程池中的子進(jìn)程去處理任務(wù),以防資源占有過多
代碼壓縮用ParallelUglifyPlugin代替自帶的 UglifyJsPlugin插件
1. uglifyJS: {}:用于壓縮 ES5 代碼時(shí)的配置,Object 類型
2. test: /.js$/g:使用正則去匹配哪些文件需要被 ParallelUglifyPlugin 壓縮,默認(rèn)是 /.js$/
3. include: []:使用正則去包含被壓縮的文件,默認(rèn)為 [].
4. exclude: []: 使用正則去包含不被壓縮的文件,默認(rèn)為 []
5. cacheDir: '':緩存壓縮后的結(jié)果,下次遇到一樣的輸入時(shí)直接從緩存中獲取壓縮后的結(jié)果并返回,默認(rèn)不會(huì)緩存,開啟緩存設(shè)置一個(gè)目錄路徑
6. workerCount: '':開啟幾個(gè)子進(jìn)程去并發(fā)的執(zhí)行壓縮。默認(rèn)是當(dāng)前運(yùn)行電腦的 CPU 核數(shù)減去1
7. sourceMap: false:是否為壓縮后的代碼生成對(duì)應(yīng)的Source Map, 默認(rèn)不生成
- ...
- minimizer: [
- // webpack:production模式默認(rèn)有配有js壓縮,但是如果這里設(shè)置了css壓縮,js壓縮也要重新設(shè)置,因?yàn)槭褂胢inimizer會(huì)自動(dòng)取消webpack的默認(rèn)配置
- new optimizeCssPlugin({
- assetNameRegExp: /\.css$/g,
- cssProcessor: require('cssnano'),
- cssProcessorOptions: { discardComments: { removeAll: true } },
- canPrint: true
- }),
- new ParallelUglifyPlugin({
- cacheDir: '.cache/',
- uglifyJS:{
- output: {
- // 是否輸出可讀性較強(qiáng)的代碼,即會(huì)保留空格和制表符,默認(rèn)為輸出,為了達(dá)到更好的壓縮效果,可以設(shè)置為false
- beautify: false,
- //是否保留代碼中的注釋,默認(rèn)為保留,為了達(dá)到更好的壓縮效果,可以設(shè)置為false
- comments: false
- },
- compress: {
- //是否在UglifyJS刪除沒有用到的代碼時(shí)輸出警告信息,默認(rèn)為輸出
- warnings: false,
- //是否刪除代碼中所有的console語句,默認(rèn)為不刪除,開啟后,會(huì)刪除所有的console語句
- drop_console: true,
- //是否內(nèi)嵌雖然已經(jīng)定義了,但是只用到一次的變量,比如將 var x = 1; y = x, 轉(zhuǎn)換成 y = 1, 默認(rèn)為否
- collapse_vars: true,
- }
- }
- }),
- ]
“積跬步、行千里”—— 持續(xù)更新中~,喜歡的話留下個(gè)贊和關(guān)注哦!

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流