c8 vs nyc: Which Node Coverage Tool for CI?
c8 reads native V8 coverage with no instrumentation; nyc (istanbul) instruments code for precise, configurable reports.
c8 uses Node's built-in V8 coverage to report without instrumenting source, which is fast and ESM-friendly. nyc is the istanbul CLI that instruments code for detailed, highly configurable coverage, the long-standing Node standard.
| c8 | nyc | |
|---|---|---|
| Method | Native V8 coverage | istanbul instrumentation |
| Speed | Fast (no instrument) | Slower |
| ESM support | Seamless | Works (config) |
| Accuracy/config | Good, fewer knobs | Very precise, configurable |
| Maturity | Modern | Established standard |
In CI
c8 is the faster, lower-friction choice: it reads V8's own coverage data with no build-time instrumentation and handles ESM seamlessly, which trims coverage time. nyc instruments source for very precise, configurable line/branch reporting and integrates with many setups. If speed and ESM matter, c8; if you need fine-grained istanbul reporting and config, nyc.
Coverage in CI
Set a coverage threshold to gate regressions and upload the report to your coverage service. Both add work on top of tests; faster managed runners shorten coverage-heavy runs regardless of tool.
The verdict
Want fast, ESM-friendly coverage with minimal config: c8. Need precise, highly configurable istanbul reports: nyc. For modern ESM projects c8 is often the simpler win; nyc stays strong for detailed reporting.