当使用“ import * as _”时,为什么不能打包web pack tree-shaake lodash?

我正在学习使用Lodash的webpack 4 / React应用程序进行树状摇动。

起初,我的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=developmentwebpack --mode=production调用webpack。

YYM819364374 回答:当使用“ import * as _”时,为什么不能打包web pack tree-shaake lodash?

所有两个现有答案都是错误的,webpack做treeshake import *,但这仅在使用esmodule时发生,而lodash则没有。正确的解决方案是使用lodash-es

,

实际上,它与Webpack的摇树能力无关。基于有关tree-shaking

的Webpack文档

新的webpack 4版本在此功能上进行了扩展,通过“ sideEffects” package.json属性向编译器提供提示,以指示项目中的哪些文件是“纯”的,因此如果不使用它们可以安全地修剪>

根据链接文档在"sideEffects: false上设置package.json时:

上面提到的所有代码都没有副作用,因此我们可以简单地将该属性标记为false,以通知webpack它可以安全地修剪未使用的导出。

如果您知道某些文件或软件包是纯文件或软件包,请将它们添加到sideEffects以便在未使用时进行修剪。还有其他一些解决方法,我可以tree-shaking来阅读Webpack文档上的整个article

其中一种手动方式是使用直接导入,如下所示:

import get from 'lodash/get';

Webpack理解add仅来自整个lodash包。另一个麻烦的是破坏了导入,需要一些Webpack optimization来进行摇动,因此您应该像下面这样导入:

import { get } from 'lodash';

另外,另一种棘手的方法是仅安装特定的软件包,我的意思是:

yarn add lodash.get

OR

npm install --save lodash.get

然后导入,只需写:

import get from 'lodash.get';

当然,这不是摇摇欲坠的事情,它是一种紧密的思维开发方式,但是它导致您只需添加所需的内容即可。

但是

,不要执行上述任何操作,您只需编写import * as _ from "lodash";来添加整个程序包,然后使用_.random或任何函数,并希望Webpack理解您想要的摇树发生了吗?

当然,Webpack运行良好。您应该使用一些配置和编码样式来查看摇树发生的情况。

,

我认为简短的解释是,摇树仅通过分析import语句而不是整个源代码来起作用。因此,import *基本上告诉webpack导入所有导致更大尺寸的内容。

,

如果您已经在使用 Babel,那么正确地摇树 lodash 的最简单方法是使用 official babel-plugin-lodash by the lodash team

这使用 Babel 将您的 lodash 导入重写为更易于摇树的形式。这样做只需不到 5 分钟的时间,我团队的包大小就减少了约 32kB(压缩)。

本文链接:https://www.f2er.com/3147901.html

大家都在问