哪个TypeScript配置的输出最接近Node.js 18的能力?



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

截至Node.js18.0.0, 100%支持ES2022(除了RegEx.flags中的错误),并且对ES模块的支持是稳定的!如果您知道您的目标是该版本或更新版本,则最佳配置应该是这样的:

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

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

  • "allowSyntheticDefaultImports": true

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

  • "target": "ES2022"

    这告诉TypeScript可以输出带有ES2022特性的JavaScript语法。在实践中,这意味着它将输出逻辑赋值操作符&Async/await语法,而不是嵌入多边形。

  • "lib": ["ES2022"]

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

完整的配置是:

{
"compilerOptions": {
"allowSyntheticDefaultImports": true,
"lib": ["ES2022"],
"module": "ES2022",
"moduleResolution": "node",
"target": "ES2022"
}
}

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

来完成。
{
"type": "module"
}

如果你是从早期版本的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'

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

{
"compilerOptions": {
"lib": ["ES2022"],
"module": "CommonJS",
"target": "ES2022"
}
}

如果你正在运行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的类似回答

最新更新