TypeScript 项目开启 strict 模式后 Tree Shaking 失效了?
我用 Vite + TypeScript 搭了个项目,之前 Tree Shaking 正常,但一开 strict: true 就发现打包体积变大了,没用的代码没被删掉。是不是 tsconfig 的配置影响了摇树?
我试过检查导出方式,也确认用了 ES Module 语法,但就是不行。这是我的 tsconfig 配置:
{
"compilerOptions": {
"target": "ES2020",
"module": "ESNext",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"moduleResolution": "bundler"
}
}
noImplicitAny等一堆严格检查,这会影响类型推导方式。关键问题在于:当你的代码有潜在类型问题时,TS 会生成更详细的结构信息,导致打包工具认为这些代码被依赖了。解决方法:
1. 检查项目中是否有隐式 any 的类型警告,特别是第三方库的类型定义
2. 可以尝试在 tsconfig 里单独开启 strict 的子选项而不是直接
"strict": true,比如:3. 确保你的 Vite 配置中
optimizeDeps.exclude没误伤需要的依赖我之前有个项目就是因为一个鬼畜的
any类型导致整个工具类被保留下来了,排查了半天。建议先用npx vite-bundle-visualizer看看具体是哪些模块没被 tree shaken 掉。strictNullChecks这个子选项。你现在的配置是把所有strict相关检查都打开了,建议先单独调试看看。试试这样改tsconfig.json:
然后逐步开启其他严格检查,比如先开
noImplicitAny看看影响。通常问题出在类型声明被误认为有副作用,导致打包工具不敢删代码。另外检查下你的类型定义文件,别用
export =这种老语法,用标准的ES Module导出。顺便提醒,开strict模式虽然安全但确实可能带来打包问题,生产环境记得做最终的包体积检查。如果还不行,在vite.config.js里显式配置treeshake试试: