Dynamically loads ES6 modules in browsers and NodeJS with support for loading existing and custom module formats through loader hooks.
This project implements dynamic module loading through System
exactly to the previous ES6-specified loader API at 2014-08-24 ES6 Specification Draft Rev 27, Section 15 and will continue to track this API as it is re-drafted as a browser specification (currently most likely to be at https://github.com/whatwg/loader).
- Provides an asynchronous loader (
System.import
) to dynamically load ES6 modules. - Uses Traceur for compiling ES6 modules and syntax into ES5 in the browser with source map support.
- Fully supports ES6 circular references and live bindings.
- Includes
baseURL
andpaths
implementations. - Can be used as a tracing tool for static analysis of modules.
- Polyfills ES6 Promises in the browser with an optionally bundled ES6 promise implementation.
- Supports ES6 module loading in IE8+. Other ES6 features only supported by Traceur in IE9+.
- The complete combined polyfill, including ES6 promises, comes to 9KB minified and gzipped, making it suitable for production use, provided that modules are built into ES5 making them independent of Traceur.
For an overview of build workflows, see the production guide.
For an example of a universal module loader based on this polyfill for loading AMD, CommonJS and globals, see SystemJS.
The current version is tested against Traceur 0.0.79.
- A brief overview of ES6 module syntax
- Configuring the loader
- Production workflows
- Circular References & Bindings
- Extending the loader through loader hooks
- Tracing API
Download both es6-module-loader.js and traceur.js into the same folder.
If using ES6 syntax (optional), include traceur.js
in the page first then include es6-module-loader.js
:
<script src="traceur.js"></script>
<script src="es6-module-loader.js"></script>
Write an ES6 module:
mymodule.js:
export class q {
constructor() {
console.log('this is an es6 class!');
}
}
We can then load the module with the dynamic loader:
<script>
System.import('mymodule').then(function(m) {
new m.q();
});
</script>
The dynamic loader returns a Module
object, which contains getters for the named exports (in this case, q
).
As well as defining window.System
, this polyfill provides support for the <script type="module">
tag:
<script type="module">
// loads the 'q' export from 'mymodule.js' in the same path as the page
import { q } from 'mymodule';
new q(); // -> 'this is an es6 class!'
</script>
Because it is only possible to load ES6 modules with this tag, it is not suitable for production use in this way.
See the demo folder in this repo for a working example demonstrating both module loading the module tag in the browser.
npm install es6-module-loader
For use in NodeJS, the Loader
and System
globals are provided as exports:
index.js:
var System = require('es6-module-loader').System;
System.import('some-module').then(function(m) {
console.log(m.p);
});
some-module.js:
export var p = 'NodeJS test';
Running the application:
> node index.js
NodeJS test
In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using grunt.
Also, please don't edit files in the "dist" subdirectory as they are generated via grunt. You'll find source code in the "lib" subdirectory!
Copyright (c) 2014 Luke Hoban, Addy Osmani, Guy Bedford
Licensed under the MIT license.