【发布时间】:2018-05-19 16:43:06
【问题描述】:
我正在尝试找到一种方法来对我的模块进行 tree-shaking 并将 Babel 与 Webpack 结合使用。
如果我从 webpack 文档 (https://webpack.js.org/guides/tree-shaking/) 中获取示例代码并运行它,未使用的模块/函数/其他导出被标记为未使用的和谐导出,这是预期的结果。在使用 -p 参数运行 webpack 之后(生产),webpack 使用 UglifyJS 删除死的和未使用的代码(树摇动)。
现在,如果我将 babel-loader 添加到我的 webpack 配置文件中,我的 ES2015 模块将被转译,但现在不再标记为未使用的导出。
例如:
math.js
export function square(x) {
return x * x;
}
export function cube(x) {
return x * x * x;
}
app.js(我的入口文件)
import {square} from './math.js'
通过 webpack WITHOUT babel-loader 运行,cube 函数将被标记为未使用并在编译生产后删除 (-p)。
通过 webpack WITH 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 添加到预设环境选项中,Babel 不会将模块编译为 ES5,并且 Webpack 会再次将模块标记为未使用。
结论
我需要找到一种方法告诉 Webpack 我的模块是用 Babel 转译的,或者我需要找到一种方法告诉 Babel 自己扫描未使用的代码。
【问题讨论】:
-
你是否在你的 Babel 预设上使用
modules: false以便模块语法不会被转换? -
@loganfsmyth 不,我希望我是!我做了一个演示 repo 来展示我的设置:github.com/Milanzor/babel-and-treeshaking-question
-
@loganfsmyth 为了测试,将
modules: false添加到 babel 的选项中,它再次起作用(请参阅我的问题中的更新)。是什么导致 Webpack 通过 babel 转译到 ES5 后看不到未使用的代码?
标签: webpack babeljs webpack-3 tree-shaking