webpack5学习 --- 代码压缩
Terser
Terser是一个JavaScript的解释(Parser)、Mangler(绞肉机 丑化
)/Compressor(压缩机 移除不使用的代码,压缩多行代码为一行
)的工具集
Terser可以帮助我们压缩、丑化我们的代码,让我们的bundle变得更小
Terser是一个独立的工具,可以单独安装
早期我们会使用 uglify-js来压缩、丑化我们的JavaScript代码,但是目前已经不再维护,并且不支持ES6+的 语法;
Terser是从 uglify-es fork 过来的,并且保留它原来的大部分API以及适配 uglify-es和uglify-js@3等
# 安装
npm i terser
# 使用
npx terser ./src/index.js -o index.min.js
# 等价于
npx terser ./src/index.js -o index.min.js -c defaults
# 多个选项之间使用逗号进行分割
# 如果只有选项名,没有配置值的使用使用的是默认值
npx terser ./src/index.js -o index.min.js -c arrows,arguments=true
# 使用默认形式进行压缩,默认情况下只对函数的参数进行压缩
npx terser ./src/index.js -o index.min.js -m
# 全部的代码统统进行压缩
npx terser ./src/index.js -o index.min.js -m toplevel=true
但是,在实际开发中,我们从零去使用Terser对我们的代码进行相应的配置,是十分的繁琐的,为此webpack使用了内置的插件TerserWebpackPlugin
,这个插件内部对terser进行了一系列通用的默认配置。
TerserWebpackPlugin
可以让我们不需要手动的通过terser来处理我们的代码,而是直接通过webpack来处理
因为webpack内部默认就会使用TerserWebpackPlugin
,所以我们直接引入即可,因为TerserWebpackPlugin
已经作为了webpack的依赖被安装下来了
配置
在webpack中有一个minimizer属性,在production模式下,默认就是使用TerserPlugin来处理我们的代码的
如果我们对默认的配置不满意,也可以自己来创建TerserPlugin的实例,并且覆盖相关的配置
-
首先,我们需要打开minimize,让其对我们的代码进行压缩(默认production模式下已经打开了,如果是在development模式下进行使用的时候,需要手动进行开启)
-
其次,我们可以在minimizer创建一个TerserPlugin选项,并在其中进行相应的配置
optimization: {
minimizer: [
new TerserPlugin({
// 不将 comments进行抽离
extractComments: false,
// 是否使用多线程进行编译 --- 默认值就是true
// 可以设置为number,即手动指定设置多少进程进行打包
// 也可以设置为true,此时parallel的值就是cpus.length - 1
parallel: true,
terserOptions: {
// 在这里对terser进行手动配置
// 在这里的配置会覆盖默认 terser 中的配置
}
})
]
}
CSS压缩
CSS压缩通常是去除无用的空格等,因为很难去修改选择器、属性的名称、值等;
CSS的压缩我们可以使用另外一个插件:css-minimizer-webpack-plugin
# 安装
npm install css-minimizer-webpack-plugin -D
配置
plugins: [
new CssMinimizerWebpackPlugin()
]
Scope Hoisting
Scope Hoisting从webpack3开始增加的一个新功能
功能是对作用域进行提升,并且让webpack打包后的代码更小、运行更快
默认情况下webpack打包会有很多的函数作用域,包括一些(比如最外层的)IIFE
- 无论是从最开始的代码运行,还是加载一个模块,都需要执行一系列的函数;
- Scope Hoisting可以将可以合并到一个模块中的函数,全部合并到一个模块中来运行, 从而节省不必要函数调用时的性能消耗
- webpack在运行
Scope Hoisting
的时候,其实是依赖的对ES Module的静态分析, - 所以在webpack中推荐所有的模块引入和使用使用ES Module的方式来进行使用
使用Scope Hoisting非常的简单,webpack已经内置了对应的模块:
- 在production模式下,默认这个模块就会启用
- 在development模式下,我们需要自己来打开该模块;
plugins: [
new webpack.optimize.ModuleConcatenationPlugin()
]
转载自:https://juejin.cn/post/7005568031917260830