ts-node 和 mocha 'TypeError [ERR_UNKNOWN_FILE_EXTENSION]:未知文件扩展名“.ts”' 错误,即使使用“ts-node/esm”加载器和 CommonJS 模块

Gur*_*ofu 33 mocha.js typescript ts-node

在提出这个问题之前,我检查了类似的主题并尝试了典型的解决方案。

\n

我知道 TypeScript 配置中的常见原因是什么"module": "ESXXXX"。\n就我而言,我遇到了错误

\n
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for D:\\IntelliJ IDEA\\XXXXXX\\node_modules\\tsconfig-paths\\src\\__tests__\\config-loader.test.ts\n
Run Code Online (Sandbox Code Playgroud)\n

"module": "ESnext"在和两种"module": "CommonJS"情况下。

\n

典型的解决方案之一是使用ts-node/esm。\n首先,此功能是实验性的。接下来,它只是将一个错误替换为另一个错误:

\n
(node:24788) ExperimentalWarning: --experimental-loader is an experimental feature. This feature could change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)\n\n\xc3\x97 ERROR: CustomError: Cannot find module 'D:\\IntelliJ IDEA\\XXXXX\\node_modules\\tsconfig-paths\\register' imported from D:\\IntelliJ IDEA\\XXXXX\\node_modules\\mocha\\lib\\nodejs\\esm-utils.js\n
Run Code Online (Sandbox Code Playgroud)\n

版本

\n
    \n
  • 摩卡:9.2.1
  • \n
  • ts 节点:10.7.0
  • \n
\n

摩卡配置

\n
extension:\n  - ts\n\nspec: "**/*.test.ts"\n\nrequire:\n\n  - ts-node/register\n  - tsconfig-paths/register\n\nloader: ts-node/esm # Tried with and without\n\n
Run Code Online (Sandbox Code Playgroud)\n

mar*_*ndt 23

我使用与您相同的配置,但它仅在我降级到 ts-node@9 时才起作用,然后我在我的中尝试了此选项,.mocharc.json现在它按我的预期工作

{
  "extensions": ["ts"],
  "spec": ["**/*.spec.*"],
  "node-option": [
    "experimental-specifier-resolution=node",
    "loader=ts-node/esm"
  ]
}
Run Code Online (Sandbox Code Playgroud)


chr*_*rkl 12

我遇到了同样的错误,它对我来说设置NODE_OPTIONS环境变量来指定加载器:

NODE_OPTIONS="--loader ts-node/esm" mocha
Run Code Online (Sandbox Code Playgroud)

摘自这里:https ://typestrong.org/ts-node/docs/imports#native-ecmascript-modules

升级到最新版本的 ts-node 10.8.0 也可能有帮助


Nic*_*Guy 8

你有没有tsconfig.json。该解决方案可以在这里提供帮助:

{
  "compilerOptions": {
    "esModuleInterop": true,
  }
}
Run Code Online (Sandbox Code Playgroud)

是一个关于它的有趣线程和替代解决方案。在这种情况下,它tsconfig的包含如下所示:

"include": [
    "./**/*.ts"
]
Run Code Online (Sandbox Code Playgroud)

这两个选项之一应该可行,但请告诉我。不确定你的配置是什么样的。

  • 谢谢你的回答。很抱歉,但是 `"esModuleInterop": true` 没有帮助(我最初有这个选项)。还尝试了 `"include": [ "Source/**/*" ]`。 (6认同)

Zit*_*tRo 7

如果您的任何依赖项是 ES6 模块(!),但您的 TypeScript 目标不是,则可能会发生这种带有mocha/ 的绝对误导性错误。ts-node例如,got@13.0.0安装软件包时:

\n
\xe2\x9c\x97 npm run test      \n\n> @mypackage@1.6.0 test\n> mocha -r ts-node/register tests/**/*.test.ts\n\n\nTypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for /.../tests/index.test.ts\n...\n
Run Code Online (Sandbox Code Playgroud)\n

现在降级到npm i got@11,仍然提供 CommonJS 导出:

\n
npm run test\n\n> @mypackage@1.6.0 test\n> mocha -r ts-node/register tests/**/*.test.ts\n\n// All right\n
Run Code Online (Sandbox Code Playgroud)\n

因此,解决这个恼人错误的“快速修复”可能是降级您刚刚升级的某个软件包(通常是主要版本)。这与gotnode-fetch和其他决定仅发布 ES6 代码的软件包有关。

\n

否则,您必须更新整个测试套件。我不知道针对此问题的mocha+ts-node设置有任何“最终”修复方法。其他一些测试套件与 ES6 deps 开箱即用,或者可以很好地配合使用,在一些项目中,我个人开始使用“transpile-then-test”方法,而不是直接在带有 runtime 的 TypeScript 源上进行vitest测试。playwrightts-node

\n