systemjs/docs/production-build.md

63 lines
2.9 KiB
Markdown

## SystemJS Production Build
The SystemJS production build supports loading `System.register` and `System.registerDynamic` modules using
script tag loading, while also keeping support for Web Assembly when enabled via `System.config({ wasm: true })`.
The configuration options of `baseURL`, `paths`, `map`, `depCache` and `bundles` are supported identically to the
full development build, and as documented at the [configuration API page](config-api.md).
For contextual map configuration, the production build permits objects in the map configuration which act just
like package maps, allowing mappings within the package.
### Resolution Algorithm
The following is a detailed description of the production loader resolution algorithm in full, which can
also help to understand the SystemJS development build resolution as this resolution is a subset of that,
although with some subtle differences as well.
#### Plain Names
An important concept in the resolution algorithm is one of `plain names` or `bare names` as they are referred
to in the WhatWG loader specification. These are module names that do not start with `/` or `./` or `../` and
do not parse as URLs (`new URL(name)` fails).
#### Resolution Phases
The overall process of resolution is based on the steps for a given module `name`, being resolved to `parentName`.
If the module import is a top-level `System.import` call then `parentName` is set to the environment _baseURI_.
_paths_, _map_, and _contextual map_ targets are all fully normalized into URLs by the configuration system before running
the resolution algorithm, where the _map_ and _contextual map_ configurations themselves are normalized through _paths resolution_
if plain names.
**Core Resolution:**
_If a plain name, resolve with plain name resolution, otherwise resolve as a URL._
1. If `name` is not a _plain name_:
1. Return the URL resolution of `name` relative to `parentName`
1. Otherwise, if `name` is a _plain name_:
1. Return the _plain name resolution_ for `name` relative to `parentName`
**Plain name resolution:**
_Apply contextual map, then global map, then paths resolution._
1. If `parentName` is a _contextual map_ parent:
1. If `name` matches any of the contextual maps for `parentName`:
1. Set `name` to the mapping of the most specific _contextual map_ match in `name` replaced with its map target.
1. If `name` is still a _plain name_:
1. If `name` matches any of the _global map_ mappings:
1. Set `name` to the mapping of the most specific _global map_ match in `name` replaced with its map target.
1. If `name` is defined in the loader registry, return `name`
1. Otherwise, return the _paths resolution_ of `name`
**Paths resolution:**
_Apply paths, then baseURL at the very end only if still a plain name._
1. If `name` matches any _paths_:
1. Return the mapping of the most specific _paths_ match in `name` replaced with its paths target.
1. If `name` is still a _plain name_:
1. Return `baseURL` + `name`.