Giter Club home page Giter Club logo

systemjs's Introduction

SystemJS 2.0

Build Status Gitter Sponsor

Configurable module loader enabling backwards compatibility workflows for ES modules in browsers.

Read the SystemJS 2.0 announcement post

For the previous release see the SystemJS 0.21.x branch

SystemJS is currently sponsored by Canopy Tax.

SystemJS 2.0 provides two hookable base builds:

1. s.js minimal loader

The minimal 1.5KB s.js loader provides a workflow where code written for production workflows of native ES modules in browsers (like Rollup code-splitting builds), can be transpiled to the System.register module format to work in older browsers that don't supporting native modules, including IE11++.

Since the ES module semantics such as live bindings, circular references, contextual metadata, dynamic import and top-level await can all be fully supported this way, while supporting CSP and cross-origin support, this workflow can be relied upon as a polyfill-like path.

  • Loads and resolves modules as URLs, throwing for bare specifier names (eg import 'lodash') like the native module loader.
  • Loads System.register modules.
  • Core hookable extensible loader supporting custom extensions.

2. system.js loader

The 3KB system.js loader loader builds on the s.js core and adds support for upcoming module specifications (currently package name maps and WASM integration with module loading) as well as development and convenience features.

  • Support for loading bare specifier names through package name maps (formerly map configuration), loaded via <script type="system-packagenamemap"> (requires a fetch polyfill for eg IE11).
  • Includes the global loading extra for loading global scripts, useful for loading library dependencies traditionally loaded with script tags.
  • Tracing hooks and registry deletion API for reloading workflows
  • Supports loading WASM based on the .wasm file extension

Extras

The following pluggable extras are provided which can be dropped in with either the s.js or system.js loader:

  • AMD loading support (through Window.define which is created).
  • Global loading support for loading global scripts and detecting the defined global as the default export. Useful for loading common library scripts from CDN like System.import('//unpkg.com/lodash'). (Already included in the system.js loader build).
  • Named exports convenience extension support for global and AMD module formats (import { x } from './global.js' instead of import G from './global.js'; G.x)
  • Named register supports System.register('name', ...) named bundles (deprecated in the main build), that can be imported through a bundle: scheme, System.import('bundle:name')
  • Transform loader support, using fetch and eval, supporting a hookable loader.transform

Since all loader features are hookable, custom extensions can be easily made following the same approach as the bundled extras. See the hooks documentation for more information.

For discussion, join the Gitter Room.

Installation

npm install systemjs

Documentation

Example Usage

Loading a System.register module

<script src="system.js"></script>
<script>
  System.import('/js/main.js');
</script>

where main.js is a module available in the System.register module format.

Bundling workflow

For an example of a bundling workflow, see the Rollup Code Splitting starter project - https://github.com/rollup/rollup-starter-code-splitting.

Package Name Maps

Say main.js depends on loading 'lodash', then we can define a package name map:

<script type="systemjs-packagemap">
{
  "packages": {
    "lodash": "https://unpkg.com/[email protected]/lodash.js"
  }
}
</script>
<!-- Alternatively:
<script type="systemjs-packagemap" src="path/to/map.json">
-->
<!-- SystemJS must be loaded after the package map -->
<script src="system.js"></script>
<script>
  System.import('/js/main.js');
</script>

Browser transpilation

To load ES modules directly in older browsers with SystemJS we can install and use the Babel plugin:

<script src="system.js"></script>
<script src="extras/transform.js"></script>
<script src="plugin-babel/dist/babel-transform.js"></script>
<script>
  // main and all its dependencies will now run through transform before loading
  System.import('/js/main.js');
</script>

Compatibility with Webpack

Code-splitting builds on top of native ES modules, like Rollup offers, are an alternative to the Webpack-style chunking approach - offering a way to utilize the native module loader for loading shared and dynamic chunks instead of using a custom registry and loader as Webpack bundles include. Scope-level optimizations can be performed on ES modules when they are combined, while ensuring no duplicate code is loaded through dynamic loading and code-sharing in the module registry, using the features of the native module loader and its dynamic runtime nature.

There is currently no support for SystemJS in Webpack. If building code using the System global in Webpack, the following config is needed to avoid rewriting:

{
  module: {
    rules: [
      { parser: { system: false } }
    ]
  }
}

Polyfills for Older Browsers

Promises

Both builds of SystemJS need Promises in the environment to work, which aren't supported in older browsers like IE11.

Promises can be conditionally polyfilled using, for example, Bluebird (generally the fastest Promise polyfill):

<script>
  if (typeof Promise === 'undefined')
    document.write('<script src="node_modules/bluebird/js/browser/bluebird.core.js"><\/script>');
</script>

Generally document.write is not recommended when writing web applications, but for this use case it works really well and will only apply in older browsers anyway.

Fetch

To support package maps in the system.js build, a fetch polyfill is need. The GitHub polyfill is recommended:

<script>
  if (typeof fetch === 'undefined')
    document.write('<script src="node_modules/whatwg-fetch/fetch.js"><\/script>');
</script>

Loader Extensions

This list can be extended to include third-party loader extensions. Feel free to post a PR to share your work.

Contributing to SystemJS

Project bug fixes and changes are welcome for discussion, provided the project footprint remains minimal.

To run the tests:

npm run build && npm run test

License

MIT

systemjs's People

Contributors

guybedford avatar peteruithoven avatar josh avatar matthewp avatar probins avatar fictitious avatar justinbmeyer avatar meomix avatar stefanr avatar vladima avatar matthewbauer avatar unional avatar majorbreakfast avatar majhork avatar blink1073 avatar simonykq avatar briandipalma avatar b-strauss avatar casperlamboo avatar orkon avatar theefer avatar munter avatar jpiv avatar joeldenning avatar jayphelps avatar colmbrady avatar crisptrutski avatar blittle avatar asapach avatar teohhanhui avatar

Watchers

Eric Wong avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.