摇树优化(Tree Shaking)

本文详细介绍了摇树优化(TreeShaking)的概念、在大型项目中如何通过Webpack配置实现Vue2的优化,以及如何处理副作用以提高编译效率。通过实际案例展示了开发环境和生产环境下的打包效果,强调了使用ESM和正确设置sideEffects的重要性。
摘要由CSDN通过智能技术生成

1. 摇树优化简介

1.1 摇树优化的应用场景

  • 在大型项目中,多需求,多产品,多开发的背景下版本不断迭代,项目里会出现很多已被重构废弃掉的页面,会出现已经删除未使用的方法,会有很多已经删除了HTML结构但是未删除对应的CSS样式,这样在编译的时候,速度非常慢,打包后的体积也很大,浏览器将花费更多的时间去下载、解压、转码和执行他们。
  • 因为这些代码存在历史悠久,直接废弃又无法完全保证功能不被影响,测试可能有无法涵盖的场景,容易产生一系列的问题。所以,我们可以采用摇树优化Tree Shaking

1.2 什么是摇树优化

  • 摇树优化(Tree Shaking)是一种用来优化代码体积的技术,它能在构建过程中剔除无用的代码,从而减少最终生成的文件的大小。摇树优化的原理是基于静态代码分析,通过识别和删除未被使用的代码,从而实现代码精简和优化。
  • 在前端的性能优化中,ES6推出了Tree Shaking机制,当我们在项目中引入其他模块时,会自动将我们用不到的代码,或者永远不会执行的代码摇掉,在Uglify阶段查出,不打包到bundle中。

1.3 摇树优化注意事项

  • Tree Shaking只支持ESM的引入方式,不支持CommonJS引入方式
    • ESM: export + import
    • CommonJS: module.exports + require
  • 如果想要做到Tree Shaking,在引入模块时就应该避免将内容全部引入,应该局部按需引入才会触发Tree Shaking机制。

2. 摇树优化应用

Vue 2中通过webpack配置摇树优化。

2.1 package.json配置打包指令

开发环境和生产环境
在这里插入图片描述

2.2 vue.config.js中进行webpack配置

dev环境需要配置usedExports
production环境默认开启
在这里插入图片描述

2.3 定义三种类型的方法

  • func.js 定义函数
// 引用并被调用的方法
export function quoteAndUse() {
  console.log('这是use专属的方法,别人都')
  return
  console.log('这是use中return后面的')
}
// 引用但是未被调用的方法
export function quoteButNotUse() {
  console.log('这是quoteButNotUse方法')
}
// 未被引用的方法
export function notQuote() {
  console.log('这是未被引用的方法')
}

  • 在页面中不同场景进行使用
    • notQuote 未被引用的方法
    • quoteButNotUse 引用但是未被调用的方法
    • quoteAndUse 引用切已被调用的方法
import { quoteButNotUse, quoteAndUse } from './func'

testUse() {
  quoteAndUse()
}

2.4 不同环境打包

  • dev环境打包 yarn build:dev
    在这里插入图片描述

打包结果发现,所有的代码都被打包了,三种方法均存在,但是下面两个未被引用或使用的方法被标注了unused harmony export

  • prod环境打包 yarn build
    在这里插入图片描述

打包结果发现,

  • 无法到达的代码(例如 return后面的代码)
  • 引用未被使用的方法
  • 未被引用的方法
  • 注释信息

都不会被打包到bundle.js中

3. 摇树优化副作用

sideEffects 指的是有副作用的代码,假如模块A中包含一些影响全局作用域(非模块作用域)的代码,如果改变了全局的变量或对象的变量,模块B引入了模块A,但并未使用。在这种情况下,模块A就被认为是有副作用的,webpack是不会删除模块A中所有未使用的代码的,它还会保留模块A中立即执行并对全局环境有影响的代码。

  • 新建about.js文件: 编写about方法,挂载到全局,在main.js中引入,但未真正调用
    在这里插入图片描述
    在这里插入图片描述

  • 打包后:我们会发现about会被打包在bundle.js 中
    在这里插入图片描述

  • 如果我们知道所有模块都是没有副作用的(此处我的理解是: 如果没有引用就表示没有使用,称为没有副作用),不想让webpack打包他们,那么可以在webpack配置中奖package.json的sideEffects设为false,这样可以提高删除未使用代码的编译速度。
    在这里插入图片描述

  • 配置完该属性后,再次打包,我们会发现about方法没有被打包在bundle.js中了
    在这里插入图片描述

  • 请注意: 任何导入的文件都会收到树抖动的影响。如果css-loader在项目中使用类似的东西并导入css文件,则需要将其添加到副作用列表中,这样它就不会在生产模式下无意中被删除

  • 如果有某些模块是有副作用的,那么可以将它的路径加入package.json的sideEffects数组选项中,这样也能提高删除未使用代码的速度

  • 通过以上描述,我们可以把样式文件和我们最开始的about文件添加在副作用数组中

    {
      "name": "your-project",
       "sideEffects": ["about.js", "*.css"],
    }
    

使用示例对比:

  • 新建index.css文件,用于编写样式
    在这里插入图片描述

  • 在main.js中进行引入
    在这里插入图片描述

  • 此时,

    • 如果我们在package.json中设置 sideEffects: false 表示,所有内容都没有副作用,那么结果是样式不生效,打包后也没有about方法。
    • 如果我们在package.json中设置 sideEffects: [“about.js”, “*.css”],表示,这两个内容是有副作用的,可能没有引入,但是全局自动生效,那么样式生效,打包后有about方法

4. 摇树优化性能优化

最后,我们通过打包后文件大小来直观的体验一下摇树优化带来的性能优化。
在这里插入图片描述

  • 此时我们打包后bundle.js打包体积为57kb
  • 在开发环境配置摇树优化之后进行打包,打包后的体积开始57kb. 在开发环境进行摇树优化打包,bundle.js的体积不会变小,原因是他只是标记未使用的代码,但并不会真正的清除他们。
  • 在生产环境打包(默认会开启摇树优化),bundle.js的体积15kb

一个简单的demo从57kb减小到了15kb。

总结

为了利用tree shaking的优势,必须满足一下几点:

  • 使用ESM方式对模块进入操作 import / export
  • 确保没有编译器将ESM语法转换成CommonJS语法(这是流行的Babel预设 @babel/preset-env的默认行为)
  • 将sideEffects属性根据需求应用到package.json中

文章学习参考来源

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Webpack树摇是一种优化技术,它可以通过静态分析代码,识别出哪些代码没有被使用,然后将这些代码从最终的打包文件中删除,从而减小打包文件的体积。这种技术可以帮助开发者减少不必要的代码,提高应用程序的性能和加载速度。 ### 回答2: Webpack tree-shaking是指,使用webpack构建工具进行打包时,通过静态分析的方式,去除代码中没有用到的部分,以减小打包后的文件体积。它是针对ES6模块化语法设计的一种解决方案。 在ES6模块化语法中,模块一般是通过export关键字导出需要暴露的部分,通过import关键字引入需要使用的模块。我们常常会引入一个模块只为了使用它的某一个方法或变量,而在打包时,经常会将整个模块一起打包,导致最终打包后的文件过大。这时候,就需要tree-shaking来解决这个问题。tree-shaking会以导入模块为节点,分析出所有代码的关系,去除没有被使用到的部分。 具体的实现方式是,通过静态分析模块之间的依赖关系,找出所有的“无用代码”。在只要有一个代码块被使用,就可以排除它里面的所有没有用到的代码。最终,webpack会将剩余的有用代码打包到一个文件中,以提高打包的效率。 使用tree-shaking的好处是,可以减小打包后的文件体积,提高应用的加载速度和性能。但是,它也需要开发者自己注意代码的编写。因为只有静态分析发现没被使用的代码才能被排除,因此在编写代码时,需要让webpack能够分析出代码的具体使用情况,避免没有用到的代码被打包进去。 ### 回答3: Webpack Tree Shaking是一种优化技术,旨在减少前端网页或应用程序的体积和加载时间,这是特别适用于大型或复杂的项目或库。它是基于ES6模块系统的静态分析。静态分析是指在编译时(非运行时)进行分析,检查哪些函数、变量和代码路径实际上被使用了。然后用这些信息去优化我们要生成的代码,去除掉那些没有用过的代码,实现额外的减小文件体积的优化效果。 Webpack会自动创建依赖关系树,称为Module graph,用于确定每个模块的依赖,并创建与之相关的Chunk。树摇是在WebPack将库包装为模块和依赖关系树之后的下一步优化。它的作用是通过分析代码到汇编语言的转换过程(或更正式的称呼静态分析),以识别那些未使用的代码,并将其从最终构建中移除掉。举个例子,如果我们引入了一个JS库,但我们的代码仅使用了其中的一小部分函数,例如:一个仅仅用到math库中的pow函数。通过tree-shaking,只有Math.pow的函数在最终构建文件中会被包含,而没有被使用到的函数则被移除,如sqrt、log等等,这样就可以使最终构建包变得更小,提高项目的加载性能。 但是,我们需要知道一些前提和限制。Tree shaking 只能消除那些明确定义但未被引用的代码。对于动态引用的情况,如通过require(“path”+ variable + name)来引用模块等,Tree shaking可能会失效。另外,一些函数和语法结构比如eval()调用,这些都可能会让Tree shaking失效。 总之,webpack tree-shaking是目前优化JS代码体积的非常有效的方法之一,可以帮助我们有效地减少构建后的代码量和提高前端性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值