哪种 TypeScript 配置会产生最接近 Node.js 18 功能的输出?

Lin*_*äck 48 node.js typescript

我该如何配置 TypeScript 才能利用 Node.js 18 中的所有最新功能?具体来说,我想知道如何获得对 ESM 的全面支持,以及如何使用 ES2021/ES2022 中引入的所有最新语法和函数。

Lin*_*äck 105

从 Node.js 开始18.0.0,100% 支持 ES2022(除了 RegEx.flags 中的错误),并且对 ES 模块的支持稳定!如果您知道您的目标是该版本或更高版本,则最佳配置将如下所示:

  • "module": "ES2022"&"moduleResolution": "node"

    Node.js 18 支持加载模块而不是旧的 CommonJS 格式,我们必须告诉 TypeScript 我们正在使用 Node.js 的规则来解析模块。

  • "allowSyntheticDefaultImports": true

    为了提供向后兼容性,Node.js 允许您使用默认导入来导入 CommonJS 包。该标志告诉 TypeScript 可以import在 CommonJS 模块上使用。

  • "target": "ES2022"

    这告诉 TypeScript 可以输出具有 ES2022 功能的JavaScript语法。实际上,这意味着它将输出逻辑赋值运算符和 async/await 语法,而不是嵌入 polyfill。

  • "lib": ["ES2022"]

    这告诉 TypeScript 可以使用ES2022 或更早版本中引入的函数和属性。实际上,这意味着您可以使用 egPromise.anyString.prototype.replaceAll

完整的配置将是:

{
  "compilerOptions": {
    "allowSyntheticDefaultImports": true,
    "lib": ["ES2022"],
    "module": "ES2022",
    "moduleResolution": "node",
    "target": "ES2022"
  }
}
Run Code Online (Sandbox Code Playgroud)

除此之外,我们还需要告诉 Node.js 将.js这个项目中的文件视为 ES 模块。原因是 Node.js 必须保持与旧 Node.js 版本编写的代码的向后兼容性。这可以通过添加"type": "module"到您的package.json

{
  "type": "module"
}
Run Code Online (Sandbox Code Playgroud)

如果您使用的是早期版本的 Node.js,则另一个变化是导入文件时的文件扩展名现在是强制性的.js这意味着您必须在本地导入的末尾写出。请注意,.js即使您导入的 TypeScript 文件实际上具有文件扩展名 ,也是如此.ts。这可能看起来有点令人困惑,但TS 贡献者之一的评论解释了原因

以下是一些如何撰写import陈述的示例:

// Built-in Node.js modules
import { readFileSync } from 'fs'

// CommonJS packages from Npm
import md5File from 'md5-file'

// The local file "a.ts"
import { a } from './a.js'
Run Code Online (Sandbox Code Playgroud)

如果您现在想坚持使用 CommonJS,为了避免上面解释的警告,您可以使用以下配置:

{
  "compilerOptions": {
    "lib": ["ES2022"],
    "module": "CommonJS",
    "target": "ES2022"
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您运行的是 Node.js 16,您可以在此处查看我对 Node.js 16 的类似答案

如果您正在运行 Node.js 14,您可以在此处查看我对 Node.js 14 的类似答案

如果您正在运行 Node.js 12,您可以在此处查看我对 Node.js 12 的类似答案

如果您正在运行 Node.js 10,您可以在此处查看我对 Node.js 10 的类似答案

如果您正在运行 Node.js 8,您可以在此处查看我对 Node.js 8 的类似答案