NodeJS中的Babel无法使用扩展运算符

6

我正在使用 Babel(7.5.0 版)和 NodeJS 最新版(12.x)。因此,扩展运算符已经被 NodeJS 处理了,我不希望 babel 对其进行处理。

这是我的 .babelrc 文件:

{
    "plugins": [
        "@babel/plugin-proposal-class-properties",
        "@babel/plugin-transform-runtime"
    ],
    "presets": [
        [
            "@babel/preset-env",
            {
                "modules": "commonjs",
                "targets": {
                    "node": "current"
                },
                "useBuiltIns": "usage"
            }
        ]
    ]
}

这是我的错误:

ERROR in ./src/utils/logger/logger.js
Module build failed: ReferenceError: Unknown helper objectSpread2
    at loadHelper (/app/node_modules/@babel/helpers/lib/index.js:238:27)
    at Object.getDependencies (/app/node_modules/@babel/helpers/lib/index.js:279:21)
    at File.addHelper (/app/node_modules/@babel/core/lib/transformation/file/file.js:204:33)
    at PluginPass.addHelper (/app/node_modules/@babel/core/lib/transformation/plugin-pass.js:31:22)
    at PluginPass.ObjectExpression (/app/node_modules/@babel/plugin-proposal-object-rest-spread/lib/index.js:379:25)
    at newFn (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/visitors.js:193:21)
    at NodePath._call (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/path/context.js:53:20)
    at NodePath.call (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/path/context.js:40:17)
    at NodePath.visit (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/path/context.js:88:12)
    at TraversalContext.visitQueue (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/context.js:118:16)
    at TraversalContext.visitMultiple (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/context.js:85:17)
    at TraversalContext.visit (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/context.js:144:19)
    at Function.traverse.node (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/index.js:94:17)
    at NodePath.visit (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/path/context.js:95:18)
    at TraversalContext.visitQueue (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/context.js:118:16)
    at TraversalContext.visitMultiple (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/context.js:85:17)
    at TraversalContext.visit (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/context.js:144:19)
    at Function.traverse.node (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/index.js:94:17)
    at NodePath.visit (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/path/context.js:95:18)
    at TraversalContext.visitQueue (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/context.js:118:16)
    at TraversalContext.visitSingle (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/context.js:90:19)
    at TraversalContext.visit (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/context.js:146:19)
    at Function.traverse.node (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/index.js:94:17)
    at NodePath.visit (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/path/context.js:95:18)
    at TraversalContext.visitQueue (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/context.js:118:16)
    at TraversalContext.visitMultiple (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/context.js:85:17)
    at TraversalContext.visit (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/context.js:144:19)
    at Function.traverse.node (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/index.js:94:17)
    at NodePath.visit (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/path/context.js:95:18)
    at TraversalContext.visitQueue (/app/node_modules/@babel/core/node_modules/@babel/traverse/lib/context.js:118:16)
 @ ./src/app.js 5:0-40
 @ multi ./src/app.js

我读到需要安装一些插件,但我认为那是针对较旧的nodejs版本,我不明白为什么要为内置在nodejs中的功能安装插件。
如何做到这一点?
更新:
我在这里创建了一个问题:https://github.com/babel/babel-loader/issues/798

1
我必须使用这个插件吗?即使是NodeJS 12.x? - HRK44
1
我不确定。我没有检查过。让我深入研究一下,然后在这里添加我的发现评论。 - Usama Tahir
我可以在 Node 版本 v10.16.0 中成功使用 spread 运算符。 - Usama Tahir
那么你的意思是它不能与Node v12.x一起使用,但在v10.16.0上可以正常工作? - Bilal
你为什么要在Node中使用Babel呢?直接编写计划使用的代码即可,不需要进行转译。 - Intervalia
显示剩余2条评论
1个回答

7

我是Babel的维护者。

我们在v7.5.0中发现了一个bug(将很快在v7.5.1中修复)。你有两个可能的解决方法:

  1. Run npm install @babel/helpers (or with yarn): this will force npm to download @babel/helpers v7.5.0, which contains the missing helper. If you are also using @babel/transform-runtime, make usre that @babel/runtime is v7.5.0
  2. If you are using yarn, you can lock @babel/plugin-proposal-object-rest-spread to an older version which isn't affected by the issue. Add this code to your package.json:

    "resolutions": {
      "**/@babel/plugin-proposal-object-rest-spread": "7.4.4"
    }
    

编辑 此问题已在v7.5.1中修复,请更新


3
喜欢在 Stack Overflow 上找到一个七分钟前发布的关于我一直苦苦挣扎了三十分钟的问题的答案 :)。 - seangwright
我已经尝试安装@babel/helpers,但没有效果,我只得到调用不同版本的spreadoperator2。现在我得到了“'@babel/runtime/helpers/objectSpread2'不存在”的错误,这意味着它正在运行时而不是helpers中查找该模块。 - Jono
@jQwierdy,看起来你又发现了一个助手的 bug(Babel 应该知道它不在 @babel/runtime 中,并将其内联注入)。我会更新我的答案。 - Nicolò
1
这个问题应该在v7.5.1中已经修复了。还有另一个已知的bug尚未解决(运行时助手在旧版浏览器中无法正常工作,需要使用getOwnPropertyDescriptors的polyfill)。 - Nicolò
@Nicolò那ReferenceError: _objectSpread未定义的解决方案是什么? - Serge K
1
@Nicolò 我正在使用babel-loaderwebpack 3.x,更新到最新版本后仍然遇到相同的问题。 - HRK44

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接