用Node.js带来了对ES2020的更新支持,并增加了对ES模块的支持,如何配置TypeScript以输出利用所有这些新功能的JavaScript代码?

推荐答案

从Node开始.js 14.0.014.0.0%支持ES2020,对ES模块的支持已经登陆!如果您知道您的目标是该版本或更新版本,那么最佳配置如下所示:

  • "module": "ES2020"&;"moduleResolution": "node"

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

  • "allowSyntheticDefaultImports": true

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

  • "target": "ES2020"

    这告诉TypeScript,可以输出带有ES2020特性的JavaScript syntax.在实践中,这意味着它将输出可选的链接操作符&;异步/等待语法,而不是嵌入polyfill.

  • "lib": ["ES2020"]

    这告诉TypeScript可以使用ES2020或更早版本中引入的functions and properties.实际上,这意味着您可以使用例如Promise.allSettledBigInt.

因此,完整配置将是:

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

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

{
  "type": "module"
}

如果您是从早期版本的Node提交,则另一个更改.那是the file extension when importing files are now mandatory.这意味着您必须在本地进口的末尾填写.js.请注意,这是.js,即使您正在导入一个实际具有文件扩展名.ts的TypeScript文件.这似乎有点让人信服,但this comment from one of the TS contributors explains why that is.

下面是一些如何写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": ["ES2020"],
    "module": "CommonJS",
    "target": "ES2020"
  }
}

如果您正在运行Node.js 16你可以看到我的similar answer for Node.js 16 here

如果您正在运行Node.js 12你可以看到我的similar answer for Node.js 12 here

如果您正在运行Node.js 10你可以看到我的similar answer for Node.js 10 here

如果您正在运行Node.js 8你可以看到我的similar answer for Node.js 8 here

Node.js相关问答推荐

Windows上使用ES6+的OpenAPI规范的Express服务器不接受嵌套路由'

使用Node.js中的";类型";:";模块";不导入文件

尽管 tsconfig 中提供了正确的路径,但仍出现找不到模块错误

合并Shift对象数组以创建最终的排班表

如何在MongoDB中删除嵌套对象数组中的属性?

如何设置 Puppeteer Select 器的唯一性?

node_modules/preact/src/jsx.d.ts:2145:22 - 错误 TS2304:找不到名称SVGSetElement

suppress AWS SDK v2 弃用消息

如何让 vscode 假设一个 node.js 上下文,以便它不假设 `fetch` 存在?

为什么在调用数据库调用时我的参数没有定义?

postman 发送请求……永远

如何在 NodeJS 中获取操作系统用户名?

socket.io 发出回调合适吗?

将 myproject/.npmrc 与注册表一起使用

node/express:使用 Forever 连续运行脚本时设置 NODE_ENV

如何在离线时安装 npm 包?

在单独的模块中定义 Mongoose 模型

如何在express 中设置默认路径(路由前缀)?

在 Node.js 中写入 CSV

nodejs - 临时文件名