从 Webpack 4 开始,默认状况下使用 terser 压缩生产环境下的输出结果。Terser 是一款兼容 ES2015 + 的 JavaScript 压缩器。与 UglifyJS(许多项目的早期标准)相比,它是面向将来的选择。有一个 UglifyJS 的分支—— uglify-es,但因为它再也不维护,因而就从这个分支诞生出了一个独立分支,它就是 terser。css
尽管 webpack 4 默认状况下会压缩输出,但若是您想进一步调整压缩行为或更换压缩器,那么,最好了解如何自定义压缩。html
所谓压缩就是将代码变的更小,安全转换是指经过重写代码而不改变代码逻辑。这方面的好例子包括重命名变量,甚至是删除整个的访问不到的代码块(if (false)
)。前端
不安全的转换可能会破坏代码,由于它们可能会丢失底层代码所依赖的隐含内容。例如,Angular 1在使用模块时须要特定的函数参数命名。除非在这种状况下采起预防措施,不然重写参数会破坏代码。java
在 Webpack 4 中,经过两个配置字段控制压缩过程:optimization.minimize
字段切换压缩处理器,而 optimization.minimizer
数组用来配置压缩处理器。webpack
为了调整默认值,咱们将 terser-webpack-plugin 附加到项目中,以即可以调整它。git
首先,请将插件包含在项目中:github
要将其附加到配置,请首先为其定义一个局部配置:web
webpack.parts.jsnpm
将其合并到主配置:
webpack.config.js
若是如今执行 npm run build
,您应该看到与以前相同的结果。
默认状况下禁用源映射。您能够经过
sourceMap
标志启用它们。您应该检查 terser-webpack-plugin 以获取更多选项。
要调整 Terser,请附加
terserOptions
相关选项到插件中。
虽然默认值和 terser-webpack-plugin 适用于此用例,但您能够考虑更多选项:
特定的解决方案容许您预处理代码,以便它运行得更快。它们补充了压缩技术,能够分为范围提高,预处理和提高解析。这些技术有时可能会增长总体包的大小,同时加快代码的执行速度。
从 Webpack 4 开始,它默认在生产环境下使用做用域提高。它将全部模块提高到单个范围,而不是为每一个模块编写单独的闭包。这样作会减慢构建速度,但会为您提升包的执行速度。在 Webpack 博客上阅读有关做用域提高的更多信息。
将
--display-optimization-bailout
选项传递给 Webpack 以获取与提高结果相关的调试信息。
prepack-webpack-plugin 使用 Prepack,一个JavaScript 局部执行器。它重写了能够在编译时完成的计算,从而加快了代码执行速度。另请参阅 val-loader 和 babel-plugin-preval 以获取其余解决方案。
optimize-js-plugin 经过包装当即执行函数的方式补充了其余解决方案,它加强了 JavaScript 代码最初解析的方式。该插件依赖于 Nolan Lawson 的 optimize-js。
若是您使用 html-loader 处理 HTML 模板,则可使用 posthtml 对模板进行预处理。您还可使用 posthtml-minifier 压缩 HTML。
clean-css-loader 使您可使用流行的 CSS 压缩器 clean-css。
optimize-css-assets-webpack-plugin 是一个基于选项的插件,能够在 CSS 资源上应用选定的压缩器。使用 MiniCssExtractPlugin
可能致使重复的 CSS,由于它只合并文本块。OptimizeCSSAssetsPlugin
经过对生成的结果进行操做来避免这个问题,从而能够产生更好的结果。
在可用的解决方案中,OptimizeCSSAssetsPlugin
最好的选择了。要将其添加到配置中,请先安装它和 cssnano:
与 JavaScript 同样,您能够将该想法包含在部分配置中:
webpack.parts.js
若是您使用 构建分析章节中讨论的
--json
做为 Webpack 输出选项,则须要设置canPrint: false
而后,合并到主配置:
webpack.config.js
若是您如今构建项目(npm run build
),您应该注意到 CSS 已经变得更小,由于注释也被去掉了:
compression-webpack-plugin 容许您将生成压缩文件的问题交给 Webpack 处理,从而可能节省服务器上的处理时间。
咱们可使用 img-loader、imagemin-webpack 和 imagemin-webpack-plugin 来减少图像大小。这些包会在底层使用一些图片优化处理器。
如同在性能章节中讨论的那样使用 cache loader 和 thread-loader 是一个好主意,由于它们具有更多的操做空间。
压缩是您能够采起的最温馨的步骤,以使您的构建更小。回顾一下: