Production workflows
DoneJS amazingly includes
- Algorithm for creating progressively loaded bundles.
- Ability to bundle assets into your dist/ folder
- Build to native applications; iOS and Android with Cordova, Windows, Mac and Linux with NW.js.
- Deploy your app to run off a CDN; S3 and Divshot currently supported.
steal-tools
Tools for manipulating a dependency graph.
With steal-tools...
- Create progressively loaded bundles
- Export your library into various formats (AMD, CommonJS, Steal)
- Listen to changes in the graph and be notified via websocket (live-reload uses this)
- Bundle assets with your production builds (images in css, fonts, etc.)
(switch to algorithm slides)
steal-bundler
StealTools
var stealTools = require("steal-tools");
stealTools.build({
}, {
bundleAssets: true
}
steal-bundler Types
- Inferred assets
- Globbed assets
- Steal asset
Inferred API
exports.find = function(bundle){
return [
{
path: "path/to/some/font.off"
},
{
path: "path/to/some/image.png"
}
];
};
exports.rewrite = function(source, bundlesPath, assets){
// Modify source by dissecting assets
return source;
};
Native app builds
steal-cordova + steal-nw
- Integrate with StealTools build process
- Are thin layers around existing libraries
Add steal-cordova to build
Weird bits
- Cordova and NW.js apps run on the file:// protocol
- Do not have same origin restrictions
- Need to use hashchange for routing
- Have to point XHR requests to external service
Deploying
Deploy to
- CDN for static assets
- Heroku for server
donejs-deploy
Supports Divshot and S3
Services API
exports.properties = [
{
"name": "bucket",
"desc": "This is your bucket",
"default": function() { ... }
}
];
exports.deploy = function(package, options){
// Do the deploy
};
Challenges
- Two step deployment, deploy to server and CDN
- Assets are no longer relative to the page
Tilde helper
~
<img src="{{~ 'path/to/image.png'}}" />
<img src="{{~ some.prop}}" />
Rules
- can.baseURL
- Using Steal
- System.renderingLoader.baseURL
- System.baseURL
- location.pathname
Rendering contexts
When server-side rendering there is the context that the app runs in on the server and there is the context that represents the client, the renderingLoader acts on behalf of the client.
{
"name": "place-my-order",
"system": {
"envs": {
"production": {
"baseURL": "https://somecdn.com/place-my-order/"
}
}
}
}
Deploy to Heroku
Add deployment to CI
DoneJS Production Workflows
By Matthew Phillips
DoneJS Production Workflows
Building, deploying, and creating native apps.
- 464