Vite 默认支持 Tree Shaking,但 TypeScript 项目需三方面配合:tsconfig.json 设为 ESNext 模块、使用具名导入和 ESM 兼容库(如 lodash-es)、vite.config.ts 启用压缩并合理配置 manualChunks 和 sideEffects。

Vite 默认就支持 Tree Shaking,但 TypeScript 项目要真正生效,得从代码写法、编译配置和构建设置三方面配合。光靠默认配置,很容易因为某些细节导致“摇不掉”——比如全量导入、副作用没声明、或者模块格式不对。
确保 TypeScript 输出 ES 模块语法
Tree Shaking 依赖静态的 import/export 结构,所以 tsconfig.json 必须设为:
{
"compilerOptions": {
"module": "ESNext",
"target": "ES2020",
"moduleResolution": "Node16",
"esModuleInterop": true,
"allowSyntheticDefaultImports": true
}
}module: "ESNext" 是关键——如果误设为 "CommonJS" 或 "UMD",Vite 构建时无法做静态分析,Tree Shaking 就失效。
避免阻碍 Tree Shaking 的导入方式
❌ 错误写法(全量导入、动态路径、CommonJS 风格):
import * as utils from 'lodash'; // 摇不掉整个 lodash
import _ from 'lodash'; // 同样全量引入
const mod = await import(`./${name}.ts`); // 动态字符串路径,无法静态分析✅ 正确写法(具名导入、静态路径、ESM 原生语法):
import { debounce, throttle } from 'lodash-es'; // 支持摇树的版本
import { AuthDebugger } from '@/components/AuthDebugger'; // 静态路径,且只导入实际用到的注意:优先用 lodash-es 而不是 lodash;@modelcontextprotocol/sdk 等大型依赖也建议查其是否提供 ESM 版本。
检查并优化 vite.config.ts 构建配置
基础配置里 minify: false 会关闭压缩,也削弱 Tree Shaking 效果。应改为:
export default defineConfig({
build: {
minify: 'terser', // 启用压缩,配合摇树
rollupOptions: {
output: {
manualChunks: {
vendor: ['react', 'react-dom', '@modelcontextprotocol/sdk'],
},
},
},
},
});manualChunks 不仅做代码分割,还能让 Rollup 更精准识别哪些是第三方依赖、哪些是业务代码,提升摇树粒度。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
处理副作用,让工具放心删除代码
如果某个模块顶层有副作用(比如修改全局变量、插入样式、执行日志),Rollup 默认不敢删它。你有两种选择:
-
在
package.json中声明:"sideEffects": ["*.css", "*.scss"]
表示只有 CSS 类文件有副作用,其余 JS 文件可安全摇除。
-
或在代码中用注释标记纯函数:
/*#__PURE__*/ console.log('这段日志会被摇掉');
验证是否生效
运行构建后,用 vite build --debug 查看产物分析报告,或打开 dist/assets/ 下的 JS 文件,搜索那些明确没被引用的函数名(比如 unusedFunction),看是否真的没出现在最终代码里。
基本上就这些。核心不是加多少配置,而是保持导入方式干净、编译输出格式正确、副作用表达清晰。

















