gpt4 book ai didi

Webpack 3,Babel 和 Tree Shaking 不起作用

转载 作者:行者123 更新时间:2023-12-04 00:08:27 28 4
gpt4 key购买 nike

我正在尝试找到一种方法来对我的模块进行 tree-shaking 并将 Babel 与 Webpack 一起使用。

如果我从 webpack 文档 (https://webpack.js.org/guides/tree-shaking/) 中获取示例代码并运行它,未使用的模块/函数/其他导出被标记为未使用的和谐导出,这是预期的结果。在使用 -p 参数(生产)运行 webpack 之后,webpack 使用 UglifyJS 删除死的和未使用的代码(用于 tree-shake)。

现在,如果我将 babel-loader 添加到我的 webpack 配置文件中,我的 ES2015 模块将被转译,但现在不再标记为未使用的导出。

例如:

数学.js

export function square(x) {
return x * x;
}

export function cube(x) {
return x * x * x;
}

app.js(我的入口文件)
import {square} from './math.js'

通过 webpack 运行 没有 babel-loader, cube在为生产编译 (-p) 后,函数将被标记为未使用并被删除。

通过 webpack 运行 babel-loader, cube函数不会被标记为未使用,并将保留在已编译的包中。

我错过了什么?

编辑

这是一个可以重现这种情况的演示 repo

https://github.com/Milanzor/babel-and-treeshaking-question

更新

如果我添加一个 .babelrc:
{
"presets": [
["@babel/preset-env", {
"useBuiltIns": "entry",
"debug": true,
"targets": {
"browsers": ["last 2 versions"]
}
}]
]
}

我得到相同的结果,但如果我添加 modules: false对于 preset-env 选项,Babel 不会将模块编译为 ES5,并且 Webpack 会再次将模块标记为未使用。

结论

我需要找到一种方法来告诉 Webpack 我的模块是用 Babel 转译的,或者我需要找到一种方法来告诉 Babel 自己扫描未使用的代码。

最佳答案

Webpack 内置的 tree shaking 仅适用于 ES6 模块语法。如果您使用 Babel 的默认设置,Babel 会将 ES6 模块编译为 CommonJS 模块,而 Webpack 将无法使用任何东西。

一般使用 Webpack 的人会想通过 modules: false到他们用于 ES6 的预设(可能是 preset-env ?),因此

{
presets: [
['env', { modules: false }],
],
}

或者你可以考虑使用像 https://github.com/indutny/webpack-common-shake 这样的插件。为 CommonJS 模块启用 tree-shaking。

更新

如果你使用 Babel 7(因此是 @babel/preset-env ), modules选项现在自动 false在 Webpack 中使用时,因此不再需要此显式配置。

关于Webpack 3,Babel 和 Tree Shaking 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47663486/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com