Tree Shaking(摇树优化)详解
Tree Shaking(摇树优化)详解
Tree Shaking 是现代 JavaScript 打包工具(如 Webpack、Rollup、Vite等)中的一项重要优化技术,它的名字形象地比喻为"摇动一棵树,让没用的叶子掉下来"。
核心概念
- 作用:消除 JavaScript 中未使用的代码(dead code)
- 目标:减小最终打包文件的体积,提升应用加载速度
- 原理:基于 ES6 模块的静态分析(import/export)
为什么需要 Tree Shaking
假设你从 Lodash 这样的工具库中只使用 2-3 个函数:
- 传统方式:引入整个库(约70KB)
- 优化后:只包含实际用到的函数(可能只有几KB)
工作原理
- 依赖关系分析:打包工具会分析所有 import/export 语句
- 标记未使用代码:识别出哪些导出从未被导入使用
- 移除死代码:在最终打包时剔除这些未使用的代码
必要条件
Tree Shaking 要生效需要满足:
- 使用 ES Modules(import/export 语法)
- 代码是静态可分析的(不能是动态导入)
- 打包工具支持(Webpack 4+、Rollup、Vite等)
- 生产模式(通常只在生产环境生效)
实际示例
1. 模块代码 (math.js)
// 导出两个函数
export function square(x) {return x * x;
}export function cube(x) {return x * x * x;
}
2. 使用代码 (app.js)
// 只导入 square 函数
import { square } from './math.js';console.log(square(5)); // 25
打包后会只包含 square 函数,cube 函数会被移除。
如何确保 Tree Shaking 生效
-
使用 ES6 模块语法
// ✅ 正确 - 静态导入 import { cloneDeep } from 'lodash-es'// ❌ 避免 - 动态导入(无法静态分析) const _ = await import('lodash-es') -
选择支持 Tree Shaking 的库
- 优先选择
lodash-es而非lodash - 查看库的 package.json 是否有
"sideEffects": false标记
- 优先选择
-
配置打包工具
// webpack.config.js module.exports = {mode: 'production', // 生产模式自动启用优化optimization: {usedExports: true, // 标记未使用代码} } -
检查打包结果
- 使用 Webpack Bundle Analyzer 等工具分析
- 对比开发和生产环境的包大小差异
常见误区
- 认为所有库都自动支持:很多旧库使用 CommonJS 模块(require/exports),无法被 Tree Shaking
- 混淆运行时和编译时:动态导入(如
import())无法被静态分析 - 忽略副作用代码:某些代码看似未使用,但可能有副作用(如 polyfill)
扩展知识
- Dead Code Elimination (DCE):Tree Shaking 是 DCE 的一种实现方式
- Scope Hoisting:配合 Tree Shaking 使用的另一项优化技术
- PURE 注释:使用
/*#__PURE__*/标记无副作用的函数调用
Tree Shaking 是现代前端工程化的重要组成部分,能显著优化应用性能,特别是在使用大型工具库时效果更为明显。
相关文章:
Tree Shaking(摇树优化)详解
Tree Shaking(摇树优化)详解 Tree Shaking 是现代 JavaScript 打包工具(如 Webpack、Rollup、Vite等)中的一项重要优化技术,它的名字形象地比喻为"摇动一棵树,让没用的叶子掉下来"。 核心概念 …...
SpringAI版本更新:向量数据库不可用的解决方案!
Spring AI 前两天(4.10 日)更新了 1.0.0-M7 版本后,原来的 SimpleVectorStore 内存级别的向量数据库就不能用了,Spring AI 将其全部源码删除了。 此时我们就需要一种成本更低的解决方案来解决这个问题,如何解决呢&…...
BladeX单点登录与若依框架集成实现
1. 概述 本文档详细介绍了将BladeX认证系统与若依(RuoYi)框架集成的完整实现过程。集成采用OAuth2.0授权码流程,使用户能够通过BladeX账号直接登录若依系统,实现无缝单点登录体验。 2. 系统架构 2.1 总体架构 #mermaid-svg-YxdmBwBtzGqZHMme {font-fa…...
JVM 内存调优
内存调优 内存泄漏(Memory Leak)和内存溢出(Memory Overflow)是两种常见的内存管理问题,它们都可能导致程序执行不正常或系统性能下降,但它们的原因和表现有所不同。 内存泄漏 内存泄漏(Memo…...
Shell脚本提交Spark任务简单案例
一、IDEA打包SparkETL模块,上传值HDFS的/tqdt/job目录 二、创建ods_ETL.sh脚本 mkdir -p /var/tq/sh/dwd vim /var/tq/sh/dwd/ods_ETL.sh chmod 754 /var/tq/sh/dwd/ods——ETL.sh #脚本内容如下 #!/bin/bash cur_date$(date %Y-%m-%d) /opt/bigdata/spark-3.3.2/b…...
国标GB28181视频平台EasyCVR视频汇聚系统,打造别墅居民区智能监控体系
一、现状背景 随着国家经济的快速增长,生活水平逐渐提高,私人别墅在城市、乡镇和农村的普及率也在逐年增加。然而,由于别墅区业主经济条件较好,各类不法事件也日益增多,主要集中在以下几个方面: 1&#x…...
BGP分解实验·23——BGP选路原则之路由器标识
在选路原则需要用到Router-ID做选路决策时,其对等体Router-ID较小的路由将被优选;其中,当路由被反射时,包含起源器ID属性时,该属性将代替router-id做比较。 实验拓扑如下: 实验通过调整路由器R1和R2的rout…...
机器学习(5)——支持向量机
1. 支持向量机(SVM)是什么? 支持向量机(SVM,Support Vector Machine)是一种监督学习算法,广泛应用于分类和回归问题,尤其适用于高维数据的分类。其核心思想是寻找最优分类超平面&am…...
访问不到服务器上启动的llamafactory-cli webui
采用SSH端口转发有效,在Windows上面进行访问 在服务器上启动 llamafactory-cli webui 后,访问方式需根据服务器类型和网络环境选择以下方案: 一、本地服务器(物理机/虚拟机) 1. 直接访问 若服务器与操作设备处于同一…...
【玩泰山派】MISC(杂项)- 使用vscode远程连接泰山派进行开发
文章目录 前言流程1、安装、启动sshd2、配置一下允许root登录3、vscode中配置1、安装remote插件2、登录 **注意** 前言 有时候要在开发板中写一写代码,直接在终端中使用vim这种工具有时候也不是很方便。这里准备使用vscode去通过ssh远程连接泰山派去操作࿰…...
量子纠缠物理本质、技术实现、应用场景及前沿研究
以下是关于 量子纠缠(Quantum Entanglement) 的深度解析,涵盖物理本质、技术实现、应用场景及前沿研究,以技术视角展开: 一、量子纠缠的物理本质 1. 核心定义 量子纠缠是多个量子系统(如粒子)间的一种关联状态,表现为: 非局域性:纠缠态粒子无论相距多远,测量其中一…...
Spring Boot中接入DeepSeek的流式输出
第一步,添加依赖: <!-- WebFlux 响应式支持 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId> </dependency> 第二步,配置We…...
同步/异步日志系统
同步/异步日志系统 项目演示基础测试性能测试测试环境:同步日志器单线程同步日志器多线程异步日志器单线程异步日志器多线程 工具类(util.hpp)日志等级level.hpp 日志消息message.hpp 日志消息格式化formatter.hpp 日志消息落地sink.hpp 日志…...
typescript html input无法输入解决办法
input里加上这个: onkeydown:(e: KeyboardEvent) > {e.stopPropagation();...
游戏引擎学习第224天
回顾游戏运行并指出一个明显的图像问题。 回顾一下之前那个算法 我们今天要做一点预加载的处理。上周刚完成了游戏序章部分的所有剪辑内容。在运行这一部分时,如果观察得足够仔细,就会注意到一个问题。虽然因为视频流压缩质量较低,很难清楚…...
SAP-ABAP:SAP HANA高可用与灾备——存储镜像与系统复制的核心技术
SAP HANA作为企业关键业务的核心数据库,其高可用性(High Availability, HA)与灾备(Disaster Recovery, DR)能力直接影响业务连续性。HANA通过存储镜像、系统复制及集群集成三大核心技术,实现秒级故障切换与…...
工厂能耗系统智能化解决方案 —— 安科瑞企业能源管控平台
安科瑞顾强 政策背景与“双碳”战略驱动 2025年《政府工作报告》明确提出“单位国内生产总值能耗降低3%左右”的目标,要求通过产业结构升级(如高耗能行业技术革新或转型)、能源结构优化(提高非化石能源占比)及数字化…...
【pytorch图像视觉】lesson17深度视觉应用(上)构建自己的深度视觉项目
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、 数据1、认识经典数据1.1入门数据:MNIST、其他数字与字母识别(1)数据下载(2)查看数据的特征和标…...
java中的Future的设计模式 手写一个简易的Future
案例 例如:今天是小妹的生日,需要一个蛋糕有点仪式感,于是去蛋糕店预定,预定完之后,店老板说蛋糕做好了,到时电话通知你,不可能在这傻傻的等着吧,还有其他事情要做啊,于…...
USB(TYPE-C)转串口(TTL)模块设计讲解
目录 一 、引言 二、方案设计 三、USB TYPE-C介绍 1、TYPE-C接口定义 1、24P全引脚描述 2、Type C 接口 VBUS/GND 作用 3、Type C 接口 D/D- 作用 1、数据传输: 2、设备识别: 3、充电协议协商: 4、Type C 接口 CC1/CC2 作用 1、主从设备区…...
JavaScript | ajax实现原理
在早期,web应用,更多采用mvc框架,通过后端输出整个页面的内容,然后再用浏览器进行渲染,这样效率不高,对于事件绑定来说比较麻烦,于是提出了ajax,其最大的特点就是能实现局部更新。通…...
PyTorch张量操作指南:cat、stack、split与chunk的实战拆解
本文深入探讨PyTorch中用于调整张量结构的四个核心函数——torch.cat、torch.stack、torch.split和torch.chunk。通过实际应用场景分析和代码演示,帮助读者掌握它们的功能差异及适用条件,提升模型开发的灵活性与效率。 在深度学习实践中,张量…...
YOLO涨点技巧之分层扩展路径聚合网络 (HEPAN)
一、应用场景与问题背景 1.1 无人机图像检测挑战 https://ai-studio-static-online.cdn.bcebos.com/3d4f7e8c4d8d4d2d8a4c8e4b4e8c4d8d 场景特点:无人机航拍视角下的小目标检测(如行人、车辆、农作物病害等)核心难点: 目标尺寸小(<3232像素)复杂背景干扰(如城市…...
SQLite、MySQL、SQL Server、Oracle 和 PostgreSQL 五种数据库的区别
以下是 SQLite、MySQL、SQL Server、Oracle 和 PostgreSQL 五种主流关系型数据库管理系统(RDBMS)的区别,从多个维度进行对比: 1. 架构与部署 SQLite(Structured Query Language Lite): 嵌入式数据库,无服务器架构。数据库存储在一个单一的磁盘文件中。部署简单,适合轻量…...
git在分支上会退到某个指定的commit
1、在idea上先备份好分支(基于现有分支new branch) 2、在gitlab管理端删除现有分支 3、在idea中大卡terminal,执行 git log 查看commit log ,找到要会退到的commit唯一码,然后执行git reset 唯一码 4、查看本地代码状态 git st…...
玩机进阶教程----MTK芯片设备刷机导致的死砖修复实例解析 连电脑毫无反应 非硬件问题
在高通芯片机型中,我们可以通过短接主板测试点来激活高通芯片特有的9008底层端口来刷写救砖固件。但通常MTK芯片类的设备联机电脑即可触发深刷模式。但有些例外的情况会导致链接电脑毫无反应。遇到类似故障的友友可以参阅此博文尝试解决。 通过博文了解 1💝💝💝-----实…...
MIPI协议介绍
MIPI协议介绍 mipi 协议分为 CSI 和DSI,两者的区别在于 CSI用于接收sensor数据流 DSI用于连接显示屏 csi分类 csi 分为 csi2 和 csi3 csi2根据物理层分为 c-phy 和 d-phy, csi-3采用的是m-phy 一般采用csi2 c-phy 和 d-phy的区别 d-phy的时钟线和数据线是分开的,2根线一对…...
MySQL 中 `${}` 和 `#{}` 占位符详解及面试高频考点
文章目录 一、概述二、#{} 和 ${} 的核心区别1. 底层机制代码示例 2. 核心区别总结 三、为什么表名只能用 ${}?1. 预编译机制的限制2. 动态表名的实现 四、安全性注意事项1. ${} 的风险场景2. 安全实践 五、面试高频考点1. 基础原理类问题**问题 1**:**问…...
AI应用开发平台 和 通用自动化工作流工具 的详细对比,涵盖定义、核心功能、典型工具、适用场景及优缺点分析
以下是 AI应用开发平台 和 通用自动化工作流工具 的详细对比,涵盖定义、核心功能、典型工具、适用场景及优缺点分析: 1. AI应用开发平台 vs 通用自动化工作流工具 (1) 定义与目标 类型AI应用开发平台通用自动化工作流工具定义用于快速构建、训练、部署…...
GitHub 趋势日报 (2025年04月12日)
本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ 📈 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1yeongpin/cursor-free-vip[Support 0.48.x](Reset Cursor AI MachineID & Auto Sign Up / In & Bypass Higher…...
