Skip to content

Commit

Permalink
Try to implement hot module replacement.
Browse files Browse the repository at this point in the history
  • Loading branch information
antonmedv committed Jun 11, 2016
1 parent 3b249ab commit eb226f2
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 40 deletions.
36 changes: 0 additions & 36 deletions src/hot/update.js

This file was deleted.

7 changes: 3 additions & 4 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,9 @@ module.exports = function (content) {
if (query.hot) {
node.add([
'if(module.hot) {\n',
' module.hot.accept();\n',
' var content = require(' + loaderUtils.stringifyRequest(this, '!!' + request) + ');\n',
' var update = require(' + loaderUtils.stringifyRequest(this, '!' + path.join(__dirname, 'hot/update.js')) + ');\n',
' update(content);\n',
'module.hot.accept();\n',
'require(' + loaderUtils.stringifyRequest(this, '!' + path.join(__dirname, 'update.js')) + ')',
'(require(' + loaderUtils.stringifyRequest(this, '!!' + request) + '));\n',
'}\n'
]);
}
Expand Down
66 changes: 66 additions & 0 deletions src/update.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
var Monkberry = require('monkberry');

var isPatched = false;
var render, stores = [];

function Store(view) {
this.view = view;
this.data = {};
}

Store.prototype.handler = function () {
return {
get: (target, name) => {
if (name == 'update') {
return (data) => {
this.data = data;
return this.view.update(data);
}
}
return this.view[name];
},
set: (target, name, value) => {
return this.view[name] = value;
}
};
};

module.exports = function (newTemplate) {
if (!isPatched) {
// Patch monkberry render
render = Monkberry.render;
Monkberry.render = function (template, node, options) {
var view = render.call(null, template, node, options);
var store = new Store(view);
var proxy = new Proxy({}, store.handler());
stores.push(store); // Save to lists.
return proxy;
};
isPatched = true;
}

// Do hot replace of view.
for (var i = stores.length - 1; i >= 0; i--) {
var store = stores[i];

var view = new store.view.constructor();
var root = store.view.nodes[0];

// Insert new view.
view.insertBefore(root);

// Remove old view.
store.view.remove();

// Set new view.
store.view = view;

// Default render flow.
if (view.onRender) {
view.onRender();
}

// Set old view.
view.update(store.data);
}
};

0 comments on commit eb226f2

Please sign in to comment.