树摇去除无用代码 1个模块可能有多个方法,只要其中的某个方法被使用到了,则整个文件都会被打到bundle里面去,tree shaking 就是只把用到的方法打入到bundle,没有用到会在uglify阶段擦除掉
使用前提
- 使用es6module
- 生产环境
js使用TreeShaking
步骤
- 开启usedExports
- TerserPlugin擦除
- sideEffects 消除副作用
usedExports
负责给未使用的导出打标机
- 开启usedExports
- TerserPlugin 擦除
- sideEffects消除副作用
usedExports在production阶段是默认打开的,和Terser配合使用
usedExports就是在编译后代码中添加一段注释 unused harmony export mull,告诉Terser在优化时删除这段代码
optmization:{usedExports:true, // 默认值}
TerserPlugin擦除
擦除掉usedExports 打标记的导出
- 开启usedExports
- TerserPlugin 擦除
- sideEffects消除副作用 ```typescript
optmization:{ usedExports:true, // 默认值 minimize: true, minimizer: [ new TerserPlugin({ test: /.js(\?.*)?$/i, }), ], }
<a name="DJyRT"></a>### sideEffects消除副作用> 消除引入文件的副作用- [x] 开启usedExports- [x] TerserPlugin 擦除- [x] sideEffects消除副作用packages.json```typescript"sideEffects":false
webpack.config.js
module:[rules:[{test:/\.css/,.....sideEffects:true // 防止css被擦除}]],optmization:{usedExports:true, // 默认值minimize: true,minimizer: [new TerserPlugin({test: /\.js(\?.*)?$/i,}),],}
css的使用TreeShaking
依赖于purgecss-webpack-plugin
const PurgecssWebpackPlugin =require('purgecss-webpack-plugin ')const glob = require('glob')plugins:[new PurgecssWebpackPlugin({paths:alob.sync(`${ptah.resolve('./src')}/**/*`,{nodir:true }),safelist:function(){return [standard:["body","html"]]}})]
