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

poc*_*iej 6 node.js babeljs

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

我的 .babelrc 是这样的

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "node": true
        }
      }
    ]
  ]
}
Run Code Online (Sandbox Code Playgroud)

所以我预计 babel 输出将与当前节点兼容。不幸的是 babel 输出继续使用require语法而不是import所以不能在节点 14 上运行,这会引发错误

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)
Run Code Online (Sandbox Code Playgroud)

知道我做错了什么吗?

小智 6

节点

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

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

示例:1

{
  "targets": "current"
}
Run Code Online (Sandbox Code Playgroud)

示例:2

{
  "targets": true
}
Run Code Online (Sandbox Code Playgroud)

示例:3

{
  "targets": "process.versions.node"
}
Run Code Online (Sandbox Code Playgroud)

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

{
  "targets": "node 12" // not recommended
}
Run Code Online (Sandbox Code Playgroud)

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

{
  "targets": "node 12.0"
}
Run Code Online (Sandbox Code Playgroud)

信息从这里传来!


whe*_*rom 5

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

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets":{"node":"14"},
        "modules": false,
      }
    ]
  ]
}
Run Code Online (Sandbox Code Playgroud)

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