树摇去除无用代码 1个模块可能有多个方法,只要其中的某个方法被使用到了,则整个文件都会被打到bundle里面去,tree shaking 就是只把用到的方法打入到bundle,没有用到会在uglify阶段擦除掉

使用前提

  1. 使用es6module
  2. 生产环境

js使用TreeShaking

步骤

  1. 开启usedExports
  2. TerserPlugin擦除
  3. sideEffects 消除副作用

usedExports

负责给未使用的导出打标机

  • 开启usedExports
  • TerserPlugin 擦除
  • sideEffects消除副作用

usedExports在production阶段是默认打开的,和Terser配合使用
usedExports就是在编译后代码中添加一段注释 unused harmony export mull,告诉Terser在优化时删除这段代码

  1. optmization:{
  2. usedExports:true, // 默认值
  3. }

TerserPlugin擦除

擦除掉usedExports 打标记的导出

  • 开启usedExports
  • TerserPlugin 擦除
  • sideEffects消除副作用 ```typescript

optmization:{ usedExports:true, // 默认值 minimize: true, minimizer: [ new TerserPlugin({ test: /.js(\?.*)?$/i, }), ], }

  1. <a name="DJyRT"></a>
  2. ### sideEffects消除副作用
  3. > 消除引入文件的副作用
  4. - [x] 开启usedExports
  5. - [x] TerserPlugin 擦除
  6. - [x] sideEffects消除副作用
  7. packages.json
  8. ```typescript
  9. "sideEffects":false

webpack.config.js

  1. module:[
  2. rules:[
  3. {
  4. test:/\.css/,
  5. .....
  6. sideEffects:true // 防止css被擦除
  7. }
  8. ]
  9. ],
  10. optmization:{
  11. usedExports:true, // 默认值
  12. minimize: true,
  13. minimizer: [
  14. new TerserPlugin({
  15. test: /\.js(\?.*)?$/i,
  16. }),
  17. ],
  18. }

css的使用TreeShaking

依赖于purgecss-webpack-plugin

  1. const PurgecssWebpackPlugin =require('purgecss-webpack-plugin ')
  2. const glob = require('glob')
  3. plugins:[
  4. new PurgecssWebpackPlugin({
  5. paths:alob.sync(`${ptah.resolve('./src')}/**/*`,{nodir:true }),
  6. safelist:function(){
  7. return [
  8. standard:["body","html"]
  9. ]
  10. }
  11. })
  12. ]