Webpack babel-loader、TypeScript tsconfig 目标、@babel/preset-env 模块之间的 Webpack 摇树设置:false,package.json side-effects:false?

Webpack Tree-Shaking Setup among Webpack babel-loader, TypeScript tsconfig target, @babel/preset-env modules: false, package.json side-effects:false?

如题。这是更长的版本:

  1. 我的目标是设置 Webpack 的 tree-shaking 功能(对于 es6-modules,或 ESM,如果你愿意,.ejs)。

  2. 我的困惑在于这些配置:Webpack v5 with babel-loader(, which can be tuned from webpack.*.config.js) + Babel v7 with preset @babel/preset-env(,可以从 babel.config.js) + TypeScript 调整,可以从 tsconfig.json 调整。详情如下:

    • 首先,从tsconfig.json开始,我注意到我不明白"target": "es5"是否应该改为"target": "es6",或者这可能无关紧要根本。这是我的推理:

      Even if the target set to "es6", the babel-loader will (probably) further transpile it to "es5" according to the "browserslist" field I have setup in the package.json. And for webpack tree-shaking to work, I guess that I should not transpile my code to "es5" too early.

      但是这个论点是建立在babel-loader只会读"browserslist",不给tsconfig.json一个_的基础上的。如有不妥请指正

    • 其次,说说babel。在 babel.config.js 中有一个选项 modules: false,显然需要它来命令 Babel 不要转译 ESM 导入,这样 tree-shaking 才能工作。所以这为上面的第一个问题提供了更多的上下文:如果我设置 modules: false,那么它应该意味着 babel-loader 的输入,即 .tsx.js 根据 tsconfig.json,也不应转译 ESM 导入。如有不妥请指正

    • 最后,关于package.jsonwebpack.*.config.js。选项 sideEffects: false 是 tree-shaking 工作所必需的。但是似乎可以从 package.json(那么应该是 "side-effects" 的形式)和 webpack.*.config.jsbabel-loadersideEffects 字段中添加此选项。我实际上还没有测试过哪个会起作用。在这里选择这两个选项有什么建议吗?

还有一个context我只用了babel-loader,没有用ts-loader(其实我也不确定这对不对)。这是基于这个论坛的,这是我解决另一个问题时唯一对我有用的方法。如果此问题需要ts-loader,请告诉我,再次感谢。

My target is to setup the tree-shaking feature [...]

在 webpack 5 上,它在生产模式中默认启用。但是您确实需要保留 ESM 语法才能使其正常工作。如果要在开发模式下启用它,请添加 usedExports: true.

[...] TypeScript, which can be tuned from tsconfig.json.

[...] or whether this may not matter at all.

如果你不使用 ts-loader 之类的东西,那么答案是(绝对),因为 babel 不使用它来决定 tranpilation 目标。

[...] should mean that the input of babel-loader, i.e. the .js from .tsx according to tsconfig.json, should not transpile ESM import too.

正确。

[...] The option sideEffects: false is required for tree-shaking to work.

不正确。

[...] Any advice on choosing the two options here?

选package.json一个。您可能在 Whosebug 上读了太多帖子,其中有人使用 imaginary 语法。

[...] I only use babel-loader, no ts-loader (actually I'm not sure about whether this is correct)

可以。它适合你的情况,因为你的 god-dame neovim 上有 tsserver,它已经为你做了 cross-file type-checking。但是你仍然应该找时间尝试一下。很多优化好像都是他们做的。