配置 Tree Shaking 时常见的错误有哪些?

简介: 配置 Tree Shaking 时常见的错误有哪些?

配置 Tree Shaking 时常见的错误包括:

1. 未使用 ES6 模块语法

Tree Shaking 依赖于 ES6 模块的静态结构分析(import/export)。如果项目中混用 CommonJS 语法(如 require/module.exports),Tree Shaking 将失效。
错误示例

// CommonJS 语法(不支持 Tree Shaking)
const utils = require('./utils');

正确做法

// ES6 模块语法
import {
    utils } from './utils';

2. 未启用生产模式

Webpack/Rollup 等构建工具默认只在生产模式下开启 Tree Shaking。
错误示例

// webpack.config.js(开发模式未优化)
module.exports = {
   
  mode: 'development', // 开发模式不会进行 Tree Shaking
};

正确做法

// 启用生产模式
module.exports = {
   
  mode: 'production',
};

3. 错误配置 sideEffects

package.json 中的 sideEffects 配置错误会导致有用代码被误删。
错误示例

// 错误:所有模块都无副作用(实际可能有)
{
   
  "sideEffects": false
}

正确做法

// 明确列出有副作用的文件
{
   
  "sideEffects": ["*.css", "src/init.js"]
}

4. 使用非静态导入/导出

动态导入(如 import('./module').then(...))或在条件语句中导出会破坏 Tree Shaking。
错误示例

// 动态导入(无法静态分析)
if (condition) {
   
  import('./module');
}

正确做法

// 静态导入(顶层声明)
import module from './module';

5. 未处理 CommonJS 依赖

如果项目依赖 CommonJS 模块(如 lodash),Tree Shaking 可能无法正确处理。
解决方案

  • 使用 ES6 版本的库(如 lodash-es)。
  • 配置 rollup-plugin-commonjs 或 Webpack 的 babel-loader 将 CommonJS 转换为 ES6。

6. 错误使用第三方库

部分库的设计可能不支持 Tree Shaking(如整体导入而非按需导入)。
错误示例

// 整体导入(包含所有模块)
import _ from 'lodash';
_.map([1, 2, 3]);

正确做法

// 按需导入(仅包含使用的模块)
import {
    map } from 'lodash-es';
map([1, 2, 3]);

7. 插件配置冲突

某些构建工具插件可能会干扰 Tree Shaking。
错误示例

  • 使用 uglify-js 而非 terser(后者支持 ES6 模块)。
  • 配置 babel-plugin-transform-runtime 时未启用 corejs 选项。

8. 未压缩代码

即使 Tree Shaking 标记了未使用代码,若未启用压缩工具(如 Terser),这些代码仍会保留在 bundle 中。
解决方案
确保生产环境配置中包含压缩插件:

// webpack.config.js
const TerserPlugin = require('terser-webpack-plugin');

module.exports = {
   
  optimization: {
   
    minimizer: [new TerserPlugin()],
  },
};

9. 副作用代码未声明

某些模块可能有隐藏的副作用(如全局样式、Polyfill),但未在 sideEffects 中声明。
解决方案
package.json 中明确列出有副作用的文件或模块:

{
   
  "sideEffects": ["*.css", "src/polyfill.js"]
}

10. 未验证 Tree Shaking 效果

未通过工具检查打包结果,导致无法确认 Tree Shaking 是否生效。
验证方法

  • 使用 source-map-explorer 分析打包文件:
    npx source-map-explorer dist/main.js
    
  • 对比生产环境和开发环境的 bundle 大小差异。

总结

Tree Shaking 的关键在于:

  1. 使用 ES6 模块语法
  2. 启用 生产模式代码压缩
  3. 正确配置 sideEffects
  4. 避免动态导入和非静态代码结构。
  5. 验证结果并按需调整配置。
目录
相关文章
|
弹性计算 运维 负载均衡
我对ECS的理解
云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的云计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。专业的售前技术支持,协助您选择最合适配置方案。
463 57
|
存储 编解码 缓存
阿里云CDN+点播服务助力云学堂全面提升用户在线学习体验
CDN将云学堂的点播视频资源缓存至阿里云遍布全球的加速节点上,当终端用户请求访问和获取该资源时,无需回源,系统自动调用离终端用户最近的CDN节点上已缓存的资源,提高用户访问效率和访问速度。
2124 57
阿里云CDN+点播服务助力云学堂全面提升用户在线学习体验
|
Web App开发 监控 网络协议
如何构建低延时的直播体验,让互动更实时?
传统的直播技术,已经不能满足对互动要求更高的直播要求,为此,2019年阿里云与淘宝直播共同推出超低延时直播服务RTS(Real-time Streaming),该方案基于WebRTC实现,采用UDP传输协议打造,实现可以承载大规模并发,端到端延时1秒内的低延时直播体验。由于RTS服务部署于阿里云CDN节点,复用CDN的节点和网络资源,在接入成本、节点覆盖、承载能力上实现了平衡
3610 57
如何构建低延时的直播体验,让互动更实时?
|
消息中间件 Java Kafka
Apache Flink 漫谈系列(15) - DataStream Connectors之Kafka
聊什么 为了满足本系列读者的需求,在完成《Apache Flink 漫谈系列(14) - DataStream Connectors》之前,我先介绍一下Kafka在Apache Flink中的使用。所以本篇以一个简单的示例,向大家介绍在Apache Flink中如何使用Kafka。
9099 57
|
数据采集 测试技术 Python
【资料下载】Python 第十讲——xpath元素定位获取及爬虫中使用实例
直播时间:4月2日 20:00——21:00 直播介绍:python是非常适合敏捷开发的语言,用python编写爬虫快速获取数据,并做数据分析,对日常生活和工作能起到一定帮助。而python爬虫有很多种爬取方式,例如Requests+正则表达式、selenium+Chrome/PhantomJS等,xpath定位是其中的一种,以其使用简便、运行高效、应用场景多的优点,被很多爬虫开发者使用。
10229 58
|
数据采集 Python
【Python 学习进阶月刊】 第三期
欢迎订阅Python学习进阶月刊 精彩直播:Python系列直播——Python 进阶教程 课程简介:python 中的函数,类,魔法方法,异步io,多线程,多进程等是学习python中不可缺少的部分。
2249 57
|
存储 索引 Python
Python 技术百问
如何让用户保持登录状态https://yq.aliyun.com/ask/495120 如何迭代Pandas Dataframe中的行https://yq.aliyun.com/ask/495119 如何在Python中查找或删除列表中的子串列表https://yq.
10085 57
|
数据采集 机器学习/深度学习 新零售
【Python 学习进阶月刊】 第二期: Python 资料汇总
欢迎订阅Python学习进阶月刊 精彩直播: Python 系列直播——深入Python与日志服务,玩转大规模数据分析处理实战 IPython/Jupyter Notebook非常流行,但随着数据量越来越大(例如几百亿条电商平台访问日志),如何继续保持灵活的交互式分析,是一个挑战。
4582 57
|
Java Python
python ThreadPoolExecutor线程池使用
最近用上ThreadPoolExecutor, 用来代替celery的方式。 主要是用在celery上的时间太少, 没有吃透, 还有,我们的应用没有复杂到那地步, 多开几个服务器,也可以实现线程池的扩展。
7247 57
|
SQL 测试技术 API
Apache Flink 漫谈系列(13) - Table API 概述
什么是Table API 在《Apache Flink 漫谈系列(08) - SQL概览》中我们概要的向大家介绍了什么是好SQL,SQL和Table API是Apache Flink中的同一层次的API抽象,如下图所示: Apache Flink 针对不同的用户场景提供了三层用户API,最下层ProcessFunction API可以对State,Timer等复杂机制进行有效的控制,但用户使用的便捷性很弱,也就是说即使很简单统计逻辑,也要较多的代码开发。
7960 55