The system-node.cjs
build adds support for loading modules in NodeJS.
npm install --save systemjs
# or
yarn add systemjs
const { System, applyImportMap, setBaseUrl } = require('systemjs');
System.import('file:///Users/name/some-module.js').then(module => {
console.log("The loaded module", module);
});
SystemJS creates a global variable global.System
that loaded modules use by calling System.register()
. Modules may be loaded either from disk (file://
) or network (http://
). A loaded module's code is retrieved and eval'ed.
Since Import Maps are usually installed via the DOM, system-node.cjs provides an alternative API applyImportMap
API to support resolution of bare specifiers.
Separate instances of SystemJS, each with their own import map and module registry, are supported via the new System.constructor()
API.
Additionally, global loading, module types, and the SystemJS Registry API are supported. Other extras, such as the AMD extra, have not been thoroughly tested but are presumed to work.
Modules loaded over HTTP will be loaded via node-fetch.
A reference to the global SystemJS instance. This is referentially equal to global.System
.
const { System } = require('systemjs');
console.log(System === global.System) // true
System.import('file:///Users/name/some-module.js');
System.import('https://example.com/some-module.js');
Multiple instances of SystemJS may be created, each with their own import map and module registry:
const { System } = require('systemjs');
const system1 = new System.constructor();
const system2 = new System.constructor();
Since no DOM is available for import map installation, system-node.cjs provides the applyImportMap
API. Note that calling applyImportMap multiple times on the same SystemJS instance will completely override the import map (not merge).
const { System, applyImportMap } = require('systemjs');
const path = require('path');
const { pathToFileURL } = require('url');
applyImportMap(System, {
imports: {
// File loading
"module-a": "file:///Users/name/a.js",
"module-b": pathToFileURL(path.join(process.cwd(), './b.js')),
// Network loading
"module-c": "https://example.com/c.js",
}
});
System.import('module-a');
// Separate import map for separate SystemJS instance
const otherSystem = new System.constructor();
applyImportMap(otherSystem, {
imports: {
"module-a": "file:///Users/name/other-a.js",
}
});
otherSystem.import('module-a');
By default, relative URLs will be resolved with process.cwd()
as the base URL. If you wish to change the base URL, you may do so:
const { System, setBaseUrl } = require('systemjs');
const path = require('path');
const { pathToFileURL } = require('url');
// relative to process.cwd()
System.resolve('./file.js');
// Use a network URL as the base
setBaseUrl(System, 'https://example.com/base/');
// Use a file URL as the base
setBaseUrl(System, 'file:///Users/name/some-dir/');
setBaseUrl(System, pathToFileURL(path.join(process.cwd(), 'some-dir')) + path.sep);