代码分离
- 代码分离用于获取更小的打包文件
- 还可以控制资源加载的优先级
常用的代码分离方法
方法一:配置入口节点
- 使用entry配置手动地分离代码
- 问题:如果有多个入口,那么这些多个入口共享的文件会分别在每个包里重复打包
- 产生如下报错,提示一个出口对应多个入口
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/71fca94aabaa4664af3c44c708bf38f1.png)
- 解决方法,出口写活
- 这个[name]会自动对应入口文件名
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d768a95229754a2ba28a066b84919693.png)
- 展示缺点
- 类似这个lodash如果在多个入口文件都有引入,到时候打包的时候的出口文件就会多次重复打包这个插件
- 这样就会造成打完的包体积变大!
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/9a8102b5ef29421995c96dc0921c12c9.png)
方法二:防止重复
- 使用entry dependencies或者通过splitChunksPlugin去重和分离代码
- entry dependencies,将共用的抽离出来单独打包
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/13e261d784444a6085a27284d4e5d092.png)
- splitChunksPlugin ,实现代码分割,将公共的代码抽离到一个单独的文件
optimization: {
splitChunks: {
chunks:'all'
}
},
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/4d68e1f5f74d417b86f3590bd48a2002.png)
方法三:动态导入
- 通过模块的内联函数调用来分离代码
- 懒加载,也叫按需加载,在使用的时候加载模块
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/efe298f013c34e35a87ad118e8b91b61.png)
- 预获取/预加载模块
- 打出的包看不出区别,但游览器上有区别
- 这个预获取prefetch是指在首页加载完毕后,网络有空闲的时候,加载我们的math.bundle
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1a67aaa7151741af8e38c91b57921744.png)
- 预加载,效果和懒加载效果差不多,在使用的时候再加载
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/e3b46e6eea6e4173b2a3711fa9088f2d.png)
缓存
原因
- 1,webpack打包我们的模块化应用程序,会生成一个可以部署的dist目录
- 2,然后webpack把打包好的内容放置在这个dist目录中
- 3,我们将这个目录放置在serve中,也就是服务器中
- 4,这样游览器就能访问我们的资源了
- 5,获取资源比较耗费时间,所以游览器会采取缓存技术
- 6,通过命中缓存以降低网络流量,使网站加载速度更快
- 7,但当部署资源的时候,不更改资源的文件名,游览器会认为没有更新,就会使用缓存版本
- 8,所以,导致,新代码的获取有点困难!
解决思路
- 1,确保webpack编译生成的文件能够被客户端缓存
- 2,而在文件发生变化的时候,又能够请求的新的文件
-
- 采取命名改变
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/5f8457a39e804df889ae9f944aa1c467.png)
缓存第三方库
原因
解决思路
- 将第三方库单独vendor chunk文件中
- 利用client长效缓存机制,命中缓存来消除请求,减少向服务器获取资源,并且还能保证代码一致
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/9573a9ec579b4668aa7a8e7aba5765e9.png)
将所有js文件单独存放文件夹
- 目的,将打包好的文件打包在一个文件里
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/9e5ca89e8bff4ca885a62375492d75b7.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/68e2f2edf9384b88a05e9d78434e0a87.png)
拆分开发环境和生产环境配置
公共路径
- publicPath配置选项
- 通过它来指定应用程序中所有资源的基础路径
- 代码位置
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/3ad704d9be1e4fe885a931f2a7166f21.png)
- 实现效果
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/14d164ae88534c3a8babbc7c0ca8683d.png)
环境变量和区分环境代码压缩
- 目的:想要消除web.config.js在开发环境和生产环境之间的差异
- 用户可以设置: npx webpack --env production
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b3a27c81347d41268f56c8d237f05e42.png)
- 按道理我们可以使用webpack开箱即用的terser那个插件,可以生效的,目前为什么没有生效
- 原因:之前有写css压缩,配置了这个,terser配置就得单独配置一下
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c2d665b5f5414781bb6ef3ab0898f99d.png)
- 安装:npm install terser-webpack-plugin -D
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/84252c04db3146d78282225b26cb71fc.png)
- 因为这个在生产环境压缩,开发环境不执行压缩
- 然后运行 npx webpack --env production
- 注意哈:必须 --env production
拆分配置文件
- 先新建两个文件区分不同环境
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6542069e581d43b5bd729c201739f85c.png)
开发环境下,webpack.config.dev.js文件内容
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: {
index: './src/index.js',
another: './src/another-module.js',
},
optimization: {
splitChunks: {
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'all',
},
},
},
},
output: {
filename: 'scripts/[name].js',
path: path.resolve(__dirname, '../dist'),
clean: true,
assetModuleFilename: 'images/[name].[contenthash][ext]',
},
mode: 'development',
devtool: 'inline-source-map',
plugins: [
new HtmlWebpackPlugin({
template: './index.html',
filename: 'app.html',
inject: 'body',
}),
],
devServer: {
static: '../dist',
},
};
- 使用这个打包:npx webpack -c ./config/webpack.config.dev.js
- 所以,就会在开发环境下,无域名,js代码无压缩
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/12885b965a744ba895846ca3a08d2b0e.png)
生产环境下,webpack.config.build.js文件内容
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin');
module.exports = {
entry: {
index: './src/index.js',
another: './src/another-module.js',
},
optimization: {
minimizer: [new CssMinimizerPlugin(), new TerserPlugin()],
splitChunks: {
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'all',
},
},
},
},
output: {
filename: 'scripts/[name].[contenthash].js',
path: path.resolve(__dirname, '../dist'),
clean: true,
assetModuleFilename: 'images/[name].[contenthash][ext]',
publicPath: 'http:localhost:8080/',
},
mode: 'production',
plugins: [
new HtmlWebpackPlugin({
template: './index.html',
filename: 'app.html',
inject: 'body',
}),
],
};
- 所以,npx webpack -c ./config/webpack.config.build.js
- 这个命令下,代码会压缩,会带域名
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/38f068437ab047daaa178f29f2417818.png)
npm 脚本
- 每次打包或者启动服务,都需要在命令行里面输入一长串命令
- 例如:上面的npx webpack -c./config/webpack.config.build.js这些,很麻烦!
- 所以配置npm 脚本来简化命令行的输入
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/54c0f0a534ff42b29a1b1320d73b9686.png)
- npx 可以省略
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/da1aa6109c7b4897a2b9f5f3a006b3f7.png)
- 然后运行npm run start打测试包或者npm run build打正式包即可
关闭性能提示
- 有时候会有一些包超出的警告
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f1e790a284ef4005b15bf0cb9f112c2e.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/96c0013d57914b8e904b7997478d9ddb.png)
提取公共配置
- 我们发现开发环境和生产环境下的配置文件里有大量重复代码
- 可以手动将重复的代码单独提前到一个文件里
- 创建 webpack.config.common.js,存放共有的配置
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: {
index: './src/index.js',
another: './src/another-module.js',
},
optimization: {
splitChunks: {
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'all',
},
},
},
},
output: {
path: path.resolve(__dirname, './dist'),
clean: true,
assetModuleFilename: 'images/[name].[contenthash][ext]',
},
plugins: [
new HtmlWebpackPlugin({
template: './index.html',
filename: 'app.html',
inject: 'body',
}),
],
};
- 删除其余配置文件中和公共配置相同的内容,只保留不同内容
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/3f9a9f5d692643608f1b84323589db33.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c0526ff7e5a64825b2c0107598513ffb.png)
合并配置文件
- npm install webpack-merge
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/2ebeb2dc066d467a956dc34da74cc26c.png)
通过 --env来传递环境变量
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a55231af45274405b2166358287933ec.png)