webpack的这个属性被用来指定项目中哪些部分将会被优化。
准备工作
- 目录
root
——dist(打包之后的文件夹)
——node_modules(下载的包)
——src(项目脚本目录)
————entry(入口点脚本)
————modules(入口点中引入的模块)
——package.json(包管理文件)
——webpack.config.js(webpack配置文件)
- webpack配置
const path = require('path')
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = {
entry: {
entry1: './src/entry/entry1.js',
entry2: './src/entry/entry2.js'
},
plugins: [
new CleanWebpackPlugin()
],
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist')
},
optimization: {
splitChunks: {
chunks: 'initial',
maxAsyncRequests: 3,
minSize: 1,
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
priority: -10
},
default: {
minChunks: 1,
priority: -20,
reuseExistingChunk: true
}
}
}
}
// default config
// optimization: {
// splitChunks: {
// chunks: 'async',
// minSize: 30000,
// minChunks: 1,
// maxAsyncRequests: 5,
// maxInitialRequests: 3,
// automaticNameDelimiter: '~',
// automaticNameMaxLength: 30,
// name: true,
// cacheGroups: {
// vendors: {
// test: /[\\/]node_modules[\\/]/,
// priority: -10
// },
// default: {
// minChunks: 2,
// priority: -20,
// reuseExistingChunk: true
// }
// }
// }
// }
}
- package.json
{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"clean-webpack-plugin": "^3.0.0",
"webpack": "^4.41.2",
"webpack-cli": "^3.3.10"
}
}
initial
这个值表示项目中被直接引入的模块将会被用于优化。
1. initial_demo1:
################################
webpack.config.js:
splitChunks.chunks设为'initial'
################################
modules/add.js:
export default function add (a, b) {
return a + b
}
################################
modules/subtract.js
export default function subtract (a, b) {
return a - b
}
################################
entry/entry1.js:
import add from '../modules/add.js'
console.log('index', add(1, 2))
################################
entry/entry2.js:
import subtract from '../modules/subtract'
console.log('index', subtract(1, 2))
npm run build(个人目前主要使用yarn或npm来进行管理,cnpm不建议使用,有时候会有问题)之后,打包如下:
Hash: 2b419949ee0e8b5f82f1
Version: webpack 4.41.4
Time: 153ms
Built at: 2019/12/22 下午3:04:56
Asset Size Chunks Chunk Names
default~entry1.bundle.js 122 bytes 0 [emitted] default~entry1
default~entry2.bundle.js 123 bytes 1 [emitted] default~entry2
entry1.bundle.js 1.47 KiB 2 [emitted] entry1
entry2.bundle.js 1.47 KiB 3 [emitted] entry2
Entrypoint entry1 = default~entry1.bundle.js entry1.bundle.js
Entrypoint entry2 = default~entry2.bundle.js entry2.bundle.js
[0] ./src/entry/entry1.js + 1 modules 122 bytes {0} [built]
| ./src/entry/entry1.js 68 bytes [built]
| ./src/modules/add.js 54 bytes [built]
[1] ./src/entry/entry2.js + 1 modules 140 bytes {1} [built]
| ./src/entry/entry2.js 81 bytes [built]
| ./src/modules/subtract.js 59 bytes [built]
然后结果可以看到,add.js和subtract.js被分别打包到default~entry1.bundle.js和default~entry2.bundle.js。
注意,这里之所以这两个块能够被split分割出来,是因为我为了方便,将默认的cacheGroups.default.minChunks设置成了1,只要并行请求次数大于等于1就会被拆分出来。
另外,这里仅仅是拆分出来了入口点中的模块,那么如果在引入的模块中又引入了模块呢,会被拆分出来吗。
2. initial_demo2:
################################
webpack.config.js:
splitChunks.chunks设为'initial'
################################
modules/add.js:
export default function add (a, b) {
return a + b
}
################################
modules/subtract.js
export default function subtract (a, b) {
return a - b
}
################################
modules/module.js:
import add from './add'
export default function () {
console.log(add(3, 4) + 10)
}
################################
entry/entry1.js:
import add from '../modules/module.js'
console.log('index', add(1, 2))
################################
entry/entry2.js:
import subtract from '../modules/subtract'
console.log('index', subtract(1, 2))
npm run build的打包结果为:
Hash: 2d11c0e1c95c35c0182c
Version: webpack 4.41.4
Time: 178ms
Built at: 2019/12/23 下午5:30:41
Asset Size Chunks Chunk Names
default~entry1.bundle.js 139 bytes 0 [emitted] default~entry1
default~entry2.bundle.js 123 bytes 1 [emitted] default~entry2
entry1.bundle.js 1.47 KiB 2 [emitted] entry1
entry2.bundle.js 1.47 KiB 3 [emitted] entry2
Entrypoint entry1 = default~entry1.bundle.js entry1.bundle.js
Entrypoint entry2 = default~entry2.bundle.js entry2.bundle.js
[0] ./src/entry/entry1.js + 2 modules 210 bytes {0} [built]
| ./src/entry/entry1.js 71 bytes [built]
| ./src/modules/module.js 85 bytes [built]
| ./src/modules/add.js 54 bytes [built]
[1] ./src/entry/entry2.js + 1 modules 140 bytes {1} [built]
| ./src/entry/entry2.js 81 bytes [built]
| ./src/modules/subtract.js 59 bytes [built]
分析一下,entry1中引入了module:
- entry1.bundle.js与entry2.bundle.js分别是两个入口点entry1和entry2的主体部分;
- default~entry1.bundle.js是入口点entry1.js中引入的module.js,我们会发现,尽管我们的minChunks设为了1,同时我们的module.js中也引入了add.js,webpack也会把它当作是一个被直接引入的module进行解析。所以我们如果打开这个文件查看,我们能看到如下的代码块:
console.log("index",void console.log(17));
也就是webpack已经将module文件完全解析出来了。
- default~entry2.bundle.js和demo1中一样,也是将entry2中直接引入的subtract打包后的结果;
3. initial_demo3
################################
webpack.config.js:
splitChunks.chunks设为'initial'
################################
modules/add.js:
export default function add (a, b) {
return a + b
}
################################
modules/subtract.js
export default function subtract (a, b) {
return a - b
}
################################
modules/module.js:
import add from './add'
export default function () {
console.log(add(3, 4) + 10)
}
################################
entry/entry1.js:
import add from '../modules/module.js'
console.log('index', add(1, 2))
################################
entry/entry2.js:
import subtract from '../modules/subtract'
import add from '../modules/add'
console.log('index', subtract(1, 2) + add(1, 0))
基于demo2,我们在entry2中新增一句对add.js的引用。在打包之前,思考这样一个问题,这个add.js会不会被单独被打包出来呢?
npm run build打包之后,结果如下:
Hash: 8f215c580657b26dd448
Version: webpack 4.41.5
Time: 208ms
Built at: 2020/01/01 上午8:59:55
Asset Size Chunks Chunk Names
default~entry1.bundle.js 168 bytes 1 [emitted] default~entry1
default~entry1~entry2.bundle.js 151 bytes 0 [emitted] default~entry1~entry2
default~entry2.bundle.js 152 bytes 2 [emitted] default~entry2
entry1.bundle.js 1.47 KiB 3 [emitted] entry1
entry2.bundle.js 1.47 KiB 4 [emitted] entry2
Entrypoint entry1 = default~entry1~entry2.bundle.js default~entry1.bundle.js entry1.bundle.js
Entrypoint entry2 = default~entry1~entry2.bundle.js default~entry2.bundle.js entry2.bundle.js
[0] ./src/modules/add.js 54 bytes {0} [built]
[1] ./src/entry/entry1.js + 1 modules 161 bytes {1} [built]
| ./src/entry/entry1.js 71 bytes [built]
| ./src/modules/module.js 85 bytes [built]
[2] ./src/entry/entry2.js + 1 modules 190 bytes {2} [built]
| ./src/entry/entry2.js 126 bytes [built]
| ./src/modules/subtract.js 59 bytes [built]
同样分析一下这几个文件:
- entry1.bundle.js和entry2.bundle.js与之前的demo相同;
- default~entry2.bundle.js是对subtract.js打包后的结果;
- default~entry1.bundle.js是对module.js打包后的结果(当然,这里面没有包含add.js的代码);
- default~entry1~entry2.bundle.js是对add.js打包后的结果;
所以,对于上面的问题,当然是ok的啦。
4. initial_demo4
################################
webpack.config.js:
splitChunks.chunks设为'initial'
################################
modules/add.js:
export default function add (a, b) {
return a + b
}
################################
modules/subtract.js
export default function subtract (a, b) {
return a - b
}
################################
modules/module.js:
import add from './add'
export default function () {
console.log(add(3, 4) + 10)
}
################################
modules/module2.js:
import add from './add'
export default function () {
console.log(add(5, 6) + 11)
}
################################
entry/entry1.js:
import add from '../modules/module.js'
console.log('index', add(1, 2))
################################
entry/entry2.js:
import add from '../modules/module2'
console.log('index', add(0, 1))
npm run build打包之后如下:
Hash: 28bb1439ac0caa0c0f7f
Version: webpack 4.41.5
Time: 168ms
Built at: 2020/01/01 上午9:27:48
Asset Size Chunks Chunk Names
default~entry1.bundle.js 168 bytes 1 [emitted] default~entry1
default~entry1~entry2.bundle.js 151 bytes 0 [emitted] default~entry1~entry2
default~entry2.bundle.js 169 bytes 2 [emitted] default~entry2
entry1.bundle.js 1.47 KiB 3 [emitted] entry1
entry2.bundle.js 1.47 KiB 4 [emitted] entry2
Entrypoint entry1 = default~entry1~entry2.bundle.js default~entry1.bundle.js entry1.bundle.js
Entrypoint entry2 = default~entry1~entry2.bundle.js default~entry2.bundle.js entry2.bundle.js
[0] ./src/modules/add.js 54 bytes {0} [built]
[1] ./src/entry/entry1.js + 1 modules 161 bytes {1} [built]
| ./src/entry/entry1.js 71 bytes [built]
| ./src/modules/module.js 85 bytes [built]
[2] ./src/entry/entry2.js + 1 modules 160 bytes {2} [built]
| ./src/entry/entry2.js 70 bytes [built]
| ./src/modules/module2.js 85 bytes [built]
和demo3相似,default~entry1~entry2.bundle.js将module1和module2中直接引入的add.js模块进行抽离并打包的结果。
initial:基于上面的demo,我们知道当将chunks配置设为initial,即将入口点中直接引入的模块、模块中引入的模块进行拆解并单独打包。(注:这里提到的模块均指直接引入的模块)
async
async这个值表示按需引入的模块将会被用于优化。
上面,我们通过几个demo基本了解了initial配置值的打包规则,接下来,同样通过几个demo的方式,希望借此来掌握async的使用。
1. demo_async1
################################
webpack.config.js:
splitChunks.chunks设为'async'
################################
modules/add.js:
export default function add (a, b) {
return a + b
}
################################
modules/subtract.js
export default function subtract (a, b) {
return a - b
}
################################
entry/entry1.js:
import('../modules/add.js').then(add => {
console.log('index', add(1, 2))
})
################################
entry/entry2.js:
import('../modules/subtract').then(subtract => {
console.log('index', subtract(2, 1))
})
npm run build,结果如下:
Hash: 68e0920fceede599eec9
Version: webpack 4.41.5
Time: 72ms
Built at: 2020/01/01 下午4:44:10
Asset Size Chunks Chunk Names
2.bundle.js 166 bytes 2 [emitted]
3.bundle.js 166 bytes 3 [emitted]
entry1.bundle.js 2.1 KiB 0 [emitted] entry1
entry2.bundle.js 2.1 KiB 1 [emitted] entry2
Entrypoint entry1 = entry1.bundle.js
Entrypoint entry2 = entry2.bundle.js
[0] ./src/entry/entry1.js 78 bytes {0} [built]
[1] ./src/entry/entry2.js 90 bytes {1} [built]
[2] ./src/modules/add.js 54 bytes {2} [built]
[3] ./src/modules/subtract.js 59 bytes {3} [built]
分析一下其中的打包结果:
- 2.bundle.js和3.bundle.js分别对应入口点entry1.js和entry2.js中的add.js和subtract.js。
2. demo_async2
################################
webpack.config.js:
splitChunks.chunks设为'async'
################################
modules/add.js:
export default function add (a, b) {
return a + b
}
################################
modules/subtract.js
export default function subtract (a, b) {
return a - b
}
################################
modules/module.js
import add from './add'
export default function () {
console.log(add(3, 4) + 10)
}
################################
entry/entry1.js:
import('../modules/module.js').then(add => {
console.log('index', add(1, 2))
})
################################
entry/entry2.js:
import('../modules/subtract').then(subtract => {
console.log('index', subtract(2, 1))
})
基于demo1,我们在entry1中按需引入module.js,module中引入了add.js。
npm run build,打包结果如下:
Hash: d291a90e6547b20a55e9
Version: webpack 4.41.5
Time: 83ms
Built at: 2020/01/01 下午4:49:23
Asset Size Chunks Chunk Names
2.bundle.js 141 bytes 2 [emitted]
3.bundle.js 166 bytes 3 [emitted]
entry1.bundle.js 2.1 KiB 0 [emitted] entry1
entry2.bundle.js 2.1 KiB 1 [emitted] entry2
Entrypoint entry1 = entry1.bundle.js
Entrypoint entry2 = entry2.bundle.js
[0] ./src/entry/entry1.js 78 bytes {0} [built]
[1] ./src/entry/entry2.js 90 bytes {1} [built]
[2] ./src/modules/subtract.js 59 bytes {3} [built]
[3] ./src/modules/module.js + 1 modules 139 bytes {2} [built]
| ./src/modules/module.js 85 bytes [built]
| ./src/modules/add.js 54 bytes [built]
打包后,我们可以在2.bundle.js中找到以下的这句:
console.log(3+4+10)
这跟initial场景下的demo2很像,即将module.js完全解析了出来。
3. demo_async3
################################
webpack.config.js:
splitChunks.chunks设为'async'
################################
modules/add.js:
export default function add (a, b) {
return a + b
}
################################
modules/subtract.js
export default function subtract (a, b) {
return a - b
}
################################
modules/module.js
import add from './add'
export default function () {
console.log(add(3, 4) + 10)
}
################################
entry/entry1.js:
import('../modules/module.js').then(add => {
console.log('index', add(1, 2))
})
################################
entry/entry2.js:
import('../modules/subtract').then(subtract => {
console.log('index', subtract(2, 1))
})
import('../modules/add').then(add => {
console.log('add', add(10, 11))
})
npm run build打包结果如下:
Hash: c66566e81e276d0faccb
Version: webpack 4.41.5
Time: 76ms
Built at: 2020/01/01 下午4:50:38
Asset Size Chunks Chunk Names
0.bundle.js 166 bytes 0 [emitted]
3.bundle.js 171 bytes 3 [emitted]
4.bundle.js 166 bytes 4 [emitted]
entry1.bundle.js 2.12 KiB 1 [emitted] entry1
entry2.bundle.js 2.17 KiB 2 [emitted] entry2
Entrypoint entry1 = entry1.bundle.js
Entrypoint entry2 = entry2.bundle.js
[0] ./src/entry/entry1.js 78 bytes {1} [built]
[1] ./src/entry/entry2.js 168 bytes {2} [built]
[2] ./src/modules/add.js 54 bytes {0} [built]
[3] ./src/modules/module.js 85 bytes {3} [built]
[4] ./src/modules/subtract.js 59 bytes {4} [built]
module.js被拆分成0.bundle.js(add.js部分)和3.bundle.js,4.bundle.js对应subtract.js。
4. demo_async4
################################
webpack.config.js:
splitChunks.chunks设为'async'
################################
modules/add.js:
export default function add (a, b) {
return a + b
}
################################
modules/subtract.js
export default function subtract (a, b) {
return a - b
}
################################
modules/module.js
import add from './add'
export default function () {
console.log(add(3, 4) + 10)
}
################################
modules/module2.js
import add from './add'
export default function () {
console.log(add(5, 6) + 11)
}
################################
entry/entry1.js:
import('../modules/module.js').then(add => {
console.log('index', add(1, 2))
})
################################
entry/entry2.js:
import('../modules/module2').then(add => {
console.log('index', add(2, 1))
})
npm run build打包后的结果如下:
Hash: b48649b8fd43369ca09d
Version: webpack 4.41.5
Time: 80ms
Built at: 2020/01/01 下午4:53:11
Asset Size Chunks Chunk Names
0.bundle.js 153 bytes 0 [emitted]
3.bundle.js 165 bytes 3 [emitted]
4.bundle.js 165 bytes 4 [emitted]
entry1.bundle.js 2.12 KiB 1 [emitted] entry1
entry2.bundle.js 2.12 KiB 2 [emitted] entry2
Entrypoint entry1 = entry1.bundle.js
Entrypoint entry2 = entry2.bundle.js
[0] ./src/entry/entry1.js 78 bytes {1} [built]
[1] ./src/entry/entry2.js 80 bytes {2} [built]
[2] ./src/modules/module.js 85 bytes {3} [built]
[3] ./src/modules/module2.js 85 bytes {4} [built]
[4] ./src/modules/add.js 54 bytes {0} [built]
3.bundle.js和4.bundle.js分别对应module.js和module2.js,两个模块中的add.js被单独打包为0.bundle.js。
5. async_demo5
################################
webpack.config.js:
splitChunks.chunks设为'async'
################################
modules/add.js:
export default function add (a, b) {
return a + b
}
################################
modules/subtract.js
export default function subtract (a, b) {
return a - b
}
################################
modules/module.js
import add from './add'
export default function () {
console.log(add(3, 4) + 10)
}
################################
modules/module2.js
export default function () {
import('../modules/add.js').then(add => {
console.log('add', add(1, 2))
})
}
################################
entry/entry1.js:
import('../modules/module.js').then(add => {
console.log('index', add(1, 2))
})
################################
entry/entry2.js:
import('../modules/module2').then(add => {
console.log(111)
})
我们将add.js通过按需引入的方式在module.js中引入,打包后结果如下:
Hash: 48720b9b74d7e799b22d
Version: webpack 4.41.5
Time: 77ms
Built at: 2020/01/01 下午5:06:17
Asset Size Chunks Chunk Names
0.bundle.js 166 bytes 0 [emitted]
3.bundle.js 171 bytes 3 [emitted]
4.bundle.js 186 bytes 4 [emitted]
entry1.bundle.js 2.12 KiB 1 [emitted] entry1
entry2.bundle.js 2.09 KiB 2 [emitted] entry2
Entrypoint entry1 = entry1.bundle.js
Entrypoint entry2 = entry2.bundle.js
[0] ./src/entry/entry1.js 78 bytes {1} [built]
[1] ./src/entry/entry2.js 65 bytes {2} [built]
[2] ./src/modules/module.js 85 bytes {3} [built]
[3] ./src/modules/module2.js 113 bytes {4} [built]
0.bundle.js、3.bundle.js、4.bundle.js分别对应add.js、module.js、module2.js。
async: 基于上面的几个demo,我们发现在async场景下,webpack会对那些按需引入的模块进行优化。
all
all这个场景表示无论是按需引入的模块,还是直接引入的模块,都会被用于优化。
在给出这个场景的案例之前,我们先来看一个initial场景下混用按需引入的案例:
################################
webpack.config.js:
splitChunks.chunks设为'initial'
################################
modules/add.js:
export default function add (a, b) {
return a + b
}
################################
modules/subtract.js
export default function subtract (a, b) {
return a - b
}
################################
entry/entry1.js:
import add from '../modules/add.js'
console.log('index', add(1, 2))
################################
entry/entry2.js:
import('../modules/subtract').then(subtract => {
console.log('index', subtract(2, 1))
})
npm run build打包后结果为:
Hash: f80258369b1c1e4ed339
Version: webpack 4.41.5
Time: 218ms
Built at: 2020/01/01 下午4:24:45
Asset Size Chunks Chunk Names
4.bundle.js 164 bytes 4 [emitted]
default~entry1.bundle.js 124 bytes 0 [emitted] default~entry1
default~entry2.bundle.js 145 bytes 1 [emitted] default~entry2
entry1.bundle.js 1.47 KiB 2 [emitted] entry1
entry2.bundle.js 2.22 KiB 3 [emitted] entry2
Entrypoint entry1 = default~entry1.bundle.js entry1.bundle.js
Entrypoint entry2 = default~entry2.bundle.js entry2.bundle.js
[0] ./src/modules/subtract.js 59 bytes {4} [built]
[1] ./src/entry/entry2.js 90 bytes {1} [built]
[2] ./src/entry/entry1.js + 1 modules 122 bytes {0} [built]
| ./src/entry/entry1.js 68 bytes [built]
| ./src/modules/add.js 54 bytes [built]
我们会发现entry2.js中按需引入的subtract被拆分为4.bundle.js和default~entry2.bundle.js,与async场景下不同的是,按需引入后执行的函数(.then的参数)会被单独打包进default~entry2.bundle.js。
然后我们将上述的代码场景改成all,再重新进行打包,结果为:
Hash: f80258369b1c1e4ed339
Version: webpack 4.41.5
Time: 237ms
Built at: 2020/01/01 下午5:20:48
Asset Size Chunks Chunk Names
4.bundle.js 164 bytes 4 [emitted]
default~entry1.bundle.js 124 bytes 0 [emitted] default~entry1
default~entry2.bundle.js 145 bytes 1 [emitted] default~entry2
entry1.bundle.js 1.47 KiB 2 [emitted] entry1
entry2.bundle.js 2.22 KiB 3 [emitted] entry2
Entrypoint entry1 = default~entry1.bundle.js entry1.bundle.js
Entrypoint entry2 = default~entry2.bundle.js entry2.bundle.js
[0] ./src/modules/subtract.js 59 bytes {4} [built]
[1] ./src/entry/entry2.js 90 bytes {1} [built]
[2] ./src/entry/entry1.js + 1 modules 122 bytes {0} [built]
| ./src/entry/entry1.js 68 bytes [built]
| ./src/modules/add.js 54 bytes [built]
按理来说,initial管理直接引入的包,async管理按需引入的包。但是,目前initial场景下,按需引入的包被拆分并单独打包出来,那么也就是说,不管怎样,按需加载的包一定会被单独打包出来(事实确实是这样,尽管项目中只按需加载了一次,并且minChunks设置大于1,也是如此)。
另外,我们发现上面的两种场景下,同样的代码,打包出来的配置是一样,这不仅会让我们有一个疑问,就是,initial和all到底有什么区别?
我们根据以下的步骤来分析一波:
- 我们以前面async的场景中的demo4的代码作为基础;
- 将chunks改为initial,打包结果如下:
Hash: f700f00520384eac7fc4
Version: webpack 4.41.5
Time: 82ms
Built at: 2020/01/01 下午8:02:09
Asset Size Chunks Chunk Names
4.bundle.js 257 bytes 4 [emitted]
5.bundle.js 257 bytes 5 [emitted]
default~entry1.bundle.js 146 bytes 0 [emitted] default~entry1
default~entry2.bundle.js 146 bytes 1 [emitted] default~entry2
entry1.bundle.js 2.22 KiB 2 [emitted] entry1
entry2.bundle.js 2.22 KiB 3 [emitted] entry2
Entrypoint entry1 = default~entry1.bundle.js entry1.bundle.js
Entrypoint entry2 = default~entry2.bundle.js entry2.bundle.js
[0] ./src/modules/module.js 85 bytes {4} [built]
[1] ./src/modules/module2.js 85 bytes {5} [built]
[2] ./src/entry/entry1.js 78 bytes {0} [built]
[3] ./src/entry/entry2.js 80 bytes {1} [built]
[4] ./src/modules/add.js 54 bytes {4} {5} [built]
4.bundle.js和5.bundle.js分别对应module.js和module2.js,两个模块中的add.js在4.bundle.js和5.bundle.js都被完全解析,没有被分离出去。而default~entry1.bundle.js和default~entry2.bundle.js则分别对应module.js和module2.js两个模块加载完后调用的方法(.then中的参数,这个在前面也提到过)。
所以,这里已经很明显了,针对initial和async两种场景,initial场景下不能将按需引入的模块中引入的模块进行拆解,而async场景下是可以的。而同样的,其实async场景不能拆分直接引入的模块。
你也可以尝试在initial场景下对某个模块引入两次,一次为按需引入,一次为直接引入,你会发现,这个模块将会被打包两次,而不是单独打包一次作为共享块。
- 接着我们将chunks改成all试试,看看会有怎样的打包结果:
Hash: 02fe278419997010e22d
Version: webpack 4.41.5
Time: 228ms
Built at: 2020/01/01 下午8:24:56
Asset Size Chunks Chunk Names
0.bundle.js 153 bytes 0 [emitted]
5.bundle.js 163 bytes 5 [emitted]
6.bundle.js 164 bytes 6 [emitted]
default~entry1.bundle.js 168 bytes 1 [emitted] default~entry1
default~entry2.bundle.js 168 bytes 2 [emitted] default~entry2
entry1.bundle.js 2.22 KiB 3 [emitted] entry1
entry2.bundle.js 2.22 KiB 4 [emitted] entry2
Entrypoint entry1 = default~entry1.bundle.js entry1.bundle.js
Entrypoint entry2 = default~entry2.bundle.js entry2.bundle.js
[0] ./src/modules/module.js 85 bytes {5} [built]
[1] ./src/modules/module2.js 85 bytes {6} [built]
[2] ./src/entry/entry1.js 78 bytes {1} [built]
[3] ./src/entry/entry2.js 80 bytes {2} [built]
[4] ./src/modules/add.js 54 bytes {0} [built]
我们会发现,结果是结合initial和async两种场景的特点,即:按需加载后执行的方法被单独打包、按需加载的模块中引入的模块会被单独打包出来。
到目前为止,想必三种场景下的理解已经差不多了。
Function
最后,splitChunk.chunks还可以是一个函数,这个函数返回一个Boolean型,用来标识chunk是否可以被打包出来。(关于chunk是什么,或者怎样理解,请浏览我的另一篇文章:https://blog.csdn.net/YaoDeBiAn/article/details/103570693)
比如:
module.exports = {
//...
optimization: {
splitChunks: {
chunks (chunk) {
// exclude `my-excluded-chunk`
return chunk.name !== 'my-excluded-chunk'
}
}
}
}
上述函数表示webpack的所有chunk中,除了chunk名为my-excluded-chunk的,其他的chunk都会被打包出来。
last(最后)
非常感谢您能阅读完这篇文章,您的阅读是我不断前进的动力。如果上述内容或许有些错误或者有些个人理解比较偏离实际,还望指出,谢谢!!!对于上面所述,有什么新的观点或发现有什么错误,希望您能指出。
最后,附上个人常逛的社交平台:
知乎:https://www.zhihu.com/people/bi-an-yao-91/activities
csdn:https://blog.csdn.net/YaoDeBiAn
github: https://github.com/yaodebian个人目前能力有限,并没有自主构建一个社区的能力,如有任何问题或想法与我沟通,请通过上述某个平台联系我,谢谢!!!