14. DLL库、Terser

109 阅读3分钟

什么是DLL

DLL全程是动态链接库(Dynamic Link Library),是为软件在Windows中实现共享函数库的一种实现方式。webpack中也有内置DLL的功能,它指的是我们可以将可以共享,并且不经常改变的代码,抽取成一个共享的库。这个库在之后编译的过程中,会被引入到其他项目的代码中。这是一个编译好的库,引入之后不需要再次编译。如果不用 DDL,引入的包都是需要编译的,所以 DDL 就是一些包编译好的文件。

DDL库的使用

  • 打包一个DLL库
    webpack 内置了一个 DllPlugin 可以打包一个DLL的库文件 QQ截图20231111175514.png
  • 使用打包的DLL库
    如果我们在我们的代码中使用了react、react-dom,我们有配置 splitChunks 的情况下,他们会进行分包,打包到一个独立的chunk中,但是现在我们有了dll_react,不再需要单独去打包它们,可以直接去引用 dll_react 即可。第一步:通过DllReferencePlugin插件告知要使用的DLL库,第二步:通过AddAssetHtmlPlugin插件,将我们打包的DLL库引入到Html模块中。

什么是Terser

Terser 可以压缩、丑化代码,让 bundle 变得更小。Terser是一个独立的工具,所以可以单独安装。

# 全局安装
npm install terser -g
# 局部安装
npm install terser

命令行使用Terser

terser [input files] [options]
# 举例说明
terser js/file1.js -o foo.min.js -c -m

代码压缩文档 代码丑化文档
Compress 和 Mangle 的 options
Compress option:

  • arrows:class或者object中的函数,转换成箭头函数;
  • arguments:将函数中使用 arguments[index]转成对应的形参名称;
  • dead_code:移除不可达的代码(tree shaking);

Mangle option

  • toplevel:默认值是false,顶层作用域中的变量名称,进行丑化(转换);
  • keep_classnames:默认值是false,是否保持依赖的类名称;
  • keep_fnames:默认值是false,是否保持原来的函数名称;
//命令行中执行 Terser
npx terser ./src/abc.js -o abc.min.js -c arrows,arguments=true,dead_code -m toplevel=true,keep_classnames=true,keep_fnames=true

Terser在webpack中配置

webpack中有一个minimizer属性,在production模式下,默认就是使用TerserPlugin来处理代码

  1. 打开minimize,让其对我们的代码进行压缩(默认production模式下已经打开了)
  2. 在minimizer创建一个TerserPlugin:
  3. extractComments:默认值为true,表示会将注释抽取到一个单独的文件中; 在开发中,我们不希望保留这个注释时,可以设置为false;
  4. parallel:使用多进程并发运行提高构建的速度,默认值是true,并发运行的默认数量: os.cpus().length - 1,我们也可以设置自己的个数,但是使用默认值即可。
  5. terserOptions:设置 terser 相关的配置,compress:设置压缩相关的选项,mangle:设置丑化相关的选项,可以直接设置为true,toplevel:底层变量是否进行转换,keep_classnames:保留类的名称,keep_fnames:保留函数的名称。

CSS的压缩

CSS压缩通常是去除无用的空格等,因为很难去修改选择器、属性的名称、值等,CSS的压缩我们可以使用另外一个插件:css-minimizer-webpack-plugin

  1. 安装
npm install css-minimizer-webpack-plugin -D
  1. 在 optimization.minimizer 中配置
    QQ截图20231111231600.png