Universal dynamic module loader


For upgrading to SystemJS 0.17-0.19, see the SystemJS 0.17 release upgrade notes for more information, or read the updated SystemJS Overview guide.

Universal dynamic module loader - loads ES6 modules, AMD, CommonJS and global scripts in the browser and NodeJS. Works with both Traceur and Babel.

Built on top of the ES6 Module Loader polyfill.

~15KB minified and gzipped, runs in IE8+ and NodeJS.

For discussion, see the Google Group.

For a list of guides and tools, see the Third-Party Resources Wiki.

<script src="system.js"></script>
  // set our baseURL reference path 
    baseURL: '/app'
  // loads /app/main.js 

To load ES6, locate a transpiler (traceur.js, 'browser.js' from Babel, or 'typescript.js' from TypeScript) in the baseURL path, then set the transpiler:

    // or 'traceur' or 'typescript' 
    transpiler: 'babel',
    // or traceurOptions or typescriptOptions 
    babelOptions: {

Alternatively a custom path to Babel or Traceur can also be set through paths:

  map: {
    traceur: 'path/to/traceur.js'

SystemJS relies on Promise and URL being present in the environment. When these are not available it will send a request out to the system-polyfills.js file located in the dist folder which will polyfill window.Promise and window.URLPolyfill.

This is typically necessary in IE, so ensure to keep this file in the same folder as SystemJS.

Alternatively these polyfills can be loaded with a script tag before SystemJS or via other polyfill implementations as well.

To load modules in NodeJS, install SystemJS with:

  npm install systemjs

If transpiling ES6, also install the transpiler:

  npm install traceur babel typescript 

We can then load modules equivalently to in the browser:

var System = require('systemjs');
System.transpiler = 'traceur';
// loads './app.js' from the current directory 
System.import('./app.js').then(function(m) {

If using TypeScript, set global.ts = require('typescript') before importing to ensure it is loaded correctly.

If you are using jspm as a package manager you will also need to load the generated config.js. The best way to do this in node is to get your System instance through jspm, which wil automatically load your config correctly for you:

var System = require('jspm').Loader();
System.import('lodash').then(function (_) {

Supported loader plugins:

  • CSS System.import('my/file.css')
  • Image System.import('some/image.png!image')
  • JSON System.import('some/data.json')
  • Text System.import('some/text.txt!text')

Additional Plugins:

  • Audio System.import('./beep.mp3!audio')
  • CoffeeScript System.import('./')
  • Jade
  • Jade VirtualDOM
  • JSX System.import('template.jsx')
  • Markdown System.import('app/some/project/').then(function(html) {})
  • WebFont System.import('google Port Lligat Slab, Droid Sans !font')
  • Handlebars System.import('template.hbs!')
  • Ember Handlebars System.import('template.hbs!')
  • raw System.import('file.bin!raw').then(function(data) {})
  • jst Underscore templates
  • SASS System.import('style.scss!')

Read about using plugins here Read the guide here on creating plugins.

To install the dependencies correctly, run bower install from the root of the repo, then open test/test.html in a browser with a local server or file access flags enabled.