"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
、 を に設定しmoduleResolution
てnode
、最終的に をtype: module
に追加せざるpackage.json
を得なくなりました。私が気付かなかったのは (そして、私の意見では、エラー メッセージでこれを示唆するべきではありません。トップレベルの await を単にリファクタリングして削除できます)、これによって NodeJS のモジュール解決戦略が CommonJS から ESM に切り替わることです。これは実際には、さまざまな理由で大きな問題です。
現時点では (2020 年 12 月)、NodeJS エコシステムは、従来の CommonJS モジュールから新しい ECMAScript モジュールへの移行中であると感じています。その結果、ts-node や ts-node-dev などの他のテクノロジも移行中で、サポートが不安定になる可能性があります。私のアドバイスは、騒ぎが収まり、これらのものがすぐに「動作する」ようになるまで、CommonJS を使い続けることです。