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

package.json含type:module时nyc mocha无法统计TypeScript代码覆盖率

保留"type": "module"配置时解决Mocha+NYC TypeScript覆盖率0%的方案

核心原因

当项目启用"type": "module"后,Node.js默认以ES模块(ESM)方式解析文件,但NYC(Istanbul)原生对ESM的支持需要额外配置,同时Mocha和TypeScript的ESM适配也需要同步调整,否则覆盖率工具无法正确追踪TS编译后的ESM代码。


步骤1:安装必要依赖

确保安装适配ESM的工具包:

npm install --save-dev @istanbuljs/esm-loader-hook ts-node @types/mocha mocha nyc typescript

步骤2:调整NYC配置

在package.json中添加NYC配置,指定ESM加载器、TS文件扩展名及需要统计的文件范围:

{
  "nyc": {
    "extends": "@istanbuljs/nyc-config-typescript",
    "include": ["src/**/*.ts"],
    "exclude": ["src/**/*.spec.ts"],
    "extension": [".ts"],
    "esm": true,
    "all": true
  }
}

也可以单独创建.nycrc.json文件存放上述配置。

步骤3:配置Mocha以支持ESM

创建.mocharc.json文件,指定TS的ESM加载器和测试文件匹配规则:

{
  "loader": "ts-node/esm",
  "spec": ["src/**/*.spec.ts"],
  "extension": ["ts"]
}

也可以直接在package.json的mocha字段中配置。

步骤4:修正TSConfig配置

确保tsconfig.json的编译选项适配ESM:

{
  "compilerOptions": {
    "module": "ESNext",
    "moduleResolution": "NodeNext",
    "target": "ES2020",
    "esModuleInterop": true,
    "skipLibCheck": true,
    "outDir": "./dist"
  },
  "include": ["src/**/*"]
}

关键是module设为ES系列,moduleResolution对应NodeNext或Node16,和type": "module"匹配。

步骤5:更新测试命令

在package.json的scripts中修改测试命令,让NYC通过ESM加载器启动Mocha:

{
  "scripts": {
    "test": "nyc --loader=@istanbuljs/esm-loader-hook mocha"
  }
}

验证

运行npm test后,NYC应该能正确统计TypeScript代码的覆盖率,不再显示0%。如果仍有问题,检查:

  • 所有TS文件是否都在NYC的include范围内
  • 测试文件是否正确导入了被测试的ESM模块
  • 确保没有其他配置冲突(比如同时存在CommonJS和ESM的混合配置)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:07:40