Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/charto/cbuild

Use SystemJS with npm instead of jspm
https://github.com/charto/cbuild

nodejs systemjs

Last synced: about 2 months ago
JSON representation

Use SystemJS with npm instead of jspm

Awesome Lists containing this project

README

        

![cbuild](doc/logo.png)

[![build status](https://travis-ci.org/charto/cbuild.svg?branch=master)](http://travis-ci.org/charto/cbuild)
[![dependency status](https://david-dm.org/charto/cbuild.svg)](https://david-dm.org/charto/cbuild)
[![npm version](https://img.shields.io/npm/v/cbuild.svg)](https://www.npmjs.com/package/cbuild)

`cbuild` allows publishing leaner [SystemJS](https://github.com/systemjs/systemjs)-based apps and packages
running without build tools.
`npm` itself can pull all required frontend and backend dependencies.

Normally you would use `jspm` which also users of your package must install.
It's very powerful but has some drawbacks if plain `npm` is enough for your use case:

- `jspm` pulls another over 90 packages and 15 megabytes of code with it.
- ... downloads another separate copy of all required Node.js modules into a different directory structure.
- ... involves a large `config.js`, parts of which are manually edited (so belong to version control)
and other parts autogenerated from `package.json` fields (so preferably omitted from version control).

`cbuild` instead uses Node.js module resolution to find packages installed using `npm` without additional configuration.
Only the manually edited parts are needed in `config.js`.

How does it work?
-----------------

`cbuild` simply passes your SystemJS `config.js` to [`systemjs-builder`](https://github.com/systemjs/builder),
which bundles your main JavaScript file with its dependencies.
`cbuild` adds a hook to look up any missing files using [`browser-resolve`](https://github.com/defunctzombie/node-browser-resolve).

That means you can still use `jspm` as before but you don't have to reinstall all your npm packages with it,
because `cbuild` also automatically looks inside `node_modules`.
Simple package deduplication is natively handled by `npm@3` or the `dedupe` command in `npm@2`.

For more complicated scenarios, the full power of SystemJS is still available for loading and bundling.

`cbuild` supports the `browser` field in `package.json`.
It can also generate a minimal `config.js` for SystemJS to load packages without having to bundle them.

Usage
-----

Add in the `scripts` section of your `package.json`:

```json
"scripts": {
"cbuild": "cbuild"
}
```

Then run the commands:

```bash
npm install --save-dev cbuild
npm run cbuild -- -o bundle.js
```

This generates a new file `bundle.js` with all code required to load the file
defined in the `browser` (or `main` if `browser` is missing) field of `package.json`.
You can also set the file on the command line with the `--source` option.

Run `npm run cbuild -- --help` to see the command line options:

```
Usage: cbuild [options]

SystemJS node module bundling tool

Options:

-V, --version output the version number
-b, --builder-config specify SystemJS builder configuration file
-d, --debug [flag] use development environment
-m, --map add package to mappings
-s, --source main JavaScript source to bundle
-p, --package directory with package.json and config.js
-o, --out write output bundle to file
-C, --out-config write path mappings to new config file
-I, --include-config merge another file into new config file
-q, --quiet [flag] suppress terminal output
-v, --verbose [flag] print dependency tree of bundled files
-x, --static [flag] create static (sfx) bundle
-h, --help output usage information
```

The `--builder-config` option accepts a JSON file containing
[SystemJS builder bundle options](https://github.com/systemjs/builder/blob/master/docs/api.md#bundle-options) and
[SystemJS configuration options](https://github.com/systemjs/systemjs/blob/master/docs/config-api.md#configuration-api)
structured like:

```JavaScript
{
// Bundle options, for example:
"minify": true,

"config": {
// Configuration options, for example:
"buildCSS": false
}
}
```

API
===
Docs generated using [`docts`](https://github.com/charto/docts)
>
>
> ### Interface [`Branch`](#api-Branch)
> Dependency tree branch, used for makeTree() output.
> Source code: [`<>`](http://github.com/charto/cbuild/blob/77b2a6f/src/cbuild.ts#L222-L225)
>
> Properties:
> > **.0**? string
> >  File name.
>
>
> ### Interface [`BuildItem`](#api-BuildItem)
> systemjs-builder diagnostics for a single input file.
> Source code: [`<>`](http://github.com/charto/cbuild/blob/50a7bec/src/typings-custom.d.ts#L10-L27)
>
> Properties:
> > **.name** string
> > **.path** string
> > **.metadata** { [key: string]: any; }
> > **.deps** string[]
> >  List of imports.
> > **.depMap** { [name: string]: string; }
> >  Table mapping imports to their paths inside the bundle.
> > **.source** string
> > **.fresh** boolean
> > **.timestamp** number
> > **.configHash** string
> > **.runtimePlugin** boolean
> > **.pluginConfig** any
> > **.packageConfig** any
> > **.isPackageConfig** any
> > **.deferredImports** any
>
>
> ### Interface [`BuildOptions`](#api-BuildOptions)
> Options object for the build function.
> Source code: [`<>`](http://github.com/charto/cbuild/blob/77b2a6f/src/cbuild.ts#L13-L31)
>
> Properties:
> > **.debug**? boolean
> >  If true, set NODE_ENV to development.
> > **.sfx**? boolean
> >  If true, create static (sfx) bundle.
> > **.bundlePath**? string
> >  Bundled file to output.
> > **.sourcePath**? string
> >  Main source file to bundle.
> > **.outConfigPath**? string
> >  Output config mapping other package names to their main source files.
> > **.mapPackages**? string[]
> >  Map additional packages in output config.
>
>
> ### Interface [`BuildResult`](#api-BuildResult)
> systemjs-builder diagnostics for the entire bundle.
> Source code: [`<>`](http://github.com/charto/cbuild/blob/50a7bec/src/typings-custom.d.ts#L31-L43)
>
> Properties:
> > **.source** string
> >  Bundled output file contents.
> > **.sourceMap** string
> > **.modules** string[]
> >  List of bundled files.
> > **.entryPoints** string[]
> >  List of files intended to be imported from the bundle(?).
> > **.tree** { [path: string]: BuildItem; }
> > **.assetList** any
> >  Other non-JavaScript files included in the bundle.
> > **.bundleName** string
>
>
> ### Function [`build`](#api-build)
> Bundle files from package in basePath according to options.
> Source code: [`<>`](http://github.com/charto/cbuild/blob/77b2a6f/src/cbuild.ts#L98-L218)
> > **build( )** Bluebird<[BuildResult](#api-BuildResult)> [`<>`](http://github.com/charto/cbuild/blob/77b2a6f/src/cbuild.ts#L98-L218)
> >  ▪ basePath string
> >  ▫ options? [BuildOptions](#api-BuildOptions)
>
>
> ### Function [`makeTree`](#api-makeTree)
> Extract a dependency tree from the build function result object.
> Returns a nameless root item.
> Each item is a list of a file name and its child items.
> Uses Breadth-First Search to print shortest import chain to each file.
> Source code: [`<>`](http://github.com/charto/cbuild/blob/77b2a6f/src/cbuild.ts#L232-L279)
> > **makeTree( )** [Branch](#api-Branch) [`<>`](http://github.com/charto/cbuild/blob/77b2a6f/src/cbuild.ts#L232-L279)
> >  ▪ result [BuildResult](#api-BuildResult)

License
=======

[The MIT License](https://raw.githubusercontent.com/charto/cbuild/master/LICENSE)

Copyright (c) 2016-2018 BusFaster Ltd