Skip to main content

ECMAScript (ESM) vs CommonJS (CJS)

Basics​

This document provides a very basic overview, please refer to the linked references for more information.

What is a module?​

A module is simply a JavaScript or TypeScript file.

What is module system?​

A module is a collection of JavaScript code written in a file. A module's variables, functions are not available for use unless they are exported from the module file.

There are two main module systems:

How to determine my module system?​

Look at the type field in package.json.

The "type" field defines the module format that Node.js uses for all .js files that have that package.json file as their nearest parent - Node.js

info

CommonJS is used if type field is not defined.

ESM​

package.json
{
"type":"module"
}

CJS​

package.json
{
"type":"commonjs"
}

Import in CJS vs ESM​

ESM: Imports should end with a extension.

vs

CJS: I don't care!

info

In the case of TypeScript or JavaScript, please use the extension .js

import { helper } from "./foo"; // ❌ only works in CJS

import { helper } from "./foo.js"; // ✅ works in ESM & CJS