Back to blog

ES Modules Dominates 2026: Why CommonJS Is Being Abandoned and How to Migrate

Hello HaWkers, 2026 is being called "the year of ES Modules". Important libraries are removing CommonJS support, and the community is finally converging on a single module system.

Do you still use require() in your code? This might be the time to rethink your strategy. Let's understand why this change is happening and how to prepare.

The History of Modules in JavaScript

CommonJS (2009)

Node.js introduced CommonJS, the first popular module system:

// Exporting
module.exports = {
    sum: (a, b) => a + b,
    multiply: (a, b) => a * b,
};

// Importing
const math = require('./math');
console.log(math.sum(2, 3)); // 5

ES Modules (2015+)

ECMAScript 2015 introduced ES Modules as the official standard:

// Exporting
export const sum = (a, b) => a + b;
export const multiply = (a, b) => a * b;

// Importing
import { sum, multiply } from './math.js';
console.log(sum(2, 3)); // 5

Why CommonJS Is Being Abandoned

1. Performance

ES Modules allow tree-shaking and static optimizations:

// CommonJS - Bundler doesn't know what you use
const lodash = require('lodash'); // Imports EVERYTHING

// ESM - Bundler removes unused code
import { map } from 'lodash-es'; // Imports ONLY map

Result:

  • CommonJS bundle: 70KB
  • ESM bundle: 2KB

2. Async and Top-Level Await

ES Modules natively support async:

// ESM - Top-level await works
const config = await fetch('/config.json').then((r) => r.json());
export const apiUrl = config.apiUrl;

3. Browser Compatibility

ES Modules work natively in browsers:

<script type="module">
    import { Component } from './component.js';
    new Component().render();
</script>

What Is Happening in 2026

Libraries Removing CommonJS

Many popular libraries have announced or completed migration:

Library CJS Status
chalk Removed v5+
node-fetch Removed v3+
execa Removed v6+
got Removed v12+
ora Removed v6+

Modern Tools

Modern tools prioritize or require ESM:

  • Vite: ESM-first
  • Astro: ESM-only
  • SvelteKit: ESM-only
  • Nuxt 3: ESM-first

How to Migrate from CommonJS to ESM

Step 1: Update package.json

{
    "name": "my-project",
    "version": "1.0.0",
    "type": "module"
}

Step 2: Convert Imports

// BEFORE (CommonJS)
const express = require('express');

// AFTER (ESM)
import express from 'express';

Step 3: Convert Exports

// BEFORE (CommonJS)
module.exports = { myFunction };

// AFTER (ESM)
export { myFunction };

Step 4: Update Extensions

In ESM, extensions are required:

// ESM (extension required)
import utils from './utils.js';

Migration Checklist

Before migrating:
[ ] Check if all dependencies support ESM
[ ] Backup project
[ ] Set up test environment

During migration:
[ ] Add "type": "module" to package.json
[ ] Convert require() to import
[ ] Convert module.exports to export
[ ] Add .js extensions to relative imports
[ ] Update __dirname and __filename
[ ] Test each module individually

After migration:
[ ] Run all tests
[ ] Verify production build
[ ] Test on different Node.js versions
[ ] Update documentation

Conclusion

Migration to ES Modules is not just a trend, it's a necessity. With important libraries abandoning CommonJS and modern tools requiring ESM, 2026 is the time to make the transition.

The benefits are clear: better performance, tree-shaking, browser compatibility, and alignment with the official JavaScript standard.

Let's go! 🦅

Comments (0)

This article has no comments yet 😢. Be the first! 🚀🦅

Add comments