Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/standard-things/esm
Tomorrow's ECMAScript modules today!
https://github.com/standard-things/esm
es6 es6-modules esm esmodules nodejs
Last synced: 3 days ago
JSON representation
Tomorrow's ECMAScript modules today!
- Host: GitHub
- URL: https://github.com/standard-things/esm
- Owner: standard-things
- License: other
- Created: 2017-05-25T16:46:17.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2024-04-10T19:03:12.000Z (8 months ago)
- Last Synced: 2024-10-29T10:54:53.591Z (about 1 month ago)
- Topics: es6, es6-modules, esm, esmodules, nodejs
- Language: JavaScript
- Homepage:
- Size: 9.9 MB
- Stars: 5,272
- Watchers: 57
- Forks: 147
- Open Issues: 85
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome - standard-things/esm - Tomorrow's ECMAScript modules today! (JavaScript)
- awesome - esm - Tomorrow's ECMAScript modules today! (JavaScript)
- awesome-github-star - esm - things | 5252 | (JavaScript)
- awesome-list - esm - things | 4997 | (JavaScript)
- awesome-nodejs - esm - ECMAScript 模块加载器。 ![](https://img.shields.io/github/stars/standard-things/esm.svg?style=social&label=Star) (GIT 仓库 / ES Module)
README
# 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](https://medium.com/web-on-the-edge/tomorrows-es-modules-today-c53d29ac448c)
and [video](https://www.youtube.com/watch?v=JcZ-FzfDq8A#t=5) for details!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:
```shell
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](https://github.com/tc39/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)
* [Live bindings](https://ponyfoo.com/articles/es6-modules-in-depth#bindings-not-values)
* [File URI scheme](https://en.wikipedia.org/wiki/File_URI_scheme)
* 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](https://github.com/d3x0r/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
, andrequire
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 withimport
,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
[integration example](https://wallabyjs.com/docs/integration/node.html#es-modules).
### 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`.