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

【工程化】tree-shaking 的作用以及配置

Tree Shaking(摇树优化)是构建工具(如 Webpack、Rollup、Vite)中用于移除未使用代码,能显著减小打包体积。


⚙️ ​​一、基础配置条件​

  1. ​使用 ES Module (ESM) 语法​

    • ​必须使用​import/export,禁用 CommonJS(如 require/module.exports)。

    • ​正确示例​​:

      // 按需导入(支持 Tree Shaking)
      import { debounce } from 'lodash-es';
      
      // 错误示例(全量导入,无法优化)
      import _ from 'lodash';
      
  2. ​启用生产模式​
    Webpack/Vite 在生产模式(mode: 'production')下默认开启 Tree Shaking 和代码压缩。

    // webpack.config.js
    module.exports = {mode: 'production', // 关键配置optimization: {usedExports: true, // 标记未使用导出minimize: true,    // 启用压缩(删除死代码)},
    };
    

📦 ​​二、关键配置步骤​

1. ​​配置 sideEffects 属性(核心)​

在项目的 package.json 中声明文件副作用,指导构建工具安全删除未使用代码:

{"name": "your-project","sideEffects": false,  // 所有文件无副作用(可安全删除)// 或指定有副作用的文件(如 CSS、全局 JS)"sideEffects": ["*.css",             // 避免 CSS 被误删"src/polyfills.js"   // 如 Babel polyfill]
}
2. ​​Babel 配置:避免破坏 ESM 结构​

确保 Babel 不将 ESM 转为 CommonJS(默认行为会破坏 Tree Shaking):

// .babelrc
{"presets": [["@babel/preset-env", { "modules": false   // 保留 ESM 语法}]]
}
3. ​​第三方库的优化引入​
  • ​优先选择 ESM 版本​​:如 lodash-es 替代 lodash

  • ​按需导入子模块​​:

    import debounce from 'lodash/debounce'; // 直接引入子文件
    

⚠️ ​​三、常见问题与解决方案​

1. ​​Tree Shaking 失效场景​
​原因​​解决方案​
使用 CommonJS 语法全项目统一改用 ESM 语法
未正确配置 sideEffectspackage.json 中标记副作用文件(如 CSS)
Babel 转换破坏 ESM设置 "modules": false
导出方式不当避免 export default 对象,改用命名导出(Named Exports)
2. ​​CSS 等资源被误删​

通过 sideEffects 标记或 Webpack 规则排除:

// webpack.config.js
module: {rules: [{test: /.css$/,use: ['style-loader', 'css-loader'],sideEffects: true // 声明 CSS 有副作用}]
}
3. ​​开发环境调试优化​

开发模式下 Tree Shaking 仅标记未使用代码(不删除),避免破坏 SourceMap:

mode: 'development',
optimization: {usedExports: true, // 标记未使用导出(可查看日志)minimize: false    // 关闭压缩
}

🛠️ ​​四、构建工具差异​

​工具​​配置要点​
​Webpack​需手动开启 usedExports + minimize,依赖 sideEffects 标记
​Rollup​默认支持 Tree Shaking,无需额外配置
​Vite​生产模式自动启用(基于 Rollup)

💎 ​​总结:最佳实践​

  1. ​代码规范​​:全项目使用 ESM 语法,避免 export default 对象。

  2. ​构建配置​​:

    • Webpack:mode: 'production' + usedExports: true + minimize: true
    • package.json 中声明 sideEffects
  3. ​三方库​​:优先选择 ESM 版本,按需引入子模块。

http://www.xdnf.cn/news/1244539.html

相关文章:

  • 研发团队看板协作中的自动化实践:集成CI/CD与任务流转
  • 【Linux系统】进程间通信:基于匿名管道实现进程池
  • linux_https,udp,tcp协议(更新中)
  • C语言基础_随机数、数组、函数、指针
  • 【机器学习深度学习】模型压缩简介
  • C++ - 基于多设计模式下的同步异步日志系统(11w字)
  • NLP——BERT模型全面解析:从基础架构到优化演进
  • AWS EKS节点扩容时NLB与Ingress的故障处理与优化方案
  • LSTM + 自注意力机制:精准预测天气变化的创新方案
  • 深入剖析 RAG 检索系统中的召回方式:BM25、向量召回、混合策略全解析
  • JS-第二十一天-尺寸位置
  • Android UI 组件系列(十一):RecyclerView 多类型布局与数据刷新实战
  • AI 对话高效输入指令攻略(四):AI+Apache ECharts:生成各种专业图表
  • 【学习笔记】Manipulate-Anything(基于视觉-语言模型的机器人自动化操控系统)
  • 【09】C++实战篇——C++ 生成静态库.lib 及 C++调用lib,及实际项目中的使用技巧
  • javacc学习笔记 02、JavaCC 语法描述文件的格式解析
  • Druid手写核心实现案例 实现一个简单Select 解析,包含Lexer、Parser、AstNode
  • k8s常见问题
  • (论文速读)RMT:Retentive+ViT的视觉新骨干
  • 20250805问答课题-实现TextRank + 问题分类
  • 力扣热题100------21.合并两个有序链表
  • 8.高斯混合模型
  • k8s简介
  • 数据集相关类代码回顾理解 | np.mean\transforms.Normalize\transforms.Compose\xxx.transform
  • Claude Code六周回顾
  • 补:《每日AI-人工智能-编程日报》--2025年7月29日
  • steam Rust游戏 启动错误,删除sys驱动,亲测有效。
  • 机器学习(13):逻辑回归
  • 昇思学习营-模型推理和性能优化学习心得
  • ShowDoc与Docmost对比分析:开源文档管理工具的选择指南