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
相关产品推荐
相关产品推荐

