【发布时间】:2020-03-03 13:55:32
【问题描述】:
我正在学习如何使用使用 Lodash 的 webpack 4/React 应用程序进行 tree-shaking。
起初,我的 Lodash 用法如下所示:
import * as _ from "lodash";
_.random(...
我很快通过 BundleAnalyzerPlugin 了解到,整个 Lodash 都包含在开发和产品构建中 (527MB)。
googling around 之后我意识到我需要使用特定的语法:
import random from "lodash/random";
random(...
现在,只有 random 及其依赖项正确包含在包中,但我还是有点困惑。
如果我需要在import 语句中明确指定函数,那么摇树实际上扮演什么角色?
在比较开发和生产模式构建时,BundleAnalyzerPlugin 没有显示有效负载大小的差异(两者都是正确的小尺寸,但我认为摇树只发生在生产构建中?)。
我的印象是 TreeShaking 会执行某种静态代码分析,以确定代码的哪些部分实际被使用(可能基于功能?)并剪掉未使用的部分。
为什么我们不能总是在 import 中使用 * 并依靠 TreeShaking 来确定捆绑包中实际包含的内容?
如果有帮助,这是我的webpack.config.js:
const path = require("path");
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;
module.exports = {
entry: {
app: ["babel-polyfill", "./src/index.js"]
},
plugins: [
new BundleAnalyzerPlugin({
analyzerMode: "static",
openAnalyzer: false
})
],
devtool: "source-map",
output: {
filename: "[name].js",
path: path.resolve(__dirname, "dist"),
chunkFilename: "[name].bundle.js",
publicPath: ""
},
module: {
rules: [
{
test: /\.js$/,
loader: "babel-loader",
include: /src/,
options: {
babelrc: false,
presets: [
[
"env",
{
targets: {
browsers: ["last 2 Chrome versions"]
}
}
],
"@babel/preset-env",
"@babel/preset-react"
],
plugins: ["syntax-dynamic-import"]
}
},
{
test: /\.(ts|tsx)$/,
use: [
{
loader: require.resolve("ts-loader"),
options: {
compiler: require.resolve("typescript")
}
}
]
}
]
},
resolve: {
symlinks: false,
extensions: [".js", ".ts", ".tsx"],
alias: {
react: path.resolve("./node_modules/react")
}
}
};
我正在使用 webpack --mode=development 和 webpack --mode=production 调用 webpack。
【问题讨论】:
-
它really shouldnot matter。你到底在用
_对象做什么,而不仅仅是调用它的方法? -
您的意思是
import random from "lodash/random";?import * as _ from "lodash";应该与import { random } from "lodash";完全相同。 -
@Bergi,是的,对不起,我的意思是“lodash/random”,我在代码中输入正确,只是在问题中输入错误。
-
@Bergi,感谢您的链接,但是当我使用“import * as _”语法时,捆绑包拥有整个 lodash 库,所以看起来它确实很重要......
-
我认为这是因为 lodash 不可摇树(糟糕的设计)。
import { random } from "lodash";也不应该工作,对吧?
标签: javascript webpack lodash tree-shaking es6-modules