美文网首页
webpack Tree Shaking 功能

webpack Tree Shaking 功能

作者: 弹力盒 | 来源:发表于2021-07-20 10:10 被阅读0次

tree-shaking 只支持 Es Module 这种静态引入的方法,不支持 AMD、CMD 这种动态的引入,即它只支持 import 的形式引入,不支持 require 的形式引入

1、未使用 tree shaking 功能打包时,会将所有引用模块的全部代码引入

  • a、入口文件 main.js
/**
 * 只引入 './assets/js/math' 模块的 add 功能
 */
import { add } from './assets/js/math'
add(5, 6)
  • b、引用模块 math.js
/**
 * 存在两个功能 add、decrease
 */

export const add = (a, b) => {
  console.log(a + b)
  return a + b
}

export const decrease = (a, b) => {
  console.log(a - b)
  return a - b
}
  • c、打包后文件


    image.png

2、tree shaking 的作用

打包项目时,只打包被引用模块的被引用功能代码,而不是全部打包到最终打包文件上,该功能大大减少了最终打包文件的体积,避免了冗余代码的产生

3、使用方法

  • a、当 mode 为 development 时,默认是没有开启 tree-shaking 功能的;mode 为 production 时,会自动开启 tree-shaking 功能,无需额外配置,但是 package.json 文件的配置还是要的
module.exports = {
  mode: 'development',
  devtool: 'cheap-module-eval-source-map'
}

或者

module.exports = {
  mode: 'production',
  /**
   * mode: 'production'时
   * 将devtool配置为不要带有 eval 的,使用 none 也行
   * 才能使打包的冗余代码去除
   */
  devtool: 'cheap-module-source-map'
}
  • b、配置 optimization 配置项
module.exports = {
  optimization: {
    usedExports: true
  }
}
  • c、配置 package.json 文件
{
  /**
   * 该设置是针对于像 @babel/polyfill 等类型的文件做额外处理的
   * 这类文件没有导出任何功能,只是在 window 对象中绑定了一些全局变量
   * 为避免打包时 tree-shaking 会忽略掉这类文件,因此需要该设置
   * sideEffects 为 false 时,表示 tree-shaking 只打包有导出某些功能且被引用的模块
   * css/less/scss 文件一般也是没有导出任何功能的模块文件
   */
  "sideEffects":[
    "@babel/polyfill",
    "*.css",
    "*.less",
    "*.scss"
  ],
}

相关文章

网友评论

      本文标题:webpack Tree Shaking 功能

      本文链接:https://www.haomeiwen.com/subject/xifypltx.html