esm-sync
v3.3.7
Published
Tomorrow's ECMAScript modules today!
Maintainers
Readme
esm-sync
This is a fork of esm: the brilliantly simple, babel-less, bundle-less ECMAScript module loader (which is now unmaintained).
This fork includes:
- Assorted updates from @httptoolkit/esm and esm-wallaby fork, adding support for ES modules containing new ES syntax, supporting modern Node versions (at least up to v22), and supporting
node:*imports. - Support for modules that use the
const require = createRequire(...)pattern (or declare any other globalrequirevariable) which are otherwise unusable withesm. - Support for modules that use only an
exportsmap in their package.json, without amainfield, which are otherwise unresolvable (reporting "Cannot find module", even thoughimport()works correctly). - Built-in types for use in TypeScript projects
This package is maintained for use in the import-sync project.
You may also be interested in jiti, which provides legacy (deprecated, but still reliable) support for synchronous imports.
Install
npm install esm-syncGetting started
There are two ways to enable esm-sync.
Enable
esm-syncfor packages:Use
esm-syncto 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-sync")(module/*, options*/) module.exports = require("./main.js")main.js
// ESM syntax is supported. export {}Enable
esm-syncfor local runs:node -r esm-sync main.js:bulb: Omit the filename to enable
esm-syncin 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-sync options.
Out of the box esm-sync just works, no configuration necessary, and supports:
- Passing all applicable test262 compliance tests
import/exportimport.meta- Dynamic
import - Live bindings
- File URI scheme
- Node
stdin,--eval,--printflags - Node
--checkflag (Node 10+)
Options
Specify options with one of the following:
"esm"field inpackage.json- CJS/ESM in an
.esmrc.js,.esmrc.cjs, or.esmrc.mjsfile - JSON6 in an
.esmrcor.esmrc.jsonfile - JSON6 or file path in the
ESM_OPTIONSenvironment variable ESM_DISABLE_CACHEenvironment variable
DevOpts
Tips
Bundling
For bundlers like
browserify+esmify,parcel-bundler, andwebpackadd a"module"field topackage.jsonpointing to the main ES module."main": "index.js", "module": "main.js":bulb: This is automagically done with
npm init esmoryarn create esm.
Extensions
- Enable
esm-syncforwallaby.jsfollowing their integration example.
Loading
Load
esm-syncbefore loaders/monitors like@babel/register,newrelic,sqreen, andts-node.Load
esm-syncforjasmineusing the"helpers"field injasmine.json:"helpers": [ "node_modules/esm-sync" ]Load
esm-syncwith “node-args" options of:pm2:--node-args="-r esm-sync"
Load
esm-syncwith “require” options ofava,mocha,nodemon,nyc,qunit,tape, andwebpack.:bulb: Builtin
requirecannot sideload.mjsfiles. However,.jsfiles can be sideloaded or.mjsfiles may be loaded with dynamicimport.
