Webpack第九天

86 阅读2分钟

webpack速度体积分析

初级分析

体积分析

- 内置的stats:构建的统计信息
- 在package.json中添加script,指定 webpack --json > stats.json
- 在webpack函数内部通过参数获得stats
- 构建完成后在控制台输出构建信息

速度分析

- speed-measure-webpack-plugin
- 可以看到构建后的每个loader和plugin的执行耗时

bundle体积分析

- webpack-bundle-analyzer
- 默认在构建完成后开启8888端口展示体积分析图

速度优化

- 使用高版本的Node和webpack
- for of代替foreach,map和set代替object,includes代替indexof

多进程/多实例构建

- 在匹配js文件的最后配置thread-loader
- 会开启多线程来执行js文件的构建,加快构建速度

多进程压缩

- 通过插件 parallel-uglify-plugin,默认并行压缩
- 通过插件 uglifyjs-webpack-plugin,开启parallel参数
- 通过插件 terser-webpack-plugin,开启parallel参数(内置)

预编译资源模块

- 对基础包或者业务基础包进行分包,使其在构建时不会被分析,加快构建速度
- 通过内置的DllPlugin插件进行分包
- 通过DllReferencePlugin引用分包生成的manifestjson文件,来进行组合

缓存

- 利用缓存提升二次构建的速度
- babel-loader开启缓存,设置cacheDirectory=true
- terser-webpack-plugin开启缓存 设置cache:true
- 使用cache-loader或者hard-source-webpack-plugin

构建速度优化

- babel-loader不解析node_modules
- 优化resolve配置
    - modules:指定模块的查找位置,减少搜索的层级
    - alias:配置具名模块的位置
    - extensions:配置解析文件的后缀,webpack默认只支持js,和json后缀。
    - mainFields:指定模块解析时从package.json文件中读取该字段作为入口文件
    

摇树优化(CSS)

- PurifyCSS:遍历代码,识别已用到的CSS,purgecss-webpack-plugin配合mini-css-extract-plugin
- uncss:html需要通过jsdom加载,所有的样式通过postcss解析,通过document.querySelect来识别html文件中不存在的选择器

构建体积优化

- 图片压缩
    - 方法:基于Node的imagemin库或tinypng
    - image-webpack-loader:属于imagemin
    - 原理:将24/32位的文件转换为8位的文件格式

动态polyfill

- 引入polyfill-service CDN,来解决为所有用户引入全部的polyfill文件的问题
- 原理:通过判断用户的user agent来识别浏览器的兼容性,返回对应的polyfill文件

image.png