Javascript ESM树抖动/死代码消除是如何工作的?

Javascript ESM树抖动/死代码消除是如何工作的?,javascript,node.js,typescript,Javascript,Node.js,Typescript,我很好奇ESM的树震动/死代码消除是如何工作的。我正在为各种Node.js项目使用Typescript,并开始导出我自己的ESM包(tsc--module es2015--target es5--outDir dist/ESM),而不是CJS包。此外,我试图用ESM可用的库来替换仅作为CJS模块可用的依赖项(如lodash) 当我构建一个项目时,我的整个TS代码库(/src)被传输到JS(/dist);依赖项仍然取自(/node\u模块)。没有摇树 我想我仍然需要一个需要(至少)一个入口点的捆绑

我很好奇ESM的树震动/死代码消除是如何工作的。我正在为各种Node.js项目使用Typescript,并开始导出我自己的ESM包(
tsc--module es2015--target es5--outDir dist/ESM
),而不是CJS包。此外,我试图用ESM可用的库来替换仅作为CJS模块可用的依赖项(如lodash)

当我构建一个项目时,我的整个TS代码库(
/src
)被传输到JS(
/dist
);依赖项仍然取自(
/node\u模块
)。没有摇树


我想我仍然需要一个需要(至少)一个入口点的捆绑包(比如Webpack),这样它就可以摆脱所有不需要的东西,这样我就可以减少AWS lambda的包大小了?这是您要做的吗?

当您使用
import
而不是
require
时,transpiler能够在编译时构建依赖关系树(这就是为什么您不能动态
导入
代码)

例如,如果您编写以下内容:

从'mylib'导入{myfunc};
transpiler知道您只需要
mylib
中的
myfunc
函数。如果
mylib
包含
myfunc
未使用的其他函数,则传输程序可以将其从捆绑包中删除

这是简短的版本。树木摇晃实际上比这更复杂。如果您想了解更多信息,Webpack有一篇关于它的好文章:


你说得对,但这并不是我真正想要的。Typescript编译器不会执行任何树抖动。我想这是捆绑者必须做的事情吧?对于(后端)应用程序,如lambda,您也会这样做吗?是的,Typescript将通过导入从ts传输到js。bundler的角色是做树摇动部分。顺便说一句,树摇动lambda不会给您带来太多性能改进。树抖动在浏览器上最有用,以避免下载无用的代码。lambda可以访问非常高带宽的网络,所以树抖动只会使它们更难调试。这也是我所想的。只是想确定我走的是正确的道路。