javascript - 如何让 webpack treeshake 我的 ES6 模块?
问题描述
我已经按照那里的每个指南在 webpack 4 中打开 tree shaking 了,但是 webpack 仍然捆绑了我设置为 treeshaken 的 NPM 模块中的代码。如何启用 treeshaking 并且不在我的 Web 应用程序中包含特定代码?
我有一个 CRA(create-react-app),它导入我创建的 NPM 模块来测试它,如下所示:
package
index.mjs
dist
esm
components
image
index.js
index.js
index.js
像package.json
这样:
"main": "index",
"module": "index.jsm",
"sideEffects": false,
使用带有 babelrc 的 babel 进行编译,例如:
{
"presets": [
[
"@babel/preset-env",
{
"modules": false
}
],
"@babel/react",
"@babel/flow"
]
}
我有 3 个 React 组件:image
,avatar
(导入image
)并且login-button
有这个 es6 代码:
import React from 'react'
document.body.innerHTML = document.body.innerHTML + "<div>This is a side effect and should never have happened</div>"
export default () => <button>Login</button>
NPM es6 模块的索引文件:
import * as lib from './dist/esm'
export default lib
在 CRA 中,app.js
我有:
import TreeshakingTestModule from 'treeshaking-test-module'
function App() {
return (
<div className="App">
<TreeshakingTestModule.Avatar />
</div>
);
}
当我npm start
构建和渲染头像时,我也看到了消息。
请注意,login-button
从来没有使用过,但是我的 NPM 包的默认导出确实导出了组件,但是我阅读了解释说即使默认导出和重新导出仍然可以在树抖动的情况下使用的教程,如果从不使用导出的内容。
怎么了?我究竟做错了什么?
解决方案
据我所知,webpack 三是通过静态分析导入来实现的,而不是通过阅读您的代码。你不能指望 webpack 意识到你只是在使用Avatar
from TreeshakingTestModule
。
因此,您需要通过使用命名导入和导出来声明要在import
级别使用的内容:
import {Avatar} from 'treeshaking-test-module'
function App() {
return (
<div className="App">
<Avatar />
</div>
);
}
所以 webpack 知道你只是在使用Avatar
导出。
这意味着Avatar
需要在您的treeshaking-test-module
模块中命名导出。
推荐阅读
- python - 在 Python 中确定函数的参数数量
- java - 如何更改按下的 JLabel 的图标
- r - 这个 for 循环不起作用,当我试图给出值时它没有产生输出
- graph-theory - TSP:在距离约束下最大化利润
- flutter - Flutter AnimatedContainer / AnimatedOpacity 延迟动画
- r - 在R中按日期和时间对数据进行排序
- c - 如何对超过 10 位的数字求和?
- google-cloud-platform - GCSFuse 提供范围未授权错误
- java - 如何在java中找到第二个最常见的字符?
- python - 如何在水平条形图中设置条形之间的距离