Home

Awesome

@dojo/cli-build-webpack

WARNING This package is deprecated in favor of functionality found elsewhere in Dojo 2 (@dojo/cli-build-app and @dojo/cli-build-widget). This package is not being further developed at this time as its feature set is redundant with other capabilities.

Build Status Build status codecov npm version

Usage

To use @dojo/cli-build in a single project, install the package:

npm install @dojo/cli-build-webpack

to use @dojo/cli-build-webpack in every project, install the project globally:

npm install -g @dojo/cli-build-webpack

Features

@dojo/cli-build-webpack is an optional command for the @dojo/cli.

Building

To build a Dojo 2 application for publishing:

dojo build webpack

This command will output the built files to the dist directory. After running this command, you can open the dist/index.html file to see your application.

You can also build in watch mode, which will automatically rebuild your application when it changes:

dojo build webpack -w

When using watch mode, you can specify a port, or port range, to use when determining which port to serve your application on.

# a single port
dojo build webpack -w --port=8080

# a list of ports
dojo build webpack -w --port=8080,8181

# a range of ports
dojo build webpack -w --port=9010:9000

The watch server will use the first unused port in the list you specified. Default port range is 9990-9999.

@dojo/cli-build-webpack can be customized further. Use the help option to see everything you can do:

dojo build webpack --help

Building a custom element

@dojo/cli-build-webpack can also build custom web elements as per the custom web v1 specification. Custom elements are built by providing the name of a custom element descriptor.

dojo build webpack --element=src/path/to/createTheSpecialElement.ts

This will output a dist/the-special directory containing:

If the source file does not follow the pattern create[custom element]Element, @dojo/cli-build-webpack cannot determine what the name of the custom element should be. In this case, you can specify the --elementPrefix option to explicitly name the element.

dojo build webpack --element=src/path/to/element.ts --elementPrefix=the-special

Feature optimization

This command supports the ability to optimize code based on statically asserted features. The tool can search the source code for modules that attempt to detect features using a @dojo/has type of API. By supplying a feature set (or sets) on the command line, the build will optimize code branches, making the code smaller and more efficient. This allows targeting of particular platforms.

When specifying multiple feature sets, if they do not align, the tool will not optimize the source code for these feature sets and will instead continue to leave that feature to be detected at run-time.

From the command line, the feature sets are provided to the -f or --feature argument. The available feature sets are aligned to platforms. The currently available feature sets are:

Feature SetDescription
androidThis feature set represents Android 5+ with integrated Chrome browser. Note it is not suitable for Android 4.4.
chromeThis feature set represents Chrome 59+ or Opera 46+<sup>1</sup>
edgeThis feature set represents Edge 15+<sup>1</sup>
firefoxThis feature set represents Firefox 54+<sup>1</sup>
ie11This feature set represents Internet Explorer 11
iosThis feature set represents iOS 10.3+<sup>2</sup>
nodeThis feature set represents Node.js 6/7<sup>2</sup>
node8This feature set represents Node.js 8+
safariThis feature set represents Safari 10+<sup>2</sup>

<span id="note-1">[1]:</span> Many of these features were present in earlier versions, but the specific version was the GA release at the time of writing when this was validated.

<span id="note-2">[2]:</span> At least one of the features was not present in previous releases.

Instead of sniffing for a browser, the feature sets are a static set of features that are expressed as flags in the @dojo modules. The current set of flags are:

FlagDescription
arraybufferSupports ArrayBuffer
blobSupports the blob response type for XHR requests
dom-mutationobserverSupports MutationObserver
es-observableSupports ES Observable proposal
es2017-objectSupports ES2017 Object features
es2017-stringSupports ES2017 String features
es6-arraySupports ES2015 Array features (except .fill)
es6-array-fillSupports a non-buggy version of Array.prototype.fill()
es6-mapSupports ES2015 Map
es6-mathSupports ES2015 Math features (except .imul
es6-math-imulSupports a non-buggy version of Math.imul()
es6-objectSupports ES2015 Object features
es6-promiseSupports ES2015 Promise
es6-setSupports ES2015 Set
es6-stringSupports ES2015 String features (except .raw()
es6-string-rawSupports a non-buggy version of String.raw()
es6-symbolSupports ES2015 Symbol
es6-weakmapSupports ES2015 WeakMap
es7-arraySupports ES2016 Array features
fetchSupports the fetch API
filereaderSupports the FileReader API
float32arraySupports the Float32Array API
formdataSupports form data
host-nodeIs a NodeJS Host
host-browserIs a Browser Host
microtasksSupports an API that allows scheduling of microtasks
node-bufferSupports the Node.JS Buffer API
rafSupports the requestAnimationFrame API
setimmediateSupports the setImmediate API
xhrSupports XMLHTTPRequest API
xhr2Supports the XMLHTTPRequest 2 API

An example of generating a build that hardwires features for Microsoft Edge and Chrome, you would use the following on the command line:

$ dojo build -f edge chrome

Eject

Ejecting @dojo/cli-build-webpack will produce a config/build-webpack/webpack.config.js file. You can run build using webpack with:

node_modules/.bin/webpack --config=config/build-webpack/webpack.config.js

Interop with external libraries

External libraries that cannot be loaded normally via webpack can be included in a Dojo 2 application by providing an implementation of require or define, and some configuration in the project's .dojorc file. .dojorc is a JSON file that contains configuration for Dojo 2 CLI tasks. Configuration for the dojo build task can be provided under the build-webpack property. Configuration for external dependencies can be provided under the externals property of the build-webpack config. externals is an object with two allowed properties:

PropertyTypeoptionalDescription
fromstringfalseA path relative to node_modules specifying the dependency location to copy into the build application.
tostringtrueA path that replaces from as the location to copy this dependency to. By default, dependencies will be copied to ${externalsOutputPath}/${to} or ${externalsOutputPath}/${from} if to is not specified.
namestringtrueIndicates that this path, and any children of this path, should be loaded via the external loader
injectstring, string[], or booleantrueThis property indicates that this dependency defines, or includes, scripts or stylesheets that should be loaded on the page. If inject is set to true, then the file at the location specified by to or from will be loaded on the page. If this dependency is a folder, then inject can be set to a string or array of strings to define one or more files to inject. Each path in inject should be relative to ${externalsOutputPath}/${to} or ${externalsOutputPath}/${from} depending on whether to was provided.

As an example the following configuration will inject src/legacy/layer.js into the application page, declare that modules a, b, and c are external and should be delegated to the external layer, and then copy the folder node_modules/legacy-dep, from which several files are injected. All of these files will be copied into the externals folder, which could be overridden by specifying the outputPath property in the externals configuration.

"externals": {
   "dependencies": [
       "a",
       "b",
       "c",
       { "from": "src/legacy/layer.js", "inject": true },
       { "from": "node_modules/legacy-dep", "inject": [ "modulA/layer.js", "moduleA/layer.css", "moduleB/layer.js" ] }
   ]
}

Types for any dependencies included in externals can be installed in node_modules/@types, like any other dependency.

How do I contribute?

We appreciate your interest! Please see the Dojo 2 Meta Repository for the Contributing Guidelines and Style Guide.

Installation

To start working with this package, clone the repository and run npm install.

In order to build the project run grunt dev or grunt dist.

Testing

Test cases MUST be written using Intern using the Object test interface and Assert assertion interface.

90% branch coverage MUST be provided for all code submitted to this repository, as reported by istanbul’s combined coverage results for all supported platforms.

To test locally in node run:

grunt test

Licensing information

© 2017 JS Foundation. New BSD license.