Static Builds with Rollup Optimization
To build our component for use in other projects, we can use the SystemJS static build to create an optimized component file to share.
This is handled via jspm build
in jspm which takes similar arguments to jspm bundle
, but instead of storing
a registry entry for each module, it will try to fully optimize the inter-module dependencies.
Whenever there are sub-trees of ES modules within the build tree, SystemJS Builder will inline any of these trees together using Rollup. This allows unused exports to be removed via code tree analysis. If the whole module tree consists only of ES modules, then the entire tree can be inlined with Rollup, giving the best possible code optimization.
In case it is not already obvious, Rollup is amazing.
Let's create a dist
folder then output a built component into this folder:
jspm build jspm-react-component/component.js dist/jspm-react-component.js \
--externals react
--format umd --global-name jspmReactComponent --global-deps "{'react':'React'}" --skip-source-maps
To break down the options we've provided:
- On the first line, we indicate we want to build the module
jspm-react-component/component.js
into the output build filedist/jspm-react-component.js
. --externals react
indicates that React should be excluded from the build as a dependency.--format umd
outputs a built file that will work as AMD, CommonJS or a global.--global-name jspmReactComponent
means that when running as a global, it will createglobal.jspmReactComponent
as the value ofjspm-react-component
--global-deps "{'react':'React'}"
indicates that our dependency onreact
should refer to the globalReact
when running as a global.--skip-source-maps
since we don't need references to the original sources anymore we can skip source map generation.
Neither --global-name
nor --global-deps
would have been necessary if running a CJS, AMD or ESM format build.
We should then see the following output in the console:
Creating the single-file build for jspm-react-component/component.js...
┌─ jspm-react-component/component.js
├─ npm:systemjs-plugin-babel@0.0.12/babel-helpers/classCallCheck.js
├─ npm:systemjs-plugin-babel@0.0.12/babel-helpers/possibleConstructorReturn.js
├─ npm:systemjs-plugin-babel@0.0.12/babel-helpers/createClass.js
└─ npm:systemjs-plugin-babel@0.0.12/babel-helpers/inherits.js
ok Fully-optimized - entire tree built via Rollup static optimization.
ok Built into dist/jspm-react-component.js, unminified as umd.
Fully-optimized indicates that the entire tree has been built with Rollup, including inlining the Babel transform helpers.
The full output of this file can be seen at https://github.com/guybedford/jspm-react-component-demo/blob/master/dist/jspm-react-component.js.
By default builds, like bundles, build for the browser in production. We can pass the
--node
or--dev
options to both the build and bundle commands to build the Node and development conditional paths respectively. These conditional loading techniques are covered in the last two sections.