TypeScript项目中Tree Shaking没生效,如何排查配置问题?
我按照官方文档配置了TypeScript项目,打包时发现没摇树,打包体积还是很大。检查了tsconfig.json的module和target设置,也用了rollup打包,但导出的代码里还是包含未使用的代码…
// tsconfig.json
{
"compilerOptions": {
"module": "ESNext",
"target": "ESNext",
"moduleResolution": "node16",
"outDir": "./dist",
"declaration": true
}
}
比如工具库里的utils.ts明明只导出了两个函数,但打包后看到:
// 打包后的代码片段
function unusedFunc() { ... }
function usedFunc() { ... }
export { usedFunc };
尝试过设置”sideEffects”: false和调整treeshake配置都没用,是不是TypeScript特有的配置被忽略了?
几个可能的原因和排查方向:
1. 检查Rollup配置里的treeshake选项
确保你没有把treeshake关掉或者配置错了:
**2. 看看是不是用了export * from这种写法
通配符导出是tree shaking的杀手,Rollup根本分析不了谁用了谁没用:
3. 检查你的入口文件导出方式
如果入口文件是类似这样的:
改成明确导出就行。
4. 确认输出格式是ESM
你的tsconfig设置没问题,但检查一下Rollup输出是不是ESM格式。esm格式才能被现代浏览器tree shaking。
5. 试试在rollup里加这个配置**
基本上就是这几个坑,百分之九十的情况是export * from导致的。你检查一下代码里有没有那种通配符导出,改成明确导出基本就能解决了。
还有个常见问题是Babel转译时会破坏tree shaking,如果你用@rollup/plugin-typescript插件就别再加Babel了,多一层转译反而坏事。