首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ESM树摇动/死代码消除是如何工作的?

ESM树摇动(ESM Tree Shaking)是一种优化技术,用于减少 JavaScript 模块中未使用的代码的体积,从而提高应用程序的性能和加载速度。它是在构建过程中通过静态分析来确定哪些代码是不会被执行的,然后将这些未使用的代码从最终的构建结果中删除。

ESM(ECMAScript Modules)是 JavaScript 的一种模块化规范,它允许开发者将代码分割成多个模块,以便更好地组织和管理代码。然而,有时候模块中可能包含一些未被使用的代码,这些代码被称为死代码(Dead Code)。死代码消除(Dead Code Elimination)是指在构建过程中自动检测和删除这些未使用的代码。

ESM树摇动的工作原理如下:

  1. 静态分析:构建工具会对模块进行静态分析,识别出模块中的导入和导出语句,以及模块内部的函数和变量定义。
  2. 依赖关系分析:构建工具会分析模块之间的依赖关系,确定哪些模块被其他模块导入和使用。
  3. 标记未使用代码:根据依赖关系分析的结果,构建工具会标记出哪些代码是未被使用的,即死代码。
  4. 删除未使用代码:构建工具会将标记的死代码从最终的构建结果中删除,以减少代码体积。

ESM树摇动的优势在于:

  1. 减少代码体积:通过删除未使用的代码,可以显著减小应用程序的体积,提高加载速度。
  2. 提高性能:减少代码量可以减少解析和执行时间,从而提高应用程序的性能。
  3. 简化维护:通过模块化的方式组织代码,可以使代码更易于理解、测试和维护。

ESM树摇动的应用场景包括但不限于:

  1. Web 应用程序:对于使用模块化开发的 Web 应用程序,ESM树摇动可以帮助减少不必要的代码,提高应用程序的性能和加载速度。
  2. JavaScript 库和框架:对于开发和维护 JavaScript 库和框架的开发者来说,ESM树摇动可以帮助减少库的体积,提供更轻量级的解决方案。

腾讯云提供的相关产品和服务中,与ESM树摇动相关的是腾讯云的前端构建工具 TCB(Tencent Cloud Base),它提供了一套完整的前端开发工具链,包括构建、部署、测试等功能。TCB支持ESM树摇动技术,可以帮助开发者在构建过程中自动进行死代码消除,从而优化前端应用程序的性能和体积。

更多关于腾讯云 TCB 的信息,请访问:TCB产品介绍

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

决策如何工作

http://dataaspirant.com/2017/01/30/how-decision-tree-algorithm-works/(点击文末阅读原文前往) 人工智能时代悄然而至,你可以继续安心地敲着代码...我们知道如何使用模型决策来预测目标类别或数值,现在让我们了解如何创建决策模型。 创建决策假设 下面我们使用决策时所做一些假设: 一开始,整个训练集被视为根节点。 特征值更倾向于分类。...如果这些值连续,那么在构建模型之前,它们将被离散化。 记录根据属性值递归分布。 将属性作为根或内部节点顺序通过使用统计方法完成。 ?...决策遵循Sum of Product(SOP)表述形式。对于上面的图片,你可以看到我们如何通过从根节点到叶节点遍历预测我们是否接受新工作机会或者是否每天使用电脑。...值会被排序,并且按照顺序将属性放置在中,即大数值属性(在信息增益情况下)被放置在根位置。 当信息增益作为标准时,我们假设属性分类,对于基尼系数,则假设属性连续

1.3K100

直播代码如何工作,不同服务器之间区别

pexels-photo-2349209.jpeg 一、物理服务器 直播代码物理服务器又分为VPS和独立服务器。 1、VPS VPS将一台服务器分割成多个虚拟专享服务器优质服务。...2、独立服务器 直播代码独立服务器,整体硬件都是独立,单独一台服务器。 二、云服务器 直播代码云服务器一种简单高效、安全可靠、处理能力可弹性伸缩计算服务。...2.jpeg 三、CND 直播代码CDN一个代理服务器,相当于一个中介。...CDN构建在网络之上内容分发网络,依靠部署在各地边缘服务器,通过中心平台负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率,,CDN关键技术主要有内容存储和分发技术...四、分布式部署 直播代码分布式部署将数据分散存储于多台独立机器设备上,采用可扩展系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,不但解决了传统集中式存储系统中单存储服务器瓶颈问题

1.2K20

可否举例说明你在工作如何优化前端代码

原则 首先说一个最重要优化原则:代码优化每天都要进行,而不是一两个月做一次大优化,那时做就已经晚了。另外由于优化每天做,所以你不需要一次就过度优化,保持小步快跑即可。 这个原则为什么重要?...这个项目从别人手里接下代码真烂,要怪就怪之前的人,不是我错,我胡乱加一些代码就行了,能用就行。...第一步:不要写烂代码 方方你傻了吗,问如何优化代码」,你答案居然「不要写烂代码」?!...没错,把代码写好第一步就是不要写烂代码,也就是你要知道「什么样代码代码」: 如何写出无法维护代码 - 酷 壳 - CoolShell​ coolshell.cn/articles...而且他们还不知道自己代码多烂! 所以第一步就是明白一个真相:你80%代码都是烂代码。 你只需要把这些代码改得不那么烂,就是优秀代码了…… 再说一次:第一步至关重要,搞清楚什么样代码代码

45410

深入了解rollup(二)常用配置

引言--Rollup一个JavaScript模块打包器,它可以将多个模块打包成一个单独文件,以便在浏览器中使用。与其他打包工具相比,Rollup主要优势在于它可以生成更小、更快代码。...// ...}5. treeshake:指定是否开启摇优化,即只打包使用到代码。...以上rollup多入口示例,可以根据实际需求进行配置。动态导入与默认代码分割以下rollup动态导入与默认代码分割示例:动态导入示例:// main.jsimport('....如果你确实想在打包后代码中包含这个模块,需要告诉 Rollup 如何找到它。.../', format: 'esm', }, plugins: [nodeResolve()] // external: ['lodash-es'], // 消除警告}现在,再次进行打包,无论打包时间

58840

【模块化】:Webpack 如何将不同规范(ESM、CJS、UMD、AMD、CMD)模块化代码打包到一起并协调它们运行

不需要针对这些库自身模块化规范 调整我们程序 原因 Webpack、Rollup、Vite 这类工具 把模块化规范间转换(兼容)工作 在暗地里偷偷干了 2....观察 Webpack 如何将这些不同模块化规范代码打包到一起和协调它们运行。 执行 webpack 打包命令: webpack build 观察 webpack 打包输出: 3.3....打包产物 bundle.js(入口文件) 分析 Webpack 打包过程,除了需要将开发者写业务代码打包外,还需要把一些用于支撑、调度这些业务代码运行辅助代码(这类代码在 webpack 中叫做...以建筑作类比的话,业务代码相当于砖瓦水泥,看得见摸得着能直接感知逻辑;运行时(runtime)相当于掩埋在砖瓦之下钢筋地基,通常不会关注但决定了整座建筑功能、质量。...异步模块被下载后如何与 __webpack_modules__、installedChunks 联动呢?

6.3K31

JavaScript如何工作:深入V8引擎&编写优化代码5个技巧

内联代码 第一个优化提前内联尽可能多代码。内联用被调用函数主体替换调用点(调用函数代码行)过程。这个简单步骤允许下面的优化更有意义。 ?...由于使用字典查找内存中对象属性位置效率非常低,因此 V8 使用了不同方法:隐藏类。隐藏类与 Java 等语言中使用固定对象(类)工作方式类似,只是它们在运行时创建。...接下来将讨论内联缓存一般概念(如果您没有时间通过上面的深入了解)。 那么它是如何工作呢? V8 维护了在最近方法调用中作为参数传递对象类型缓存,并使用这些信息预测将来作为参数传递对象类型。...如果 V8 能够很好地预测传递给方法对象类型,它就可以绕过如何访问对象属性过程,而是使用从以前查找到对象隐藏类存储信息。 那么隐藏类和内联缓存概念如何相关呢?...如何编写优化 JavaScript 对象属性顺序:始终以相同顺序实例化对象属性,以便可以共享隐藏类和随后优化代码

1.6K20

webpack4.0正式版重大更新与特性详细清单

代码已升级到更高版本ecmascript。...开发模式默认打开) 不再需要使用这些插件: CommonsChunkPlugin移除 - > optimization.splitChunks,optimization.runtimeChunk JSON 导出时消除未使用...javascript/auto相比,javascript/esm更严格地处理ESM: 在.mjs模块默认为javascript/esm WebAssembly模块 优化 之前:Uglify删除了码 现在...:webpack删除码(在某些情况下) 这可以防止import()处理分支时发生崩溃 package.json中sideEffects还支持glob表达式和glob表达式数组 side.Effects...脚本标签不再text/javascript 和 async,因为这是默认值(保存几个字节) 串联模块现在生成更少代码 常量替换现在不需要__webpack_require__,参数被忽略 默认 webpack

2K30

Rspack 作者揭秘,你 Tree Shaking 真的起作用了吗?

Tree Shaking 定义如下: “Tree Shaking JavaScript 中用于消除代码一个常用术语。...DCE (代码消除) 优化:通常由常规代码压缩工具来实现,用于移除无用代码,但类似的功能也可通过 Webpack ConstPlugin 等工具实现。...针对这种情况,Webpack 提供了两个进行代码消除(DCE)机会: 在解析阶段,通过 ConstPlugin 执行基本代码消除,这有助于尽可能多地了解导入与导出变量使用情况,从而优化后续...在 processAssets 阶段,通过 Terser minify 实施更复杂代码消除,主要目的减少代码体积。...ConstPlugin 来执行代码消除,它成功地移除了变量 b,但由于 ConstPlugin 处理能力有限,它未能移除变量 c。

15110

52. 精读《图解 ES 模块》

浏览器已经支持了 ESM,并且 Node 也在添加支持。 ES 模块化工作机制 模块化开发会将依赖构建为树形结构。通过 import 语句通知浏览器或者 Node 去加载相关代码。...但是接下来要如何找到模块直接依赖文件呢? 这就是 import 语句出场时候了,它可以通知加载器去哪里找到其他模块。...就像初始化一样,这也是一个深度优先后序遍历。 再说一下循环依赖情况,需要遍历。通常是一个很长循环。但是为了解释这个问题,我们做一个简短例子。 我们先看一下 CJS 如何工作。...目前 CJS 还无法兼容新 ESM,不过 Node 工作组也正在这方面努力尝试中。而这两个模块系统最大区别就是运行时。CJS 一个动态模块系统,而 ESM 只是静态模块系统。...期待 Node 工作组实现对 ESM 早日支持。

61830

聊一聊面试中经常被问到Tree Shaking

原理 ESM import 只能作为模块顶层语句出现 import 模块名只能字符串常量 import binding immutable 这就是区别于CMJ,ESM 独有的静态分析特性...等等,那什么静态分析呢,就是不执行代码。CMJ 中 require,只有执行以后才知道引用是什么模块。 保证了依赖关系确定,和运行时状态无关,可以进行可靠静态分析。...代码执行结果不会被用到 代码只会影响变量(只写不读) // 导入并赋值给 JavaScript 对象,但在接下来代码里没有用到 // 这就会被当做“代码,会被 tree-shaking import...Webpack 只有在压缩代码时候会 tree-shaking, 通常就指生产环境 代码 module 引入必须 import 引入方式,也就意味着被转换成 ES5 代码无法支持 tree-shaking...tree-shaking/ 官方DEMO:https://github.com/webpack/webpack/tree/master/examples/side-effects webpack 新插件系统如何工作

2K10

深入了解rollup(一)快速开始

在本文中,我们将深入了解Rollup工作原理、使用方法、摇优化(tree shaking)。...Rollup工作原理与其他打包工具类似,但它Tree Shaking技术使得生成代码更小、更高效。...所以摇优化一般建立在ES6 模块化语法基础之上ESM导入导出静态。CommonJS 模块导入和导出动态,无法在编译阶段静态确定代码使用情况。...摇优化原理:Tree Shaking一种用于消除未使用代码优化技术,它在打包过程中只保留被实际使用代码,从而减少最终生成文件大小。Tree Shaking原理可以分为以下几个步骤:1....这种静态分析在编译时进行,因此可以在打包过程中进行优化,而不需要运行时额外开销。需要注意,Tree Shaking只能消除那些在编译时可以确定未使用代码

27240

Vite 和Webpack 核心对比?

转换代码,编译代码,输出代码 4.最终形成打包后代码  2. ...webpack打包原理 1.先逐级递归识别依赖,构建依赖图谱 2.将代码转化成AST抽象语法 3.在AST阶段中去处理代码 4.把AST抽象语法变成浏览器可以识别的代码, 然后输出 重点: 这里需要递归识别依赖...(例如基于路由拆分代码模块)。 Vite 以 原生 ESM 方式服务源码。这实际上让浏览器接管了打包程序部分工作:Vite 只需要在浏览器请求源码时进行转换并按需提供源码。...根据情景动态导入代码,即只在当前屏幕上实际使用时才会被处理。 2. 使用node.js去实现 图片 2.2  vite改进 Vite 将会使用 esbuild 预构建依赖。...这大大改进了开发体验 – 然而,在实践中我们发现,即使 HMR 更新速度也会随着应用规模增长而显著下降。 3.3  vite改进 在 Vite 中,HMR 在原生 ESM 上执行

77010

代码体积减少80%!Taro H5转换与优化升级

很简单,作为使用者,你不需要做任何代码改动,只需要将 Taro 更新到最新版本即可。但在看不见地方,Taro 却默默地做了许多工作。下面会从原理出发,详细介绍 Taro 工作。...原理 码删除(Dead code elimination)一种代码优化技术,可以删除对应用程序执行结果没有影响代码。...Web Fundamentals 一篇文章有提到,treeshaking 由 Rollup 提出一种码删除形式。...treeshaking 把代码想象成一棵代码每个依赖项看作树上节点。将未使用过依赖项从构建结果中移除,这就是 treeshaking 基本思想。...事实上,@tarojs/components 源码本身使用 ESM 规范: ?

3K10

前端打包工具Esbuild--模块化、ESM、esbuild-loader、

本文重点要讲述 esbuild,但在讲述之前,不得不提及ESM、Babel 和 Webpack中几个相关联重要知识 。 ESM Snowpack 首次提出利用浏览器原生 ESM 能力工具。...浏览器接管了打包程序部分工作:Vite 只需要在浏览器请求源码时进行转换并按需提供源码。根据情景动态导入代码,即只在当前屏幕上实际使用时才会被处理。...因此,引出了使用 ESM 最核心两个特点: 1、构建复杂度非常低,修改任何组件都只需做单文件编译(不需要重新构建和重新打包应用程序整个bundle),时间复杂度永远 O(1) 2、借助 ESM...重点介绍工作过程: 「Parse(解析)」:将源代码转换成更加抽象表示方法(如抽象语法) 「Transform(转换)」:对(抽象语法)做一些特殊处理,让它符合编译器期望 「Generate(代码生成...)」:将第二步经过转换过(抽象语法)生成新代码 webpack Webpack 构建流程简单来说就是递归编译每一个模块文件,对于不同类型文件使用不同 webpack loader 进行处理。

3.8K31

Rollup打包基本概念及使用--vite

所谓 Tree Shaking(摇),也是计算机编译原理中DCE(Dead Code Elimination,即消除无用代码) 技术一种实现。由于 ES 模块依赖关系确定,和运行时状态无关。...那么,同一份入口文件,如何让 Rollup 给我们打包出不一样格式产物呢?...虽然 Rollup 能够打包输出出 CommonJS 格式产物,但对于输入给 Rollup 代码并不支持 CommonJS,仅仅支持 ESM。...你可能会说,那我们直接在项目中统一使用 ESM 规范就可以了啊,这有什么问题呢?需要注意,我们不光要考虑项目本身代码,还要考虑第三方依赖。...JavaScript API 我们可以很方便地在代码中调用 Rollup 打包流程,相比于配置文件有了更多操作空间,你可以在代码中通过这些 API 对 Rollup 打包过程进行定制,甚至二次开发

48330

Rollup 基本概念及使用

接下来,我们将围绕Rollup基本概念和核心特性展开,学习完本小节内容,你不仅能知道Rollup如何打包项目的,还能学会Rollup更高阶使用方式,甚至能够通过JavaScriptAPI二次开发Rollup...所谓 Tree Shaking(摇),也是计算机编译原理中DCE(Dead Code Elimination,即消除无用代码) 技术一种实现。由于 ES 模块依赖关系确定,和运行时状态无关。...虽然Rollup能够打包输出出CommonJS格式产物,但对于输入给Rollup代码并不支持CommonJS,仅仅支持ESM。...你可能会说,那我们直接在项目中统一使用ESM规范就可以了啊,这有什么问题呢?需要注意,我们不光要考虑项目本身代码,还要考虑第三方依赖。...JavaScript API 我们可以很方便地在代码中调用 Rollup 打包流程,相比于配置文件有了更多操作空间,你可以在代码中通过这些 API 对 Rollup 打包过程进行定制,甚至二次开发

90962

vite 相比webpack优缺点。

转换代码,编译代码,输出代码 4.最终形成打包后代码 webpack打包原理 1.先逐级递归识别依赖,构建依赖图谱 2.将代码转化成AST抽象语法 3.在AST阶段中去处理代码 4.把AST抽象语法变成浏览器可以识别的代码...(例如基于路由拆分代码模块)。Vite 以 原生 ESM 方式服务源码。这实际上让浏览器接管了打包程序部分工作:Vite 只需要在浏览器请求源码时进行转换并按需提供源码。...根据情景动态导入代码,即只在当前屏幕上实际使用时才会被处理。 webpack缺点2.使用node.js去实现 vite改进 Vite 将会使用 esbuild 预构建依赖。...这样代价很高,并且重新加载页面会消除应用的当前状态,所以打包器支持了动态模块热重载(HMR):允许一个模块 “热替换” 它自己,而对页面其余部分没有影响。...这大大改进了开发体验 - 然而,在实践中我们发现,即使 HMR 更新速度也会随着应用规模增长而显著下降。 vite改进 在 Vite 中,HMR 在原生 ESM 上执行

1.5K30

Vite和Webpack核心差异

转换代码,编译代码,输出代码 4.最终形成打包后代码 webpack打包原理 1.先逐级递归识别依赖,构建依赖图谱 2.将代码转化成AST抽象语法 3.在AST阶段中去处理代码 4.把AST抽象语法变成浏览器可以识别的代码...(例如基于路由拆分代码模块)。 Vite 以 原生 ESM 方式服务源码。这实际上让浏览器接管了打包程序部分工作:Vite 只需要在浏览器请求源码时进行转换并按需提供源码。...根据情景动态导入代码,即只在当前屏幕上实际使用时才会被处理。 webpack缺点2.使用node.js去实现 ? vite改进 Vite 将会使用 esbuild 预构建依赖。...这样代价很高,并且重新加载页面会消除应用的当前状态,所以打包器支持了动态模块热重载(HMR):允许一个模块 “热替换” 它自己,而对页面其余部分没有影响。...这大大改进了开发体验 - 然而,在实践中我们发现,即使 HMR 更新速度也会随着应用规模增长而显著下降。 vite改进 在 Vite 中,HMR 在原生 ESM 上执行

4.3K30

前端为什么选 Vite?

同时,并不是所有的源码都需要同时被加载(例如基于路由拆分代码模块)。 Vite 以 原生 ESM 方式提供源码。...这实际上让浏览器接管了打包程序部分工作:Vite 只需要在浏览器请求源码时进行转换并按需提供源码。根据情景动态导入代码,即只在当前屏幕上实际使用时才会被处理。...这大大改进了开发体验 —— 然而,在实践中我们发现,即使采用了 HMR 模式,其热更新速度也会随着应用规模增长而显著下降。 在 Vite 中,HMR 在原生 ESM 上执行。...当编辑一个文件时,Vite 只需要精确地使已编辑模块与其最近 HMR 边界之间链失活[1](大多数时候只是模块本身),使得无论应用大小如何,HMR 始终能保持快速更新。...虽然 esbuild 快得惊人,并且已经一个在构建库方面比较出色工具,但一些针对构建 应用 重要功能仍然还在持续开发中 —— 特别是代码分割和 CSS 处理方面。

75320
领券