我已经花了一个小时,在需要顶层等待之后寻找新错误的解决方案。到目前为止,我尝试过的所有其他操作都无法解决错误,例如将"type": "module"
添加到package.json文件。启动服务时,错误消息为Cannot use import statement outside a module
。
如果我将更改"module": "ESNext",
还原为"module": "commonjs",
,它就可以正常工作(除非必须删除await关键字,并且以某种方式将其重构为无需等待即可工作)。
此外,我使用ts-node-dev来运行可在package.json文件中看到的服务。
package.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"]
}
答案 0 :(得分:0)
TL; DR :请勿将ECMAScript模块与ts-node或ts-node-dev(尚未使用)一起使用;只需重构顶层等待状态
今天,从无害的错误开始,我跌倒了同一个兔子洞:
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
中。我没有意识到(并且IMO他们不应该在错误消息中建议这一点-您只需重构顶层等待状态),就可以将NodeJS的模块解析策略从CommonJS切换到ESM。实际上,由于许多原因,这很重要:
我觉得在这个时候(2020年12月),NodeJS生态系统仍在从经典的CommonJS模块过渡到新的ECMAScript模块。结果,其他技术(例如ts-node或ts-node-dev)也在过渡,并且支持可能不稳定。我的建议是坚持使用CommonJS,直到尘埃落定并且这些东西“开箱即用”为止。