webpack学习笔记13-代码分离
背景
针对一个多页面向目来讲,我们希望每个包的体积都更小一些。
方案
可以使用webpack的提供的三种分离方案
- 入口起点:使用 entry 配置手动地分离代码。
- 防止重复:使用 CommonsChunkPlugin 去重和分离 chunk。
- 动态导入:通过模块的内联函数调用来分离代码。
写法
使用 entry 配置手动地分离代码。
清理一下文件并新增一个生产与开发环境及通用配置的config
文件
1 | webpack_learn |
修改新增的配置文件内容
修改 webpack.config.js
文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19const path = require('path');
const HTMLWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = {
entry: {
index: './src/index.js',
math: './src/math.js'
},
plugins: [
new CleanWebpackPlugin(),
new HTMLWebpackPlugin({
title: 'Code Splitting'
})
],
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist')
}
};
然后修改package.json
中的scripts
快捷指令
1 | { |
修改一下index.js
的内容1
2
3let name = require('./let.js');
let sayName = require('./get.js');
sayName('大家好,我的名字是'+name)
然后执行打包指令1
npm run build #也可以yarn build 打包生产环境
index.bundle.js
打包后可以看到编译的结果
1 | webpack_learn |
并且index.html
中的内容如下,引入了两个js
文件,而且,index.js
及math.js
中的代码被分离开了,达成了通过entry
的配置方式进行分离
1 | <!DOCTYPE html> |
使用 CommonsChunkPlugin 去重和分离 chunk
CommonsChunkPlugin
插件可以将公共的依赖模块提取到已有的入口 chunk 中,或者提取到一个新生成的 chunk。
继续修改文件目录1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 webpack_learn
|- node_modules
|- package.json
|- webpack.config.js
|- yarn.lock
|- src
|- let.js
|- get.js
|- index.js
+ |- index2.js
|- math.js
|- dist
|- index.html
|- index.bundle.js
|- math.bundle.js
1 | //index2.js |
修改 webpack.config.js
文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20const path = require('path');
const HTMLWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = {
entry: {
index: './src/index.js',
index2: './src/index2.js',
math: './src/math.js'
},
plugins: [
new CleanWebpackPlugin(),
new HTMLWebpackPlugin({
title: 'Code Splitting'
})
],
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist')
}
};
然后执行打包指令1
npm run build #也可以yarn build 打包生产环境
然后可以看到,index2.bundle.js
与index.bundle.js
中,均出现了重复的代码
1 | ([function(e,t){e.exports="小明"},function(e,t){e.exports=function(e){console.log(e)}} |
为了解决这种情况,可以使用CommonsChunkPlugin
去重和分离 chunk
修改 webpack.config.js
文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 const path = require('path');
const HTMLWebpackPlugin = require('html-webpack-plugin');
+ const webpack = require('webpack');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = {
entry: {
index: './src/index.js',
index2: './src/index2.js',
math: './src/math.js'
},
plugins: [
new CleanWebpackPlugin(),
new HTMLWebpackPlugin({
title: 'Code Splitting'
- })
+ }),
+ new webpack.optimize.CommonsChunkPlugin({
+ name: 'common' // 指定公共 bundle 的名称。
+ })
],
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist')
}
};
然后执行打包指令1
npm run build #也可以yarn build 打包生产环境
此时打包报错了,提示信息1
Error: webpack.optimize.CommonsChunkPlugin has been removed, please use config.optimization.splitChunks instead.
修改 webpack.config.js
文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 const path = require('path');
const HTMLWebpackPlugin = require('html-webpack-plugin');
- const webpack = require('webpack');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = {
entry: {
index: './src/index.js',
index2: './src/index2.js',
math: './src/math.js'
},
plugins: [
new CleanWebpackPlugin(),
new HTMLWebpackPlugin({
title: 'Code Splitting'
- }),
- new webpack.optimize.CommonsChunkPlugin({
- name: 'common' // 指定公共 bundle 的名称。
- })
],
+ optimization: {
+ splitChunks: {
+ cacheGroups: {
+ commons: {
+ name: "commons",
+ chunks: "all",
+ minChunks: 2
+ }
+ }
+ }
+ },
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist')
}
};
webpack.optimize.CommonsChunkPlugin
这个模块被移除了,请使用config.optimization.splitChunks
代替,查询文档地址
但是我们发现,再次打包,也没有单独生成一个我们命名的commons.bundle.js
初步怀疑是,公共代码包里的代码体积过小,导致的没有打包,我们将index.js
和index2.js
中引入一个巨大的lodash
模块再来尝试一下
1 | //index.js |
然后执行打包指令1
npm run build #也可以yarn build 打包生产环境
打包结果如下
Asset | Size | Chunks | Chunk Names |
---|---|---|---|
commons.bundle.js | 71.1 KiB | 0 [emitted] | commons |
index.bundle.js | 1.64 KiB | 1 [emitted] | index |
index.html | 379 bytes | [emitted] | |
index2.bundle.js | 1.58 KiB | 2 [emitted] | index2 |
math.bundle.js | 1.18 KiB | 3 [emitted] | math |
可以看到,lodash
模块被打包进了commons.bundle.js
从而实现了公共代码的分离
原文作者: IT梅
原文链接: http://www.meixiaohan.com/2019/09/06/webpack_learn_13/
版权声明: 转载请注明出处(必须保留原文作者署名原文链接)