Part of HTTP Toolkit: powerful tools for building, testing & debugging HTTP(S)
This is a forked version of the esm package: the brilliantly simple, babel-less, bundle-less ECMAScript module loader (which is now unmaintained). This fork includes:
- Assorted updates from the esm-wallaby fork adding support for ES modules containing new ES syntax, supporting modern Node versions (at least up to v21), and supporting
node:*
imports. - Support for modules that use the
const require = createRequire(...)
pattern (or declare any other globalrequire
variable) which are otherwise unusable withesm
. - Support for modules that use only an
exports
map in their package.json, without amain
field, which are otherwise unresolveable (reporting "Cannot find module", even thoughimport()
works correctly).
Run npm i @httptoolkit/esm
or yarn add @httptoolkit/esm
.
There are two ways to enable @httptoolkit/esm
.
-
Enable
@httptoolkit/esm
for packages:Use
@httptoolkit/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("@httptoolkit/esm")(module/*, options*/) module.exports = require("./main.js")
main.js
// ESM syntax is supported. export {}
-
Enable
@httptoolkit/esm
for local runs:node -r @httptoolkit/esm main.js
💡 Omit the filename to enable
@httptoolkit/esm
in the REPL.
👏 By default, 💯 percent CJS interoperability is enabled so you can get stuff done.
🔒 .mjs
files are limited to basic functionality without support for @httptoolkit/esm
options.
Out of the box @httptoolkit/esm
just works, no configuration necessary, and supports:
- Passing all applicable test262 compliance tests
import
/export
import.meta
- Dynamic
import
- Live bindings
- File URI scheme
- Node
stdin
,--eval
,--print
flags - Node
--check
flag (Node 10+)
Specify options with one of the following:
"esm"
field inpackage.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
|
||||||||||||||||||||||
"mainFields":["main"] |
An array of fields checked when importing a package. |
||||||||||||||||||||||
"mode":"auto" |
A string mode:
|
||||||||||||||||||||||
"await":false |
A boolean for top-level |
||||||||||||||||||||||
"force":false |
A boolean to apply these options to all module loads. |
||||||||||||||||||||||
"wasm":false |
A boolean for WebAssembly module support. (Node 8+) |
||||||||||||||||||||||
} |
{ |
|
"cache":true |
A boolean for toggling cache creation or a cache directory path. |
"sourceMap":false |
A boolean for including inline source maps. |
} |
-
For bundlers like
browserify
+esmify
,parcel-bundler
, andwebpack
add a"module"
field topackage.json
pointing to the main ES module."main": "index.js", "module": "main.js"
💡 This is automagically done with
npm init esm
oryarn create esm
.
- Enable
@httptoolkit/esm
forwallaby.js
following their integration example.
-
Load
@httptoolkit/esm
before loaders/monitors like@babel/register
,newrelic
,sqreen
, andts-node
. -
Load
@httptoolkit/esm
forjasmine
using the"helpers"
field injasmine.json
:"helpers": [ "node_modules/@httptoolkit/esm" ]
-
Load
@httptoolkit/esm
with “node-args" options of:pm2
:--node-args="-r @httptoolkit/esm"
-
Load
@httptoolkit/esm
with “require” options ofava
,mocha
,nodemon
,nyc
,qunit
,tape
, andwebpack
.💡 Builtin
require
cannot sideload.mjs
files. However,.js
files can be sideloaded or.mjs
files may be loaded with dynamicimport
.