本文介绍了几种 webpack 构建体积优化的方式。
图片压缩
在 webpack 中,图片压缩使用的是 image-webpack-loader 。这个 loader 是基于 node 库 imagemin 实现的。
imagemin 能够处理多种图片格式,能够使用第三方优化插件,如 pngquant、tinypng、pngcrush、optiopng 等。
压缩原理
pngquant:通过将 png 图像转换为具有 alpha 通道的8位 png 格式,显著减小文件大小。
tinypng:也是将 png 文件转化为8位 png 图片,同时剥离所有非必要的 metadata 信息。
pngcrush:通过尝试不同的压缩级别和 png 过滤方法来降低 png idat 数据流的大小。
optiopng:类似于 pngcrush,也是将 png 压缩为更小的尺寸。
使用
安装:
1  | npm i image-webpack-plugin -D  | 
使用:
1  | // webpack.config.js  | 
具体参数说明参见 :Options 说明
Tree Shking
Tree Shaking 可以去除代码中无用的 js 代码,具体用法可参考之前的文章
去除无用 CSS
Tree Shaking 可删除的是无用的 js 代码,但是对于 CSS 代码却无能为力。
无用的 CSS 代码,可使用 PurifyCSS 或 uncss 删除。
PurifyCSS 通过遍历代码,识别已经用到的 CSS class,进而删除无用 CSS 代码。
uncss 使用 jsdom 加载 HTML,并使用 PostCSS 加载样式表,然后通过 document.querySelector 识别出在 HTML 中没出现的选择器。
由于 PurifyCSS 不再维护,所以在 webpack 中可以使用插件 purgecss-webpack-plugin 实现删除无用 CSS 代码的目的。
注意: purgecss-webpack-plugin 需要和 mini-css-extract-plugin 一同使用。
安装:
1  | npm i purgecss-webpack-plugin -D  | 
使用:
1  | // webpack.config.js  | 
动态 Polyfill
我们希望浏览器提供一些特性,但是没有,然后我们自己写一段代码来实现他,那这段代码就是 Polyfill。
在 React 中,官方推荐使用 babel-polyfill,但是这个库存在一个问题,就是会把所有的 polyfill 都打包进去,存在体积较大的问题。
Polyfill.io 提供了动态 polyfill 的功能,它会根据浏览器的UA不同,返回不一样的 polyfill,达到一个按需加载的作用。
使用方法也很简单,在 html 文件中引入即可:
1  | <script src="https://polyfill.io/v3/polyfill.min.js"></script>  | 
polyfill.io 可以附加查询参数来定制 polyfill,具体可参照官方文档。