Home

Awesome

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 and video for details!

Install

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

    // Set options as a parameter, environment variable, or rc file.
    require = require("esm")(module/*, options*/)
    module.exports = require("./main.js")
    

    main.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:

    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.<br> :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:

Options

Specify options with one of the following:

<table> <tr> <td colspan="2"><code>{</code></td> </tr> <tr> <td valign="top"><code>"cjs":true</code></td> <td> <p>A boolean or object for toggling CJS features in ESM.</p> <details> <summary>Features</summary> <table> <tr> <td colspan="2"><code>{</code></td> </tr> <tr> <td valign="top"><code>"cache":true</code></td> <td> <p>A boolean for storing ES modules in <code>require.cache</code>.</p> </td> </tr> <tr> <td valign="top"><code>"esModule":true</code></td> <td> <p>A boolean for <code>__esModule</code> interoperability.</p> </td> </tr> <tr> <td valign="top"><code>"extensions":true</code></td> <td> <p>A boolean for respecting <code>require.extensions</code> in ESM.</p> </td> </tr> <tr> <td valign="top"><code>"mutableNamespace":true</code></td> <td> <p>A boolean for mutable <a href="https://ponyfoo.com/articles/es6-modules-in-depth#import-all-the-things">namespace objects</a>.</p> </td> </tr> <tr> <td valign="top"><code>"namedExports":true</code></td> <td> <p>A boolean for <a href="https://ponyfoo.com/articles/es6-modules-in-depth#importing-named-exports">importing named exports</a> of CJS modules.</p> </td> </tr> <tr> <td valign="top"><code>"paths":true</code></td> <td> <p>A boolean for following CJS <a href="https://github.com/nodejs/node-eps/blob/master/002-es-modules.md#432-removal-of-non-local-dependencies">path rules</a> in ESM.</p> </td> </tr> <tr> <td valign="top"><code>"vars":true</code></td> <td> <p>A boolean for <code>__dirname</code>, <code>__filename</code>, and <code>require</code> in ESM.</p> </td> </tr> <tr> <td valign="top"><code>"dedefault":false</code></td> <td> <p>A boolean for requiring ES modules without the dangling <code>require().default</code>.</p> </td> </tr> <tr> <td valign="top"><code>"topLevelReturn":false</code></td> <td> <p>A boolean for top-level <code>return</code> support.</p> </td> </tr> <tr> <td colspan="2"><code>}</code></td> </tr> </table> </details> </td> </tr> <tr> <td valign="top"><code>"mainFields":["main"]</code></td> <td> <p>An array of fields checked when importing a package.</p> </td> </tr> <tr> <td valign="top"><code>"mode":"auto"</code></td> <td> <p>A string mode:</p> <ul> <li><code>"auto"</code> detect files with <code>import</code>, <code>import.meta</code>, <code>export</code>,<br><a href="https://github.com/tc39/proposal-modules-pragma"><code>"use module"</code></a>, or <code>.mjs</code> as ESM.</li> <li><code>"all"</code> files besides those with <code>"use script"</code> or <code>.cjs</code> are treated as ESM.</li> <li><code>"strict"</code> to treat <strong>only</strong> <code>.mjs</code> files as ESM.</li> </ul> </td> </tr> <tr> <td valign="top"><code>"await":false</code></td> <td> <p>A boolean for <a href="https://github.com/tc39/proposal-top-level-await">top-level <code>await</code></a> in modules without ESM exports. <em>(Node 10+)</em></p> </td> </tr> <tr> <td valign="top"><code>"force":false</code></td> <td> <p>A boolean to apply these options to all module loads.</p> </td> </tr> <tr> <td valign="top"><code>"wasm":false</code></td> <td> <p>A boolean for <a href="https://nodejs.org/api/globals.html#globals_webassembly">WebAssembly</a> module support. <em>(Node 8+)</em></p> </td> </tr> <tr> <td colspan="2"><code>}</code></td> </tr> </table>

DevOpts

<table> <tr> <td colspan="2"><code>{</code></td> </tr> <tr> <td valign="top"><code>"cache":true</code></td> <td> <p>A boolean for toggling cache creation or a cache directory path.</p> </td> </tr> <tr> <td valign="top"><code>"sourceMap":false</code></td> <td> <p>A boolean for including inline source maps.</p> </td> </tr> <tr> <td colspan="2"><code>}</code></td> </tr> </table>

Tips

Bundling

Extensions

Loading