如何使用 babel 和节点 14 进行构建?

How to build with babel and node 14?

提问人:chilly_maximus 提问时间:1/15/2021 最后编辑:chilly_maximus 更新时间:2/1/2022 访问量:5360

问:

我正在尝试使用 babel 和目标节点 14.15.4 构建我的项目

我的 .babelrc 是这样的

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "node": true
        }
      }
    ]
  ]
}

所以我预计 babel 输出将与当前节点兼容。不幸的是,babel 输出一直使用语法而不是 so,因此无法与节点 14 一起运行,这会引发错误requireimport

require("./server.js");
^

ReferenceError: require is not defined
    at file:///Users/grzegorz/Projects/charts/server/dist/index.js:3:1
    at ModuleJob.run (internal/modules/esm/module_job.js:152:23)
    at async Loader.import (internal/modules/esm/loader.js:166:24)
    at async Object.loadESM (internal/process/esm_loader.js:68:5)

知道我做错了什么吗?

node.js babeljs

评论

1赞 loganfsmyth 1/15/2021
节点 14 绝对可以运行代码,只是不能将文件加载为 ESM 模块。请发布完整的错误并详细说明您如何运行代码。require
0赞 chilly_maximus 1/15/2021
@loganfsmyth我更新了 odescirption,因此您可以看到完整的错误。事实上,源正在加载文件作为 en ESM 模块。然而,这是存在的,因为巴别塔的转译不正确。我运行代码,然后.requireimportbabel src/ -d distnode dist/index.js
1赞 loganfsmyth 1/15/2021
您可以传递到 旁边 .Babel 无法知道你是想要 ESM 还是 CommonJS 中的文件输出,因为 Node 同时支持两者。modules:falsepreset-envtargets
0赞 chilly_maximus 1/15/2021
谢谢@loganfsmyth。但是,也许我误解了某些东西,但是在 babel 文档中可以找到“您可以指定 ”node“: true 或 ”node“: ”current“,这与 ”node“: process.versions.node 相同”。所以 babel 知道我想为节点 14.15.4 构建,因此知道 require('./server.js') 会抛出错误,但仍然知道输出无法运行。
1赞 chilly_maximus 1/21/2021
好的,package.json中有“type”:“module”,这就是:)的原因

答:

5赞 wheredidthatnamecomefrom 12/19/2021 #1

下面将告诉 babel 不要转换模块:

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets":{"node":"14"},
        "modules": false,
      }
    ]
  ]
}

在此庄园中生成的模块代码将不包含互操作胶水。 是关键。没有它,babel 非常坚持将 CommonJS 兼容语法转译为。此选项禁用所有模块语法转换。此选项会丢弃可兼容性胶水并需要使用。"modules": false

6赞 Daniel 2/1/2022 #2

节点

类型:字符串 |“当前” |真。

如果要针对当前节点版本进行编译,可以指定 “node”: true 或 “node”: “current”,这与 “node”: process.versions.node 相同。

示例:1

{
  "targets": "current"
}

示例:2

{
  "targets": true
}

示例:3

{
  "targets": "process.versions.node"
}

或者,您可以在 browserslist 查询中指定节点版本:

{
  "targets": "node 12" // not recommended
}

由于 Node.js 可能在次要版本中支持新的语言功能,因此为 Node.js 12.22 生成的程序可能会在 Node.js 12.0 上引发语法错误。我们建议您始终指定次要版本。

{
  "targets": "node 12.0"
}

信息来自这里!

评论

1赞 Joe Bowbeer 3/27/2022
如果将 targets 指定为要支持的最低环境版本的对象,则:“如果未指定次要版本,Babel 会将其解释为 MAJOR.0。例如,“node”: 12 将被视为 Node.js 12.0 babeljs.io/docs/en/options#targets