webpack打包優化點

2022-09-08 21:00:49

1. noParse

作用主要是過濾不需要解析的檔案,比如打包的時候依賴了三方庫(jquyer、lodash)等,而這些三方庫裡面沒有其他依賴,可以通過設定noParse不去解析檔案,提高打包效率。
是module中的一個屬性,設定一個正規表示式,過濾多個庫以|分割

module: {
  noParse: '/jquery|lodash/',
  // rules:[]
}

2. 包含和排除目錄

指定loader解析的規則,設定包含排除目錄一般兩者寫其一就行。

{
  test: /\.js$/,
  use: {
     loader: 'babel-loader',
     options: {
       presets: ['@babel/preset-env'], // 預設,轉換js語法
          "plugins": [
              ["@babel/plugin-proposal-decorators", { "legacy": true }], // 解析類的裝飾器
              ["@babel/plugin-proposal-class-properties", { "loose": true }], // 解析類的屬性
              "@babel/plugin-transform-runtime", // 解析promise,Generator等新的API
          ]
       }
   },
  include: path.resolve(__dirname, 'src'),
  exclude: /node_modules/
}

3. IgnorePlugin

該外掛是webpack的內建外掛,用於忽略某些特定的模組,不被webpack打包進去。

在實際開發專案時,moment庫是非常常用的處理時間的庫,雖然設定了語種為中文zh-cn,但是在打包的時候,還是會將所有語言都打包進去。就導致包很大,打包速度慢,locale 目錄中存放的是多語種的語言套件,不希望全部被打包進檔案。此時就可以設定下IgnorePlugin

// src/index.js

import moment from 'moment'

// 忽略locale後,就必須手動單獨引入需要的語言套件
import 'moment/locale/zh-cn';

moment.locale('zh-cn');  //設定中文
let r = moment().endOf('day').fromNow();
console.log(r);
// webpack.config.js
let Webpack = require('webpack');
module.exports = {
    plugins:[
        new Webpack.IgnorePlugin(/\.\/locale/,/moment/), // locale 目錄中存放的是多語種的語言套件,不希望全部被打包進檔案
    ]
}

4. happypack

多執行緒打包,多用於大型專案,因為在專案很小的時候,效果反而會慢,因為而分配執行緒,也會消耗時間。

npm install happypack
let HappyPack = require('happypack');

module.exports = {
    // ...
    module:{
        rules:[
            {
                test:/\.js$/,
                use:'HappyPack/loader?id=js' //  id=js  代表打包js
            },
            {
                test:/\.css$/,
                use:'HappyPack/loader?id=css' // id=css 代表打包css
            }
        ]
    },
    plugins:[
        new HappyPack({ 
            id:'css', // 打包css
            use:['style-loader','css-loader']
        }),
        new HappyPack({ 
            id:'js', // 打包js
            use:[{ // 原本rules中 loader的設定即可
                loader:'babel-loader',
                options:{
                    presets:['@babel/presets-env', '@babel/presets-react']
                }
            }]
        })
    ]
}

5. DllPlugin動態連結庫

之前專門整理過完整的一篇關於DllPlugin動態連結庫的學習筆記,由於時間和精力的關係,不在贅述,感興趣的同學可以跳轉連結了解一下。
webpack效能優化方式之dll--- webpack.dll.config.js

6. 熱更新

之前專門整理過完整的一篇關於webpack熱更新的學習筆記,由於時間和精力的關係,不在贅述,感興趣的同學可以跳轉連結了解一下。
webpack4.15.1 學習筆記(三) — 模組熱替換HMR

7. 開發環境 tree-shaking

之前專門整理過完整的一篇關於webpack tree-shaking的學習筆記,由於時間和精力的關係,不在贅述,感興趣的同學可以跳轉連結了解一下。
webpack4.15.1 學習筆記(四) — Tree shaking

8. 抽離公共程式碼

之前專門整理過完整的一篇關於webpack抽離公共程式碼的學習筆記,由於時間和精力的關係,不在贅述,感興趣的同學可以跳轉連結了解一下。
webpack4.15.1 學習筆記(六) — 程式碼拆分(Code Splitting)

9. 懶載入

之前專門整理過完整的一篇關於webpack懶載入的學習筆記,由於時間和精力的關係,不在贅述,感興趣的同學可以跳轉連結了解一下。
webpack4.15.1 學習筆記(七) — 懶載入(Lazy Loading)