esm
The brilliantly simple, babel-less, bundle-less ECMAScript module loader.
esm is the world’s most advanced ECMAScript module loader.
This fast, production ready, zero dependency loader is all you need to support
ECMAScript modules in Node 6+. See the release
post
Install
__New projects__
Run npm init esm or yarn create esm.
:bulb: Use the -y flag to answer “yes” to all prompts.
__Existing projects__
Run npm i esm or yarn add esm.
Getting started
There are two ways to enable esm.
1. Enable esm for packages:
Use esm to load the main ES module and export it as CommonJS.
__index.js__
- ``` js
- // Set options as a parameter, environment variable, or rc file.
- require = require("esm")(module/*, options*/)
- module.exports = require("./main.js")
- ```
__main.js__
- ``` js
- // ESM syntax is supported.
- export {}
- ```
:bulb: These files are automagically created with npm init esm or yarn create esm.
2. Enable esm for local runs:
- ``` sh
- node -r esm main.js
- ```
:bulb: Omit the filename to enable esm in the REPL.
Features
:clap: By default, :100: percent CJS interoperability is enabled so you can get stuff done.
:lock: .mjs files are limited to basic functionality without support for esm options.
Out of the box esm just works, no configuration necessary, and supports:
Passing all applicable
test262 compliance tests
[import](https://ponyfoo.com/articles/es6-modules-in-depth#import)/[export](https://ponyfoo.com/articles/es6-modules-in-depth#export)
[import.meta](https://github.com/tc39/proposal-import-meta)
[Dynamic import](https://github.com/tc39/proposal-dynamic-import)
Node stdin, [--eval](https://nodejs.org/api/cli.html#cli_e_eval_script), [--print](https://nodejs.org/api/cli.html#cli_p_print_script) flags
Node [--check](https://nodejs.org/api/cli.html#cli_c_check) flag _(Node 10+)_
Options
Specify options with one of the following:
"esm" field in package.json
CJS/ESM in an .esmrc.js, .esmrc.cjs, or .esmrc.mjs file
JSON6 in an
.esmrc or
.esmrc.json file
JSON6 or file path in the ESM_OPTIONS environment variable
ESM_DISABLE_CACHE environment variable
{ |
"cjs":true | A boolean or object for toggling CJS features in ESM. Features { | "cache":true | A boolean for storing ES modules in require.cache . | "esModule":true | A boolean for __esModule interoperability. | "extensions":true | A boolean for respecting require.extensions in ESM. | "mutableNamespace":true | A boolean for mutable namespace objects. | "namedExports":true | A boolean for importing named exports of CJS modules. | "paths":true | A boolean for following CJS path rules in ESM. | "vars":true | A boolean for __dirname , __filename , and require in ESM. | "dedefault":false | A boolean for requiring ES modules without the dangling require().default . | "topLevelReturn":false | A boolean for top-level return support. | } | |
"mainFields":["main"] | An array of fields checked when importing a package. |
"mode":"auto" | A string mode: "auto" detect files with import , import.meta , export ,
"use module" , or .mjs as ESM. "all" files besides those with "use script" or .cjs are treated as ESM. "strict" to treat only .mjs files as ESM. |
"await":false | A boolean for top-level await in modules without ESM exports. (Node 10+) |
"force":false | A boolean to apply these options to all module loads. |
"wasm":false | A boolean for WebAssembly module support. (Node 8+) |
} |
DevOpts
{ |
"cache":true | A boolean for toggling cache creation or a cache directory path. |
"sourceMap":false | A boolean for including inline source maps. |
} |
Tips
Bundling
For bundlers like [browserify](http://browserify.org/)+[esmify](https://github.com/mattdesl/esmify),
[parcel-bundler](https://parceljs.org/), and [webpack](https://webpack.js.org/)
add a "module" field to package.json pointing to the main ES module.
- ``` json
- "main": "index.js",
- "module": "main.js"
- ```
:bulb: This is automagically done with npm init esm or yarn create esm.
Extensions
Enable esm for [wallaby.js](https://wallabyjs.com/) following their
Loading
Load esm before loaders/monitors like
[@babel/register](https://babeljs.io/docs/en/next/babel-register.html),
[newrelic](https://github.com/newrelic/node-newrelic),
[sqreen](https://docs.sqreen.io/sqreen-for-nodejs/getting-started-2/), and
[ts-node](https://github.com/TypeStrong/ts-node#programmatic).
Load esm for [jasmine](https://jasmine.github.io/) using the
["helpers"](https://jasmine.github.io/setup/nodejs.html#configuration)
field in jasmine.json:
- ``` json
- "helpers": [
- "node_modules/esm"
- ]
- ```
* Load `esm` with “node-args" options of:
- [pm2](https://pm2.io/doc/en/runtime/reference/pm2-cli/#pm2-flags): --node-args="-r esm"
Load esm with “require” options of
[ava](https://github.com/avajs/ava/blob/master/docs/recipes/es-modules.md),
[mocha](https://mochajs.org/#-require-module-r-module),
[nodemon](https://nodemon.io/),
[nyc](https://github.com/istanbuljs/nyc#require-additional-modules),
[qunit](https://github.com/qunitjs/qunit/releases/tag/2.6.0),
[tape](https://github.com/substack/tape#preloading-modules), and
[webpack](https://webpack.js.org/api/cli/#config-options).
:bulb: Builtin require cannot sideload .mjs files. However, .js files
can be sideloaded or .mjs files may be loaded with dynamic import.