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支持更友好:
- 安装依赖:
npm install c8 --save-dev - 配置测试命令:
{ "scripts": { "test:coverage": "c8 ts-node-esm test/**/*.spec.ts" } }
c8会自动识别TypeScript sourcemap,无需额外复杂配置。
内容的提问来源于stack exchange,提问作者呂學洲
相关产品推荐
相关产品推荐

