当前位置: 首页 > news >正文

Tree-shaking【前端优化】

目录

  • 什么是 Tree-shaking?
  • Tree-shaking 有什么作用?
  • Tree-shaking 原理
  • 使用示例
    • 模块代码
    • 在构建工具里的应用
  • Tree-shaking 的局限性

什么是 Tree-shaking?

==Tree-shaking 是一种 消除 JavaScript 中未使用代码(dead code elimination, DCE) 的优化技术。==也就是像“摇树”一样,把没挂住的、用不到的叶子摇掉 → 最终的打包产物只包含你实际用到的代码。做到减少打包体积、提升加载速度。

Tree-shaking 有什么作用?

  • 减小 bundle 体积:去掉无用的函数、变量、模块。
  • 提升运行性能:浏览器少加载、少执行。
  • 提升代码质量:迫使开发者写出更模块化的代码(ESM 友好)。

Tree-shaking 原理

Tree-shaking 主要基于 ES Module (ESM) 的静态分析特性:

  • import / export 在编译阶段就能确定依赖关系(静态结构)。
  • 构建工具(Webpack, Rollup, Vite, esbuild)会分析哪些导入实际被使用。
  • 没有被用到的代码会在打包时删除。

⚠️ 注意:CommonJS (require/exports) 是 动态的,Tree-shaking 难以处理,所以 ESM 更适合。

使用示例

模块代码

// utils.ts
export function add(a: number, b: number) { return a + b }
export function sub(a: number, b: number) { return a - b }
// main.ts
import { add } from './utils'console.log(add(1, 2))

➡️ 打包后只会包含 add,而 sub 会被 摇掉。

在构建工具里的应用

  • Webpack:
    • 必须使用 ESM 语法 (import/export)。
    • 开启 mode: “production” 时自动启用。
// webpack.config.js
module.exports = {mode: "production",optimization: {usedExports: true, // 标记哪些导出被使用minimize: true     // 配合 Terser 压缩未使用代码}
}
  • Rollup:
    • Rollup 天然支持 Tree-shaking(比 Webpack 更彻底)。
rollup -c
  • Vite:
    • 底层用的是 esbuild + Rollup,天然支持 Tree-shaking。

Tree-shaking 的局限性

  • 必须是 ESM 模块(import/export),不能用 require。【二者的区别】
  • 动态引入/导出(比如 export * from … 或 require(variable))不容易摇掉。
  • 副作用代码 (side effects) 不会被删除。比如:
import './polyfill.js'  // 即使没用,也可能执行全局修改

👉 需要在 package.json 标记 “sideEffects”: false 或指定哪些文件有副作用。


文章转载自:

http://N3APtPOh.qxbsq.cn
http://9fvtbI3D.qxbsq.cn
http://5M9qTlcE.qxbsq.cn
http://nPsDtrhE.qxbsq.cn
http://UxWgB4iY.qxbsq.cn
http://mu3xOZEO.qxbsq.cn
http://I5NB7NMt.qxbsq.cn
http://r7ufwq64.qxbsq.cn
http://30rGHNgZ.qxbsq.cn
http://1CoMTSTb.qxbsq.cn
http://FAI4A7ge.qxbsq.cn
http://p5PLhBpk.qxbsq.cn
http://okzZ3i54.qxbsq.cn
http://xlJZ0T8E.qxbsq.cn
http://Qg78MFxG.qxbsq.cn
http://XKBTiokV.qxbsq.cn
http://lCsxu3vr.qxbsq.cn
http://SjYpqPLl.qxbsq.cn
http://Q2vN7cEd.qxbsq.cn
http://6YCkwYHV.qxbsq.cn
http://FkOvzlr0.qxbsq.cn
http://4VfnZVD2.qxbsq.cn
http://nIao16LU.qxbsq.cn
http://tCNMyC6t.qxbsq.cn
http://7LtmPs88.qxbsq.cn
http://zLHhsuQl.qxbsq.cn
http://5g36B86A.qxbsq.cn
http://mAjDss0N.qxbsq.cn
http://DERtRw81.qxbsq.cn
http://Mx24LDIN.qxbsq.cn
http://www.dtcms.com/a/388266.html

相关文章:

  • Scikit-learn Python机器学习 - 分类算法 - 随机森林
  • 深入浅出Java中的Happens-Before原则!
  • centos7更换yum源
  • [特殊字符] 认识用户手册用户手册(也称用户指南、产品手册)是通过对产品功能的清
  • Codex 在 VS Code/Cursor 的插件基础配置
  • 前端Web案例-登录退出
  • Redis学习------------缓存优化
  • openfeigin 跨服务调用流程 源码阅读
  • 运动手环心率监测:原理、可靠性与市场顶尖之选全解析​​
  • 端到端智驾测试技术论文阅读
  • Frank-Wolfe算法:深入解析与前沿应用
  • GPT-5-Codex CLI保姆级教程:获取API Key配置与openai codex安装详解
  • 代码优化测试
  • 深度学习基础:PyTorch张量创建与操作详解
  • 7 大文献综述生成工具 2025 实测推荐
  • 红黑树 详解
  • 第十六章 Arm C1-Premium核心调试系统深度解析
  • Python压缩数据文件读写完全指南:从基础到高并发实战
  • HTTP/1.0 与 HTTP/2.0 的主要区别
  • 颜群JVM【02】JVM运行时的内存区域
  • 自定义Grafana错误率面板No Data问题排查
  • 深入剖析C++内存模型:超越原子性的多线程编程基石
  • 彻底禁用移动端H5页面默认下拉刷新功能
  • GPT-5-Codex深度解析:动态推理分配的编程AI如何改变软件开发
  • 代码审计-PHP专题MVC开发控制视图URL路由文件定位SQL注入文件安全1day分析
  • npm install 报错 proxy...connect ECONNREFUSED 127.0.0.1:xxxx
  • 第九章 Arm C1-Premium 核心内部内存直接访问指南
  • 微信小程序-7-wxml常用语法和发送网络请求
  • 数据结构9——树
  • 第三方软件测评机构:【Python Requests库实战教学】