HomeReadTactics deskNode.js ESM Migration: Renaming .js to .cjs Fixes 11 Files
Tactics·Jun 10, 2026

Node.js ESM Migration: Renaming .js to .cjs Fixes 11 Files

A founder outlines a direct playbook for resolving Node.js CJS/ESM migration errors. The core tactic involves file renaming to bypass type: "module" parsing rules. Migrating a 42-file internal…

A founder outlines a direct playbook for resolving Node.js CJS/ESM migration errors. The core tactic involves file renaming to bypass type: "module" parsing rules.

Migrating a 42-file internal tooling repository from CommonJS to ES Modules took one founder three hours of fallout after a four-second flag flip, according to a recent post on dev.to. The author details a specific approach to navigating ERR_REQUIRE_ESM and ERR_MODULE_NOT_FOUND errors, centering on a file extension decision map and a reproducible error script.

The reported strategy focuses on resolving common parsing conflicts that arise when "type": "module" is introduced into a package.json file. This change dictates how .js files are interpreted, often leading to incompatibility with existing require() or module.exports statements.

Parsing Rules for Node.js Modules

The central insight from the post is a clear rule for how Node.js versions 20-24 parse JavaScript files based on the "type" field in package.json. If "type": "module" is present, all .js files are treated as ES Modules (ESM). If the field is absent or set to "type": "commonjs", .js files are parsed as CommonJS (CJS).

Crucially, the .cjs and .mjs extensions override this package.json setting. Files ending in .cjs are always CJS, and files ending in .mjs are always ESM, regardless of the "type" field. This distinction is presented as a decision map, offering a direct way to manage module formats. The founder claims this single move, renaming .js to .cjs, fixed 11 of their 42 files in seconds.

Reproducing Migration Errors

The author advocates for a verification-first approach to understanding these errors. A repro.sh shell script is provided, designed to create a minimal Node.js project, introduce the "type": "module" flag, and then trigger and display the common ERR_REQUIRE_ESM and ReferenceError: require is not defined in ES module scope errors. This script allows developers to observe the failures firsthand, aiding in pattern recognition for future debugging.

This hands-on reproduction serves to demystify the errors, moving beyond theoretical explanations to concrete, observable failures. The script is presented as a tool to quickly identify the root causes of module resolution issues, particularly when dependencies or existing codebases are not immediately ready for a full ESM conversion.

What We'd Change

The core tactic of renaming .js files to .cjs is effective for isolating legacy CJS code within an otherwise ESM project. However, this approach primarily addresses immediate migration pain rather than promoting a full transition to ESM. For projects aiming for a complete ESM ecosystem, relying heavily on .cjs files introduces a permanent dual-module maintenance burden.

While the founder claims a 15-minute fix to get

The investor read

The detailed technical content on Node.js module migration highlights an ongoing challenge in the developer tooling ecosystem. The shift from CommonJS to ES Modules represents significant technical debt for many organizations, creating a market for solutions that simplify or automate these transitions. Companies building tools for dependency management, build process optimization, or static analysis that specifically address module interoperability could see increased demand. The value of highly specific, actionable technical content, like this dev.to post, also underscores its role in community building and lead generation for developer-focused products.

Sources · how we verified
  1. Node.js "type": "module" vs CommonJS: 7 Real Errors and the .cjs/.mjs Fix Map (2026)

Every claim ties to a primary source. See our methodology.

Reported by the Maya desk on Founderr Pulse’s Tactics beat. Every factual claim is tied to a primary source and linked; anything that can’t be stood up doesn’t run. Founderr (RIKHATH LLC) is the accountable publisher and corrects in place. How we work · About · File a correction.
M
Maya

The Maya desk covers tactics: concrete playbooks, growth experiments, and operating decisions indie founders are running now. Every claim is sourced and linked. Operated by Founderr (RIKHATH LLC) See the desk →

Founderr Pulse — free & independent. The desk for people who build & back.