为process.env.xxx = xxx赋值时,process.env会将值强制转换为String类型
10. Webpack-devServer介绍
devServer的publicPath、contentBase、watchContentBase、hotOnly、host、port、open、compress、proxy、changeOrigin、historyApiFallbackresolve的extensions、alias、mainFiles11. Webpack-多环境及代码分离
1. 环境分离
Webpack的config需要写成函数,默认参数env,可以根据scripts的—env判断当前环境是否为生产环境或者开发环境
- 多环境分离,使用scripts进行build和serve,以及context和entry的路径关系
- babel的plugins分环境加载,需要在webpack.config.js中将env设置到process.env.NODE_ENV,可以直接在babel.config.js中读取
-
2. 代码分离
配置entry多入口,进行代码分离,依赖项可以额外添加
-
12. Webpack-代码分包
1. 动态加载
使用
import进行动态加载,使用magic comment指定chunk名/* webpackChunkName: 'xxx' */2. prefetch/preload
懒加载的文件,可以指定prefetch或preload
/* webpackPrefetch: true */浏览器闲置期间下载/* webpackPreload: true */会跟随所在文件加载而加载3. runtimeChunk
针对运行时的文件,进行打包
参数:
true/multiple|single|function|object4. CDN
内容分发网络
Content Delivery Network或Content Distribution Network- 购买CDN服务器,将
output的publicPath设置为CDN地址,全部使用CDN文件 - 第三方库的CDN服务器,需要配置webpack的
externals,指定某些第三方库不进行打包,并将第三方库的CDN地址,在index.html中引入 引入第三方库的CDN时,可以根据环境不同,进行优化
{% if(process.env.NODE_ENV === 'production') { %}<script src="xxxx"></script>{% } %}
5. Shimming
详情见Shimming
6. MiniCssExtractPlugin
需要配合
MiniCssExtractPlugin.Loader使用7. hash、contenthash、chunkhash
hash,某一处改动,build后的所有文件hash值都会改变
- chunkhash,某个文件改动,build后,当前文件以及引用文件的hash值会改变,其他文件hash值不变
contenthash,某一文件改动,build后,只更改修改内容所在文件的hash值,其他文件hash值不变
13. Webpack-打包效率
1. 查找第三方库的全局变量
2. DLL
3. Terser —- 代码压缩
webpack中,production环境,默认使用TerserPlugin以及其他插件,对代码进行压缩优化
详情见webpack的terser-webpack-plugin
4. CSS压缩
css压缩通常是去除空格
-
5. 作用域提升(Scope Hoisting)
Scope Hoisting从webpack3新增
- 对作用域提升(将函数提升到一个模块运行,基于ESModule)使打包后的代码更小、运行更快
- production环境下,默认开启
-
14. Webpack-treeshaking
1. js的treeshaking
usedExports
- sideEffects
-
2. css的treeshaking
-
3. http压缩
传送时,进行gzip压缩
-
4. HTML代码压缩
-
5. chunk后的包内联到HTML中
-
6. webpack对library进行打包配置
15. Webpack—打包原理解析
1. 分析各个插件或loader打包时间
-
2. 分析打包大小
cli添加参数
--profile --json=stats.json,可以在webpack-bundle-analyzer3. webpack启动流程分析—-webpack-cli流程
