Tree-shaking
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 将模块的所有 ESM 导出语句转换为Dependency
对象,并记录到module
对象的dependencies
集合
1.2 触发finishModules
钩子,执行FlagDependencyExportsPlugin
插件回调。从entry
开始读取ModuleGraph
中存储的模块信息,遍历所有module
对象。遍历module
对象的dependencies
数组。将其转换为ExportInfo
对象并记录到ModuleGraph
体系中 - 标记模块导出
2.1 出发optimizeDependencies
钩子,执行FlagDependencyUsagePlugin
。从entry
开始逐步遍历ModuleGraph
存储的所有module
对象
2.2 遍历module
对象对应的exportInfo
数组
2.3exportInfo
对象执行compilation.getDependencyReferencedExports
方法,确定其对应的dependency
对象有否被其它模块使用
2.4 被使用的导出值,调用exportInfo.setUsedConditionally
方法将其标记为已被使用
2.5exportInfo._usedInRuntime
属性,记录该导出被如何使用 - 生成代码
Webpack
根据ModuleGraph
体系中记录的导出值使用情况生成不同的代码 - 删除无用代码
由Terser
、UglifyJS
等工具“摇”掉这部分无效代码
Rollup中Tree-shaking流程
无需额外配置,只要代码符合ES Module
规范,即可实现tree-shaking。
- 基于ES6模块的静态分析
- 分析程序流,判断哪些变量被使用、引用
分析程序流
基于作用域,在AST时对韩素或全局对象进行对象记录,然后在形成的整个作用域链对象中进行匹配import的导入并标识起来,最后打包匹配的代码,删除未匹配的
整体流程
从入口文件出发,找出所有读取的变量,找这些变量在哪里定义的,将定义语句包含进来,无关代码抛弃。
副作用以及Babel
一个函数会、或者可能会对函数外部变量产生影响的行为,会产生副作用。
Babel
将 ES6/ES7
代码进行转换时,可能会使原本没有副作用的代码,产生副作用,进而无法进行 tree shaking
。
Tree-shaking相关推荐
- Webpack进阶(一) tree shaking与不同mode
Tree Shaking 生产环境去除没有使用到的内容(开发环境没有删除,会影响调试) 只支持ESM规范(静态引入,编译时引入),不支持CJS(动态引入,执行时引入) // webpack.confi ...
- webpack学习(四) -- css tree shaking
css tree shaking 我们和webpack(三)一样,用案例说话 安装css需要的两个loader,css-loader 和style-loader npm install css-loa ...
- demo10 关于JS Tree Shaking
1.什么是 tree shaking 借助于 es6 (es2015) 模块系统 (import 和 export) 的静态解析,webpack 能够利用 Tree Shaking 进行按需加载,移除 ...
- Webpack 实现 Tree shaking 的前世今生
作者 | 左琳 责编 | 欧阳姝黎 前言 如果看过 rollup 系列的这篇文章 - 无用代码去哪了?项目减重之 rollup 的 Tree-shaking,那你一定对 tree-shak ...
- webpack构建中tree shaking、scope Hoisting(面试题)
一.tree shaking (摇树优化) tree shaking概念: 1个模块可能有多个方法,只要其中某个方法使用了,整个文件会被打到bundle中 tree shaking 只将用到的方法打到 ...
- webpack高级应用篇(九):tree shaking(usedExports) 与 sideEffects
目录 tree shaking(usedExports) tree shaking 前 tree shaking 后 sideEffects(副作用) 解释 tree shaking 和 `sideE ...
- Tree Shaking和sideEffects配置
需要将 mode 配置设置成 development,以确定 bundle 不会被压缩: const path = require('path');module.exports = {entry: ' ...
- 【tree shaking】Tree-shaking之副作用
前言 Tree-shaking,顾名思义"摇树".webpack会在生产环境打包时"摇"掉无用的,死的代码,也就是dead code. 由于Tree-shaki ...
- 配置Tree Shaking来减少JavaScript的打包体积
译者按: 用Tree Shaking技术来减少JavaScript的Payload大小 原文: Reduce JavaScript Payloads with Tree Shaking 译者: Fun ...
- Angular 应用里的摇树优化 - tree shaking
Tree Shakeable Providers and Services in Angular Angular 最近推出了一项新功能,Tree Shakeable Providers. Tree S ...
最新文章
- Left 4 Dead升级补丁总汇(3663-3986)
- Mongodb和redis书籍调研
- 服务器imm口加载硬盘,ibm x3250 M4如何进IMM(远程管理口)
- Qt工作笔记-使用QpropertyAnimation实现控件上下滑动的效果
- 2019 CCPC 秦皇岛F Forest Program(dfs)
- python芙蓉数用abs函数_Python调用OpenCV阈值化
- bbs小项目整理(五)(登录模块的完成)
- oracle和plsqldev的安装,win7x64下成功安装ORACLE客户端和PLSQLDEV!
- PPT如何制作?掌握这几个思维,就可快捷设计制作PPT了
- 电脑键盘及excel快捷键
- 实用化工计算机模拟-matlab在化学工程中的应用的光盘程序_这150款化工常用软件,你会用多少?...
- android虚拟器没有菜单,网易MuMu模拟器不显示Menu(菜单)键的解决办法
- 世界上最美的情诗绝句
- D435i安装驱动时遇到的configuring Secure Boot问题
- php面向对象第一篇
- 移动端组件库ThorUI正确引入小程序方式
- python人员管理系统_python如何实现大学人员管理系统 python实现大学人员管理系统实例...
- 如何构建供应链金融平台?这8大能力不可或缺!
- 世道变了,微软连Java都支持了
- 齐悟机器人王一_专注智能对话 王一校友当选“2020年度全美十大华人杰出青年”...
热门文章
- jquery发送Ajax请求预处理和后置处理
- 计算机如果没有什么 就无法启动,电脑开机没有任何反应
- 网站托管收费是否有标准
- 现代经济感悟(4)-为什么一分钱一分货,两分货却要一块钱
- 面试中怎样谈自己的缺点?
- 49 把字符串转换成整数
- android 代码设置密码,android-如何在MIFARE Ultralight EV1标签上设置和取消设置密码?...
- STM32+PN532写UltraLight标签
- FILCO蓝牙CSR4.0驱动安装连接(解决蓝牙连接的终极管理方法,速度极快)
- 泰山OFFICE技术讲座:标点关系穷举研究-05