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

Node.js v14中使用ESM+TypeScript及解决测试覆盖率统计问题

Node.js v14 ESM+TypeScript下nyc覆盖率收集问题解决方案

依赖版本调整

  • 升级nyc至15.1.0及以上版本(该版本开始提供ESM基础支持)
  • 替换第三方esm-loader-hook为官方的@istanbuljs/esm-loader-hook
  • 确保ts-node(10.x版本)、typescript适配Node.js v14的ESM规范

tsconfig.json关键补充配置

必须开启sourcemap,这是nyc映射TS到JS覆盖率数据的核心前提:

{
  "compilerOptions": {
    "module": "ES2020",
    "moduleResolution": "node",
    "target": "ES2020",
    "esModuleInterop": true,
    "sourceMap": true,
    "outDir": "./dist",
    "skipLibCheck": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "test/**/*"]
}

nyc配置(.nycrc或package.json的nyc字段)

禁用自动instrumentation,改用官方loader处理ESM代码:

{
  "extends": "@istanbuljs/nyc-config-typescript",
  "instrument": false,
  "sourceMap": false,
  "loader": "@istanbuljs/esm-loader-hook",
  "exclude": [
    "**/*.d.ts",
    "test/**/*",
    "dist/**/*"
  ]
}

测试命令修改

Node.js v14需显式启用实验性ESM支持,结合ts-node-esm执行测试:

{
  "scripts": {
    "test:coverage": "nyc --experimental-modules ts-node-esm test/**/*.spec.ts"
  }
}

备选方案:改用c8工具

若nyc仍无法正常工作,推荐使用c8——基于Node.js内置V8 Coverage的工具,对ESM支持更友好:

  1. 安装依赖:npm install c8 --save-dev
  2. 配置测试命令:
{
  "scripts": {
    "test:coverage": "c8 ts-node-esm test/**/*.spec.ts"
  }
}

c8会自动识别TypeScript sourcemap,无需额外复杂配置。

内容的提问来源于stack exchange,提问作者呂學洲

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:46:12