webpack 4捨棄了以前的
commonChunkPlugin
,增長了SplitChunksPlugin
, 對於這個插件,它的option
選項有initial
、async
、all
三個值。我想大多數剛學習webpack 4
的同窗應該都不能很好的理解這幾個值的區別,到底每一個選項值是啥意思,咱們來手把手實踐一下。node
原文連接:Webpack 4 — Mysterious SplitChunks Pluginreact
幾點說明:jquery
name
字段的緣故。官方文檔webpack
咱們作一個粗略的嘗試,思路是有兩個a.js
和b.js
兩個入口文件,引入相同的模塊,區別是一些模塊是動態引入的,以此來摸索一下Code-Spliting
。web
墜重要的固然是配置一下webpack環境npm
mkdir splitTest
cd splitTest
npm init -y
複製代碼
npm i react jquery loadsh -S
npm i webpack webpack-bundle-analyzer webpack-cli @babel/core @babel/plugin-syntax-dynamic-import -D
複製代碼
webpack.config.js
json
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
module.exports = {
mode: 'production',
entry: {
a: './src/a.js',
b: './src/b.js'
},
output: {
filename: '[name].bundle.js'
},
module: {
rules: [
{
test: /\.(js)$/,
loader: 'babel-loader',
exclude: /node_modules/
}
]
},
plugins: [
new BundleAnalyzerPlugin()
],
optimization: {
splitChunks: {
cacheGroups: {
vendor: {
test: /node_modules/,
name: 'vendors', // 這個字段不寫結果會不同,能夠嘗試一下,我目前沒整明白,求大佬解答
chunks: 'initial',
}
}
}
}
}
複製代碼
package.json
bash
"scripts": {
"build": "webpack --config webpack.config.js"
}
複製代碼
.babelrc
babel
{
"plugins": [
"@babel/plugin-syntax-dynamic-import"
]
}
複製代碼
import 'react';
import 'jquery';
import ('lodash');
console.log('I am angry!');
var a = 10;
export default a;
複製代碼
import ('react');
import ('lodash');
import 'jquery';
console.log('I am Exciting!');
var b = 10;
export default b;
複製代碼
採用控制變量法,咱們來試驗當存在公共庫的時候,webpack是怎麼處理的async
畫了個比較挫的圖,大概描述一下
...
vendor: {
test: /node_modules/,
chunks: 'initial',
priority: 1,
}
...
複製代碼
從圖中咱們能夠看出:
JQuery
和react
被打到vendors.bundle.js
裏,被a.js
和b.js
共享,因爲react
在a.js
中不是動態加載的,因此也被打進去了lodash
被打到1.bundle.js
中 由於這是兩個文件共有的動態模塊b.js
中的react
被打到4.bundle.js
中看看發生了什麼:
webpack
從b.js
中抽離了react
,扔到一個新文件,a.js
中的react
不動。這個優化只會做用到動態模塊,import('react')
聲明會產生獨立的文件,import 'react'
則不會a.js
和b.js
共有的動態模塊lodash
被移動到一個新文件。JQuery
進行優化,儘管a.js
和b.js
都引用了至關於告訴webpack
,我打包的時候只關心動態加載的模塊,其餘的你隨便玩。
全部模塊都被扔到了vendors.bundle.js
裏面。