为何使用预构建库A1的项目构建包体积比A2更小?
以下是导致这个反直觉结果的几个核心原因:
A1预打包时已完成一轮深度优化
A1通过Vite构建时,不仅整合了React等依赖,还完成了Tree Shaking、Terser压缩、死代码消除等优化步骤。虽然A1本身初始体积更大,但它的代码冗余度极低。而A2仅通过tsc编译,tsc仅负责TypeScript到JavaScript的语法转译,不会做压缩、冗余代码剔除这类优化,输出的JS保留了未压缩的变量名、多余换行、语法辅助代码等冗余结构——后续Vite打包时虽会二次压缩,但原始代码的冗余还是会导致最终体积略高。预打包文件并非无法被Tree Shaking
你误以为预打包的文件难以被Tree Shaking,但只要A1输出的是ES模块格式(Vite默认输出ES模块),Vite依然可以对它进行精准的Tree Shaking。A1在预打包阶段已经剔除了自身的无用代码;而A2作为分散的未打包模块,即便Vite会做Tree Shaking,其模块结构的分散性、导出内容的冗余度,加上依赖的React需要Vite单独处理打包,过程中会引入细微的整合开销,最终体积略超A1。依赖处理的细微差异
A1已将React等依赖打包并优化压缩,而A2依赖外部React,项目构建时Vite需要单独处理React的打包流程。两者最终的体积差异极小(仅0.42KB),说明核心代码的优化程度接近,但A1预打包阶段对依赖的优化更彻底,避免了二次打包的细微冗余。tsc编译的固有冗余
tsc编译TypeScript时,若未配置高版本编译目标,会生成ES5兼容的辅助代码(如__extends、__assign),或保留TypeScript特有的编译产物结构。这些内容虽会被Vite压缩,但相比Vite直接打包优化后的代码,仍会多出一点点体积。
内容的提问来源于stack exchange,提问作者devheerim

