webpack4 自學筆記三(提取公用代碼)

所有的代碼及筆記均可以在個人github上查看, 歡迎star:https://github.com/Jasonwang911/webpackStudyInit/tree/master/commonThunk
 
1. 提取公用代碼的做用:
減小代碼的冗餘
提升用戶的加載速度
單頁面減小下載,多頁面可使用緩存

2. webpack3.0 中的 commonsChunkPlugin 插件
webpack的內置插件 webpack.optimize.CommonsChunkPlugin
配置項:
options.name / options.names thunk的名稱
options.filename 打包後的文件名稱
options.minChunks 公用的次數(多少次會被提取): 能夠是數字、函數和
options.chunks 指定提取代碼的範圍
options.children
options.deepChildren 是否在子模塊看中繼續提取公用代碼
options.async 建立一個異步的公共代碼塊

3. 不一樣場景的配置
單頁應用:


多頁應用:


多頁應用+第三方依賴+webpack生成代碼


4. 安裝環境
npm install webpack --save-dev


5. webpack4.0 webpack4 最大的改動就是廢除了CommonsChunkPlugin 引入了 optimization.splitChunks

若是你再webpack4中使用了weppack3的CommonsChunkPlugin 會出現如下報錯: (運行配置文件 webpack3.config.js)

Error: webpack.optimize.CommonsChunkPlugin has been removed, please use config.optimization.splitChunks

webpack3.config.js:
 
var webpack = require('webpack')
var path = require('path')

module.exports = {
    mode: 'development',
    entry: {
        'pageA': './src/pageA'
    },
    output: {
        path: path.resolve(__dirname, './dist'),
        filename: '[name].bundle.js',
        chunkFilename: '[name].chunk.js'
    },
    plugins: [
        new webpack.optimize.CommonsChunkPlugin({
            name: 'common',
            minChunk: 2
        })
    ],
    devtool: 'source-map',
}

  

webpack4 配置更加簡單,若是設置了 mode 爲 production,那麼webpack4 會自動開啓 Code Splitting

6. webpack4內置的代碼分割策略
a. 新的chunk是否被共享或者來自node_module的模塊
b. 新的chunk體積在壓縮以前是否大於30kb
c. 按需加載chunk的併發請求數量小於等於5個
d. 頁面初始加載時的併發請求數量小於等於3個

7. 合理使用 Code Splitting
a. 基礎類庫 chunk-libs : 好比 vue + vuex + vue-router + axios 這類的全家桶,一旦立項升級頻率不高,可是每一個文件基本都須要依賴


b. UI組件庫 chunk-common : 好比 element-ui 升級頻率也不會高,單獨打包緣由是體積比較大


c. 低頻組件 : 好比一些特定頁面須要使用的第三方庫文件--富文本編輯器等

d. 公用業務代碼 : 好比vue的路由懶加載 component: () => import('./xxx.vue') webpack默認會將其打包成一個獨立的bundle

針對如上需求可進行以下配置:
 
splitChunks: {
  chunks: "all",
  cacheGroups: {
    libs: {
      name: "chunk-libs",
      test: /[\/]node_modules[\/]/,
      priority: 10,
      chunks: "initial" // 只打包初始時依賴的第三方
    },
    elementUI: {
      name: "chunk-elementUI", // 單獨將 elementUI 拆包
      priority: 20, // 權重要大於 libs 和 app 否則會被打包進 libs 或者 app
      test: /[\/]node_modules[\/]element-ui[\/]/
    },
    commons: {
      name: "chunk-comomns",
      test: resolve("src/components"), // 可自定義拓展你的規則
      minChunks: 2, // 最小共用次數
      priority: 5,
      reuseExistingChunk: true
    }
  }
};
相關文章
相關標籤/搜索