You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在VS Code中调试Mocha+TypeScript+ESM项目

解决VS Code调试TypeScript ES模块Mocha测试的ERR_UNKNOWN_FILE_EXTENSION问题

问题

配置VS Code调试TypeScript ES模块项目的Mocha测试时,添加experimental-specifier-resolution=node参数后触发ERR_UNKNOWN_FILE_EXTENSION,提示无法加载node_modules/mocha/bin/_mocha(无扩展名文件)。

已用临时方案(不推荐)

  • 移除launch.json中的experimental-specifier-resolution=node参数
  • 给所有TypeScript导入手动添加.js扩展名

环境

  • Node.js v19.3.0
  • npm v9.2.0
  • 项目包含完整配置文件与测试代码

优雅解决方案

方案1:调整Mocha执行入口与调试配置

直接调用Mocha带扩展名的核心入口文件,避免加载无扩展名的_mocha文件,同时保留Node的模块解析行为:

  1. 更新.vscode/launch.json:
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Mocha Tests",
      // 用带扩展名的cli入口替代无扩展名的_mocha
      "program": "${workspaceFolder}/node_modules/mocha/lib/cli/cli.js",
      "args": [
        "--require", "ts-node/register/esm",
        "${workspaceFolder}/test/**/*.spec.ts"
      ],
      "runtimeArgs": [
        "--experimental-specifier-resolution=node",
        "--loader", "ts-node/esm"
      ],
      "console": "integratedTerminal",
      "internalConsoleOptions": "neverOpen"
    }
  ]
}
  1. 确保项目配置正确:
  • package.json中设置"type": "module"
  • tsconfig.json启用ES模块:
{
  "compilerOptions": {
    "module": "ESNext",
    "moduleResolution": "node",
    "target": "ES2020",
    "esModuleInterop": true,
    "outDir": "./dist"
  },
  "include": ["src/**/*", "test/**/*"]
}

方案2:修复自定义Loader逻辑

如果必须使用自定义loader.mjs,需要明确处理Mocha的无扩展名CommonJS文件:

import { readFile } from 'fs/promises';
import { fileURLToPath } from 'url';

export async function load(url, context, defaultLoad) {
  // 拦截mocha的无扩展名文件,按CommonJS格式加载
  if (url.includes('node_modules/mocha/bin/_mocha')) {
    const filePath = fileURLToPath(url);
    const content = await readFile(filePath, 'utf8');
    return { format: 'commonjs', source: content };
  }
  // 其他文件使用默认加载逻辑
  return defaultLoad(url, context, defaultLoad);
}

然后在launch.json的runtimeArgs中添加该loader:

"runtimeArgs": [
  "--experimental-specifier-resolution=node",
  "--loader", "${workspaceFolder}/loader.mjs",
  "--loader", "ts-node/esm"
]

内容的提问来源于stack exchange,提问作者Peter Riesz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:42:09