Live Reload

aka Hot Module Swapping

Is amazing because

  • 0.1 seconds - users feel like their actions are directly causing something to happen on the screen.
  • 1 second - users notice the short delay, but they stay focused on their current train of thought.

Switch to Keynote

Using

1. Add to configDependencies

{
    "name": "place-my-order",
    "system": {
        "configDependencies": [
            "live-reload"
        ]
    }
}

Using

2. Start web socket server

# steal-tools live-reload

API

live-reload module

import reload from "live-reload";

reload(render);

function render(){
    $("body").append(template(new AppState()));
}

reload(fn)

Called at the end of a reload cycle.

reload(moduleName, fn)

Called after moduleName is reloaded.

import reload from "live-reload";

// Re-initialize the router.
reload("app/router", function(router){
    window.router = router;
    router.start();
});

reload("*", fn)

Called after any module is reloaded.

Includes the moduleName as the first argument.

reload.dispose(fn)

Called when the module is being destroyed.

import reload from "live-reload";

window.sideEffect = "i am a side effect";

reload.dispose(function(){
    delete window.sideEffect;
});

Reloading example

Make your css plugin incorporate live-reload

Reload cycle

1. Message sent from server to client

With the name of the module that changed.

Reload cycle

2. Walk up the parentMap

{
    "restaurant/list/list.stache": {
        "restaurant/list/list": true
    },
    "header.component": {
        "index.stache": true
    },
    "models/order": {
        "index.stache": true
    },
    "index.stache": false
}

parentMap

Reload cycle

2. delete modules

Calling dispose callbacks as you go

Reload cycle

3. re-import deleted modules

Call any callbacks for these modules

Reload cycle

4. Call cycleComplete callbacks

Live-reload server

Gets your dependency graph

Same technology used to load in the client

{
    "restaurant/list/list.stache": {
        load: { source: "..." },
        dependencies: ["can/view/href/href"]
    },
    "restaurant/list/list": {
        load: { source: "..." },
        dependencies: ["restaurant/list/list.stache"]
    }
}

Dependency Graph

Recycle graph

Create a new dependency graph with the changed module, merge into master graph

Check dependencies

System.translate(source).then(function(source){
    load.source = source;
    return System.instantiate(load);
}).then(function(result){
    if(!same(oldDependencies, result.dependencies)) {
        // We have to load this graph
    }
});
// before
[
    "can",
    "restaurant/list/list.stache"
]
// after
[
    "can",
    "retaurant/list/list.stache",
    "models/order"
]

Live Reload

By Matthew Phillips

Live Reload

A talk about how live-reload works.

  • 418