Nodejs、TypeScript、ts-node-dev、トップレベルのawait 質問する

Nodejs、TypeScript、ts-node-dev、トップレベルのawait 質問する

"type": "module"トップレベルの await が必要になった後、新しいエラーの解決策を探すのに 1 時間費やしました。package.jsonファイルへの追加など、これまで試した他のすべての方法ではエラーは解決されませんでした。

エラー メッセージは、Cannot use import statement outside a moduleサービスを開始するときに表示されます。変更"module": "ESNext",を に戻すと"module": "commonjs",、正常に動作します (ただし、await キーワードを削除し、何らかの方法でリファクタリングして await なしで動作するようにする必要があります)。

さらに、package.json ファイルで確認できるサービスを実行するために ts-node-dev を使用します。

  • 必要な新しいパッケージは kafkajs です。
  • ノードバージョン: v14.9.0
  • TypeScript バージョン: 4.0

パッケージ.json

{
  "name": "",
  "version": "1.0.0",
  "description": "microservice",
  "main": "src/index.ts",
  "author": "",
  "type": "module",
  "license": "MIT",
  "scripts": {
    "dev": "NODE_ENV=development tsnd --respawn --files src/index.ts",
    "prod": "NODE_ENV=production tsnd --respawn --transpile-only --files src/index.ts",
    "test": "mocha --exit -r ts-node/register tests/**/*.spec.ts",
    "eslint": "eslint src/**/*.ts"
  },

tsconfig.json

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "ESNext",
    "moduleResolution": "node",
    "outDir": "dist",
    "sourceMap": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true
  },
  "ts-node": {
    "files": true,
    "transpileOnly": true
  },
  "include": ["src/**/*.ts", "declariations/**.d.ts"],
  "exclude": ["node_modules", ".vscode"]
}

ベストアンサー1

要約: ECMAScriptモジュールをts-nodeまたはts-node-devで使用しないでください(まだ)。トップレベルのawaitをリファクタリングするだけです。

今日、私は無害なエラーから始まり、同じウサギの穴に落ちてしまいました:

Top-level 'await' expressions are only allowed when the 'module' option is set to 'esnext' or 'system', and the 'target' option is set to 'es2017' or higher.

その結果、 を編集してtsconfig.jsonに設定したいとmodule思いesnext、 を に設定しmoduleResolutionnode、最終的に をtype: moduleに追加せざるpackage.jsonを得なくなりました。私が気付かなかったのは (そして、私の意見では、エラー メッセージでこれを示唆するべきではありません。トップレベルの await を単にリファクタリングして削除できます)、これによって NodeJS のモジュール解決戦略が CommonJS から ESM に切り替わることです。これは実際には、さまざまな理由で大きな問題です。

現時点では (2020 年 12 月)、NodeJS エコシステムは、従来の CommonJS モジュールから新しい ECMAScript モジュールへの移行中であると感じています。その結果、ts-node や ts-node-dev などの他のテクノロジも移行中で、サポートが不安定になる可能性があります。私のアドバイスは、騒ぎが収まり、これらのものがすぐに「動作する」ようになるまで、CommonJS を使い続けることです。

おすすめ記事