javascript - 为什么 webpack 4 包含单个命名导入的整个文件?

标签 javascript webpack webpack-4 tree-shaking

给定以下两个文件:

//a.js
export const X = /*#__PURE__*/ "X";

const a = function () {
  return "About a!";
};
a.foo = function () {
  return "foo";
};
export default a;

//main.js
import { X } from "./a";
import { Y } from "./b";

console.log(X, Y);

我已经添加了

  • "sideEffect": falsepackage.json
  • optimization.usedExports: truewebpack.config.js

但是运行 webpack -p 仍然会在包中包含整个 a.js 文件。 Rollup 仅包含来自 a.js ( demo )

X

删除 a.foo 定义“修复”了问题,但不是演示存储库之外的解决方案。 我读过 tree-shaking文档页面多次,阅读 [关于 webpack 问题跟踪器上关于 tree shaking 的无数问题,我仍然无法弄清楚以下内容:

  • 为什么未使用 X 上的 /*#__PURE__*/ 标记?
  • 有没有办法将 webpack 配置为仅包含来自 a.js 的 X?

您还可以查看 sandbox repository查看完整的 webpack 配置和相应的 next.js/react 问题(请参阅 pages/index.jsx),这导致我遇到了这个特定问题。

最佳答案

提高issue之后在 webpack 的问题跟踪器上 ~sokra提供了一个答案:

Seems like a single compression pass in terser is not enough to compress this code.

默认遍数为 1,但一旦提高到 3,a.js 不再完全内联。这就是如何以更长的构建时间为代价来实现的。

const TerserWebpackPlugin = require("terser-webpack-plugin");

/** @type {import("webpack").Configuration} */
module.exports = {
    optimization: {
        minimizer: [
            new TerserWebpackPlugin({
                terserOptions: {
                    compress: {
                        passes: 3
                    }
                }
            })
        ]
    }
}

关于javascript - 为什么 webpack 4 包含单个命名导入的整个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62168548/

相关文章:

javascript - ES6 何时使用 String.raw 代替默认模板文字

Javascript 记录错误

reactjs - React Nextjs : Module parse failed:You may need an appropriate loader to handle this file type, 当前没有配置加载器来处理这个文件

webpack - 如何在 webpack 中使用多个配置文件?

javascript - 使用 Javascript 重复数组中的值的函数

javascript - 如何替换字符串中字符的最后一个实例?

javascript - 如何在没有 bundler 的情况下使用此包

javascript - 将 Facebook Web SDK 与 ReactJS 组件状态集成

npm - 如何使用全局安装的webpack?

webpack - 来自 webpack 的 DataCloneError