gpt4 book ai didi

node.js - Nodejs、TypeScript、ts-node-dev 和顶级等待

转载 作者:行者123 更新时间:2023-12-03 12:13:29 25 4
gpt4 key购买 nike

在需要顶级等待之后,我现在花了一个小时寻找新错误的解决方案。到目前为止我尝试过的所有其他方法都没有解决错误,例如添加 "type": "module"到 package.json 文件。
错误消息是Cannot use import statement outside a module启动服务时。
如果我恢复更改 "module": "ESNext","module": "commonjs", ,它工作正常(除了必须删除 await 关键字并以某种方式重构以在没有 await 的情况下工作)。
另外,我使用 ts-node-dev 来运行可以在 package.json 文件中看到的服务。

  • 我需要的新包是 kafkajs。
  • Node 版本: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"]
    }

    最佳答案

    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。并设置 moduleesnext ,这反过来又迫使我设置 moduleResolutionnode最后添加 type: module给我的 package.json .我没有意识到(而且 IMO 他们不应该在错误消息中建议这一点——你可以简单地重构顶级等待),这将 NodeJS 的模块解析策略从 CommonJS 切换到 ESM。这实际上是一件大事,原因有很多:
  • ESM support is still experimental in ts-node
  • Mixing CJS and ESM modules may lead to problems
  • There are open issues with ESM support in NodeJS itself

  • 我觉得此时(2020 年 12 月)NodeJS 生态系统仍在从经典的 CommonJS 模块向新的 ECMAScript 模块过渡。因此,像 ts-node 或 ts-node-dev 这样的其他技术也在过渡,并且支持可能很不稳定。我的建议是坚持使用 CommonJS,直到尘埃落定并且这些东西“开箱即用”。

    关于node.js - Nodejs、TypeScript、ts-node-dev 和顶级等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64610476/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com