javascript - 如何使用顶级等待将 TypeScript 编译为 JavaScript?

标签 javascript node.js typescript top-level-await

我想利用自 TypeScript 3.8 以来可用的顶级等待在 NodeJS 应用程序中。

因此,以下 TypeScript 代码:

import { getDoctorsPage } from "./utils/axios.provider";
const page = await getDoctorsPage("047", "1", "1");
console.log(page);

编译为这段 JavaScript 代码:

import { getDoctorsPage } from "./utils/axios.provider";
const page = await getDoctorsPage("047", "1", "1");
console.log(page);
//# sourceMappingURL=index.js.map

当我尝试在 WebStorm 中运行它时,出现以下错误:

(node:95053) ExperimentalWarning: The ESM module loader is experimental.
file:///Users/anatoly/Documents/git/maccabi-parser/dist/index.js:2
const page = await getDoctorsPage("047", "1", "1");
             ^^^^^

SyntaxError: Unexpected reserved word
    at Loader.moduleStrategy (internal/modules/esm/translators.js:81:18)
    at async link (internal/modules/esm/module_job.js:37:21)

最新的 NodeJS 0.13.* 支持吗?

我的tsconfig.json

{
  "compilerOptions": {
    "target": "es2020",
    "module": "esnext",
    "pretty": true,
    "sourceMap": true,
    "outDir": "dist",
    "importHelpers": true,
    "strict": true,
    "moduleResolution": "node",
    "esModuleInterop": true,
    "rootDir": "src",
    "noImplicitAny": false,
    "strictNullChecks": false,
    "noImplicitThis": true,
    "alwaysStrict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": false,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": true,
    "baseUrl": "./",
    "allowSyntheticDefaultImports": true,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "resolveJsonModule": true
  },
  "include": [
    "src/**/*"
  ],
  "exclude": [
    "node_modules",
    "dist"
  ]
}

并且 package.json 包含 "type": "module"

最佳答案

如评论中所述,此功能不仅取决于 TS 的版本,还取决于 WebPack 的版本(如果使用 WebPack)和是否存在 V8 标志 --js-flags="-- harmony-top-level-await" 在程序执行期间或在配置中。

在启用此标志的情况下执行此代码可以按照注释中的说明完成:

node -r dotenv/config --harmony-top-level-await --es-module-specifier-resolution=node dist/index.js

关于javascript - 如何使用顶级等待将 TypeScript 编译为 JavaScript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61103455/

相关文章:

javascript - 尝试通过填写对象来理解函数和回调范围

javascript - 如何在使用 jQuery 重新加载页面后淡入和淡出成功消息?

javascript - GWT:如何从纯 js 访问它的 web 服务?

javascript - 使用服务器端和客户端渲染的单页 ReactJS 应用程序?

node.js - 是否可以使用 node.js 和加密来签署 Passbook list ?

node.js - 如何使用 Typescript Express 应用程序渲染 Lit Element Web 组件?

javascript - TypeScript:使用扩展运算符设置 Object.prototype

node.js - 使用 Sequelize.js 和 PostgreSQL 查询关联模型上的 JSONB 字段

node.js - 手动构建 URL 是否存在风险?

typescript - Webpack 4 缓存 splitChunks 所以它们不会每次都被处理