» npm install cjs-to-es6
CommonJS to ES6 rewrite
How to convert common js to ES6 modules?
How to convert CommonJS require into ES6+ import?
How do you convert CommonJS (CJS) to ES6?
I want to rewrite a application that uses CommonJS modules to ES6 modules in nodejs. It's a simple web app with simple stack (Express, Knex, Mocha, etc) but I will evolve it to a more complex app with more features and modules.
The thing that makes me worry is the current state of the ecosystem and support for ES6 modules in nodejs. Things like drivers for databases, testing frameworks, support libraries (ex: lodash), etc.
Have we passed the point where we can use ES6 modules in nodejs without any problems? Or should I stick with CommonJS for now?
Working with CommonJS modules is pretty straight forward.
You can only do default exports from CommonJS modules.
import packageMain from 'commonjs-package'; // Works
import { method } from 'commonjs-package'; // Errors
This means that all commonjs exports will live on the packageMain object, and you need to dot in to the packageMain object to pickup what you need.
packageMain.method1()
More info in the official nodejs docs
Since Node 13.10, there is another option, the most forward-looking one:
File an issue in the repo of the CommonJS library you'd like to use, persuading the maintainers to publish dual packages (ESM + CommonJS), using conditional exports.
For libraries written in TypeScript, generating dual packages is easy, and doesn't require Babel or rollup or any additional tools. Here's how I did it in local-iso-dt:
Relevant parts of package.json:
{
"name": "local-iso-dt",
"version": "3.1.0",
"description": "...",
"type": "commonjs",
"exports": {
"node": {
"import": "./index.mjs",
"require": "./index.js"
},
"default": "./index.mjs"
},
"main": "index.js",
"files": [
"index.ts",
"index.mjs",
"index.js"
],
"scripts": {
"clean": "rm index*.js index.mjs",
"prepublishOnly:cjs": "tsc index.ts --esModuleInterop --removeComments",
"prepublishOnly:esm": "tsc index.ts -t ES2015 --types node && mv index.js index.mjs",
"prepublishOnly": "npm run prepublishOnly:esm; npm run prepublishOnly:cjs"
},
"devDependencies": {
"typescript": "^4.0.2"
},
}
prepublishOnly:esm renames the output manually because TypeScript can't yet generate .mjs output directly and --outFile doesn't work with ES Modules.
The exports block has the "conditional exports that enable TypeScript code transpiled with ES Modules, to use named imports. TypeScript doesn't directly support .mjs input files.
No tsconfig.json was necessary for this simple module.
» npm install commonjs-to-es-module-codemod