【问题标题】:Webpack generates arrow function in ES5Webpack 在 ES5 中生成箭头函数
【发布时间】:2025-10-16 19:20:02
【问题描述】:

我想使用 TypeScript 模块并通过 Webpack 捆绑它们。这是我的配置文件:

webpack.config.js:

const path = require('path');

module.exports = () => {
    return {
        entry: './index.ts',
        output: {
            filename: 'bundle.js',
            path: path.resolve(__dirname, 'dist'),
        },
        module: {
            rules: [{
                test: /\.tsx?$/,
                use: 'ts-loader',
                exclude: /node_modules/,
            }],
        },
    };
};

tsconfig.json:

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es3"
  },
  "include": ["./**/*"],
  "exclude": ["node_modules/**/*", "webpack.config.js"]
}

也许我从文档中弄错了。目的是在 ES5(甚至更早)中生成代码。但这是我的捆绑文件:

(()=>{var n=function(n,o){console.warn(o)};n(0,0),n(0,1)})();

它有一个箭头功能,这是在 ES6 中添加的。我很迷惑。我怎样才能摆脱它?


编辑:

这是我尝试编译的代码:

const func = (foo, bar: number) => {
    console.warn(bar);
};

func(0, 0);
func(2, 1);

编辑 2:

另外,我在生产模式下运行编译过程。 (idk,也许这是有用的信息)

【问题讨论】:

  • 是的,这正是我想要的。但我不明白我做错了什么。我添加了代码
  • 你是否按照 webpack.config webpack.js.org/migrate/5987654321@中的描述将目标设置为 es5

标签: javascript typescript webpack ecma


【解决方案1】:

决定只是将target: ['web', 'es5'] 添加到您的 webpack 配置中。

您也可以设置target: 'es5',但在这种情况下,会出现一些问题。至少在我没有指定“web”的情况下,TerserWebpackPlugin 拒绝在生产模式下压缩文件。

【讨论】:

  • 需要注意的是,webpack target 选项是 ment,而不是 typescript target 选项。
【解决方案2】:

这是我上周将 webpack 升级到版本 5 后遇到的问题。

默认情况下,它将其捆绑为 ES6。在您的 webpack 配置中,配置 output.environment 应该可以解决问题。

编辑:webpack 仅通过这些配置更改其内部使用。

webpack.js.org/configuration/output/#outputenvironment

它不编译模块。对于模块编译,应该使用babel。

【讨论】:

  • 感谢您的回答。 webpack 的版本是5.3.2。但是添加environment: 5 会导致错误Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema.
  • 很奇怪,我刚试过,是的,看到同样的错误。
  • 好的,我刚刚意识到环境选项只管理 webpack 的内部使用。它不会编译您的模块。为此,您应该使用 babel 转换器插件。这是您仅配置 webpack 本身的方式。webpack.js.org/configuration/output/#outputenvironment
  • 我有ts-loader。它可以处理模块。也只是摆脱箭头功能似乎是一个拐杖。因为在 ES6 中不仅添加了箭头函数