Tree-shaking的本质

tree-shaking的本质是消除无用的js代码。和传统的dead code elimination(DCE)区别为传统DCE消除不可能执行的代码,tree-shaking更关注消除没有用到的代码。

通过ES Module的特性可以进行静态分析的特点,在编译时进行静态分析导入导出关系,识别出无用代码进行剔除
ES Module特性

  • import只能作为顶层语句出现
  • import的模块名只能是字符串常量
  • import不可变的

webpack中Tree-shaking流程

启动 Tree Shaking 功能必须同时满足三个条件

  • 使用 ESM 规范编写模块代码

  • 配置 optimization.usedExports 为 true,启动标记功能

  • 启动代码优化功能,可以通过如下方式实现:

    • 配置 mode = production
    • 配置 optimization.minimize = true
    • 提供 optimization.minimizer 数组

整体流程

  1. 收集模块导出
    1.1 将模块的所有 ESM 导出语句转换为 Dependency对象,并记录到 module 对象的 dependencies 集合
    1.2 触发finishModules钩子,执行 FlagDependencyExportsPlugin 插件回调。从 entry 开始读取 ModuleGraph 中存储的模块信息,遍历所有 module 对象。遍历 module 对象的 dependencies 数组。将其转换为 ExportInfo 对象并记录到 ModuleGraph 体系中
  2. 标记模块导出
    2.1 出发 optimizeDependencies 钩子,执行 FlagDependencyUsagePlugin 。从 entry 开始逐步遍历 ModuleGraph 存储的所有 module 对象
    2.2 遍历 module 对象对应的 exportInfo 数组
    2.3 exportInfo 对象执行 compilation.getDependencyReferencedExports 方法,确定其对应的 dependency 对象有否被其它模块使用
    2.4 被使用的导出值,调用 exportInfo.setUsedConditionally 方法将其标记为已被使用
    2.5 exportInfo._usedInRuntime 属性,记录该导出被如何使用
  3. 生成代码
    Webpack 根据 ModuleGraph 体系中记录的导出值使用情况生成不同的代码
  4. 删除无用代码
    TerserUglifyJS 等工具“摇”掉这部分无效代码

Rollup中Tree-shaking流程

无需额外配置,只要代码符合ES Module规范,即可实现tree-shaking。

  • 基于ES6模块的静态分析
  • 分析程序流,判断哪些变量被使用、引用

分析程序流
基于作用域,在AST时对韩素或全局对象进行对象记录,然后在形成的整个作用域链对象中进行匹配import的导入并标识起来,最后打包匹配的代码,删除未匹配的

整体流程

从入口文件出发,找出所有读取的变量,找这些变量在哪里定义的,将定义语句包含进来,无关代码抛弃。

副作用以及Babel

一个函数会、或者可能会对函数外部变量产生影响的行为,会产生副作用。
BabelES6/ES7 代码进行转换时,可能会使原本没有副作用的代码,产生副作用,进而无法进行 tree shaking

Tree-shaking相关推荐

  1. Webpack进阶(一) tree shaking与不同mode

    Tree Shaking 生产环境去除没有使用到的内容(开发环境没有删除,会影响调试) 只支持ESM规范(静态引入,编译时引入),不支持CJS(动态引入,执行时引入) // webpack.confi ...

  2. webpack学习(四) -- css tree shaking

    css tree shaking 我们和webpack(三)一样,用案例说话 安装css需要的两个loader,css-loader 和style-loader npm install css-loa ...

  3. demo10 关于JS Tree Shaking

    1.什么是 tree shaking 借助于 es6 (es2015) 模块系统 (import 和 export) 的静态解析,webpack 能够利用 Tree Shaking 进行按需加载,移除 ...

  4. Webpack 实现 Tree shaking 的前世今生

    作者 | 左琳       责编 | 欧阳姝黎 前言 如果看过 rollup 系列的这篇文章 - 无用代码去哪了?项目减重之 rollup 的 Tree-shaking,那你一定对 tree-shak ...

  5. webpack构建中tree shaking、scope Hoisting(面试题)

    一.tree shaking (摇树优化) tree shaking概念: 1个模块可能有多个方法,只要其中某个方法使用了,整个文件会被打到bundle中 tree shaking 只将用到的方法打到 ...

  6. webpack高级应用篇(九):tree shaking(usedExports) 与 sideEffects

    目录 tree shaking(usedExports) tree shaking 前 tree shaking 后 sideEffects(副作用) 解释 tree shaking 和 `sideE ...

  7. Tree Shaking和sideEffects配置

    需要将 mode 配置设置成 development,以确定 bundle 不会被压缩: const path = require('path');module.exports = {entry: ' ...

  8. 【tree shaking】Tree-shaking之副作用

    前言 Tree-shaking,顾名思义"摇树".webpack会在生产环境打包时"摇"掉无用的,死的代码,也就是dead code. 由于Tree-shaki ...

  9. 配置Tree Shaking来减少JavaScript的打包体积

    译者按: 用Tree Shaking技术来减少JavaScript的Payload大小 原文: Reduce JavaScript Payloads with Tree Shaking 译者: Fun ...

  10. Angular 应用里的摇树优化 - tree shaking

    Tree Shakeable Providers and Services in Angular Angular 最近推出了一项新功能,Tree Shakeable Providers. Tree S ...

最新文章

  1. Left 4 Dead升级补丁总汇(3663-3986)
  2. Mongodb和redis书籍调研
  3. 服务器imm口加载硬盘,ibm x3250 M4如何进IMM(远程管理口)
  4. Qt工作笔记-使用QpropertyAnimation实现控件上下滑动的效果
  5. 2019 CCPC 秦皇岛F Forest Program(dfs)
  6. python芙蓉数用abs函数_Python调用OpenCV阈值化
  7. bbs小项目整理(五)(登录模块的完成)
  8. oracle和plsqldev的安装,win7x64下成功安装ORACLE客户端和PLSQLDEV!
  9. PPT如何制作?掌握这几个思维,就可快捷设计制作PPT了
  10. 电脑键盘及excel快捷键
  11. 实用化工计算机模拟-matlab在化学工程中的应用的光盘程序_这150款化工常用软件,你会用多少?...
  12. android虚拟器没有菜单,网易MuMu模拟器不显示Menu(菜单)键的解决办法
  13. 世界上最美的情诗绝句
  14. D435i安装驱动时遇到的configuring Secure Boot问题
  15. php面向对象第一篇
  16. 移动端组件库ThorUI正确引入小程序方式
  17. python人员管理系统_python如何实现大学人员管理系统 python实现大学人员管理系统实例...
  18. 如何构建供应链金融平台?这8大能力不可或缺!
  19. 世道变了,微软连Java都支持了
  20. 齐悟机器人王一_专注智能对话 王一校友当选“2020年度全美十大华人杰出青年”...

热门文章

  1. jquery发送Ajax请求预处理和后置处理
  2. 计算机如果没有什么 就无法启动,电脑开机没有任何反应
  3. 网站托管收费是否有标准
  4. 现代经济感悟(4)-为什么一分钱一分货,两分货却要一块钱
  5. 面试中怎样谈自己的缺点?
  6. 49 把字符串转换成整数
  7. android 代码设置密码,android-如何在MIFARE Ultralight EV1标签上设置和取消设置密码?...
  8. STM32+PN532写UltraLight标签
  9. FILCO蓝牙CSR4.0驱动安装连接(解决蓝牙连接的终极管理方法,速度极快)
  10. 泰山OFFICE技术讲座:标点关系穷举研究-05