Skip to content

Commit cabe786

Browse files
committed
HMR with harmony modules
1 parent 80ab890 commit cabe786

20 files changed

Lines changed: 140 additions & 21 deletions

lib/HotModuleReplacementPlugin.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,8 @@ HotModuleReplacementPlugin.prototype.apply = function(compiler) {
197197
if(!this.state.compilation.hotUpdateChunkTemplate) return false;
198198
if(expr.arguments.length > 1) {
199199
var arg = this.evaluateExpression(expr.arguments[0]);
200-
var params = [];
200+
var params = [],
201+
requests = [];
201202
if(arg.isString()) {
202203
params = [arg];
203204
} else if(arg.isArray()) {
@@ -206,12 +207,15 @@ HotModuleReplacementPlugin.prototype.apply = function(compiler) {
206207
});
207208
}
208209
params.forEach(function(param, idx) {
209-
var dep = new ModuleHotAcceptDependency(param.string, param.range);
210+
var request = param.string;
211+
var dep = new ModuleHotAcceptDependency(request, param.range);
210212
dep.optional = true;
211213
dep.loc = Object.create(expr.loc);
212214
dep.loc.index = idx;
213215
this.state.module.addDependency(dep);
216+
requests.push(request);
214217
}.bind(this));
218+
this.applyPluginsBailResult("hot accept callback", expr.arguments[1], requests);
215219
}
216220
});
217221
compiler.parser.plugin("call module.hot.decline", function(expr) {
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
MIT License http://www.opensource.org/licenses/mit-license.php
3+
Author Tobias Koppers @sokra
4+
*/
5+
var NullDependency = require("./NullDependency");
6+
var HarmonyImportDependency = require("./HarmonyImportDependency");
7+
8+
function HarmonyAcceptDependency(range, dependencies) {
9+
NullDependency.call(this);
10+
this.range = range;
11+
this.dependencies = dependencies;
12+
}
13+
module.exports = HarmonyAcceptDependency;
14+
15+
HarmonyAcceptDependency.prototype = Object.create(NullDependency.prototype);
16+
HarmonyAcceptDependency.prototype.constructor = HarmonyAcceptDependency;
17+
HarmonyAcceptDependency.prototype.type = "accepted harmony modules";
18+
19+
HarmonyAcceptDependency.Template = function HarmonyAcceptDependencyTemplate() {};
20+
21+
HarmonyAcceptDependency.Template.prototype.apply = function(dep, source, outputOptions, requestShortener) {
22+
var content = dep.dependencies.map(function(d) {
23+
return HarmonyImportDependency.makeStatement(false, d, outputOptions, requestShortener);
24+
}).join("");
25+
source.insert(dep.range[0], "function(callback) { " + content + " (");
26+
source.insert(dep.range[1], "()); }");
27+
};
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*
2+
MIT License http://www.opensource.org/licenses/mit-license.php
3+
Author Tobias Koppers @sokra
4+
*/
5+
var HarmonyImportDependency = require("./HarmonyImportDependency");
6+
7+
function HarmonyAcceptImportDependency(request, importedVar, range) {
8+
HarmonyImportDependency.call(this, request, importedVar, range);
9+
}
10+
module.exports = HarmonyAcceptImportDependency;
11+
12+
HarmonyAcceptImportDependency.prototype = Object.create(HarmonyImportDependency.prototype);
13+
HarmonyAcceptImportDependency.prototype.constructor = HarmonyAcceptImportDependency;
14+
HarmonyAcceptImportDependency.prototype.type = "harmony accept";
15+
16+
HarmonyAcceptImportDependency.Template = function HarmonyAcceptImportDependencyTemplate() {};
17+
18+
HarmonyAcceptImportDependency.Template.prototype.apply = function(dep, source, outputOptions, requestShortener) {};

lib/dependencies/HarmonyExportExpressionDependency.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ var NullDependency = require("./NullDependency");
66

77
function HarmonyExportExpressionDependency(originModule, range, rangeStatement) {
88
NullDependency.call(this);
9-
this.Class = HarmonyExportExpressionDependency;
109
this.originModule = originModule;
1110
this.range = range;
1211
this.rangeStatement = rangeStatement;

lib/dependencies/HarmonyExportHeaderDependency.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ var NullDependency = require("./NullDependency");
66

77
function HarmonyExportHeaderDependency(range, rangeStatement) {
88
NullDependency.call(this);
9-
this.Class = HarmonyExportHeaderDependency;
109
this.range = range;
1110
this.rangeStatement = rangeStatement;
1211
}

lib/dependencies/HarmonyExportImportedSpecifierDependency.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ var NullDependency = require("./NullDependency");
66

77
function HarmonyExportImportedSpecifierDependency(originModule, importDependency, importedVar, id, name, position) {
88
NullDependency.call(this);
9-
this.Class = HarmonyExportImportedSpecifierDependency;
109
this.originModule = originModule;
1110
this.importDependency = importDependency;
1211
this.importedVar = importedVar;

lib/dependencies/HarmonyExportSpecifierDependency.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ var NullDependency = require("./NullDependency");
66

77
function HarmonyExportSpecifierDependency(originModule, id, name, position, immutable) {
88
NullDependency.call(this);
9-
this.Class = HarmonyExportSpecifierDependency;
109
this.originModule = originModule;
1110
this.id = id;
1211
this.name = name;

lib/dependencies/HarmonyImportDependency.js

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ var ModuleDependency = require("./ModuleDependency");
66

77
function HarmonyImportDependency(request, importedVar, range) {
88
ModuleDependency.call(this, request);
9-
this.Class = HarmonyImportDependency;
109
this.range = range;
1110
this.importedVar = importedVar;
1211
}
@@ -24,23 +23,29 @@ HarmonyImportDependency.prototype.getReference = function() {
2423
};
2524
};
2625

27-
HarmonyImportDependency.Template = function HarmonyImportDependencyTemplate() {};
28-
29-
HarmonyImportDependency.Template.prototype.apply = function(dep, source, outputOptions, requestShortener) {
26+
HarmonyImportDependency.makeStatement = function(declare, dep, outputOptions, requestShortener) {
3027
var comment = "";
3128
if(outputOptions.pathinfo) comment = "/*! " + requestShortener.shorten(dep.request) + " */ ";
29+
var declaration = declare ? "var " : "";
3230
var content;
3331
if(!dep.module) {
3432
content = "throw new Error(" + JSON.stringify("Cannot find module \"" + dep.request + "\"") + ");\n";
3533
} else if(dep.importedVar) {
36-
content = "/* harmony import */ var " + dep.importedVar + " = __webpack_require__(" + comment + JSON.stringify(dep.module.id) + ");\n";
34+
content = "/* harmony import */ " + declaration + dep.importedVar + " = __webpack_require__(" + comment + JSON.stringify(dep.module.id) + ");\n";
3735
if(!dep.module.meta.harmonyModule) {
38-
content += "/* harmony import */ function " + dep.importedVar + "_default() { return " + dep.importedVar + " && typeof " + dep.importedVar + " === 'object' && 'default' in " + dep.importedVar + " ? " + dep.importedVar + "['default'] : " + dep.importedVar + "; }\n";
36+
content += "/* harmony import */ " + declaration + dep.importedVar + "_default = function() { return " + dep.importedVar + " && typeof " + dep.importedVar + " === 'object' && 'default' in " + dep.importedVar + " ? " + dep.importedVar + "['default'] : " + dep.importedVar + "; }\n";
3937
content += "/* harmony import */ Object.defineProperty(" + dep.importedVar + "_default, 'a', { get: function() { return " + dep.importedVar + "_default(); }});\n";
4038
}
4139
} else {
4240
content = "";
4341
}
42+
return content;
43+
}
44+
45+
HarmonyImportDependency.Template = function HarmonyImportDependencyTemplate() {};
46+
47+
HarmonyImportDependency.Template.prototype.apply = function(dep, source, outputOptions, requestShortener) {
48+
var content = HarmonyImportDependency.makeStatement(true, dep, outputOptions, requestShortener);
4449
source.replace(dep.range[0], dep.range[1] - 1, "");
4550
source.insert(0, content);
4651
};

lib/dependencies/HarmonyImportDependencyParserPlugin.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
var AbstractPlugin = require("../AbstractPlugin");
66
var HarmonyImportDependency = require("./HarmonyImportDependency");
77
var HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDependency");
8+
var HarmonyAcceptImportDependency = require("./HarmonyAcceptImportDependency");
9+
var HarmonyAcceptDependency = require("./HarmonyAcceptDependency");
810
var HarmonyModulesHelpers = require("./HarmonyModulesHelpers");
911

1012
module.exports = AbstractPlugin.create({
@@ -29,5 +31,20 @@ module.exports = AbstractPlugin.create({
2931
dep.loc = expr.loc;
3032
this.state.current.addDependency(dep);
3133
return true;
34+
},
35+
"hot accept callback": function(expr, requests) {
36+
var dependencies = requests.filter(function(request) {
37+
return HarmonyModulesHelpers.checkModuleVar(this.state, request);
38+
}, this).map(function(request) {
39+
var dep = new HarmonyAcceptImportDependency(request, HarmonyModulesHelpers.getModuleVar(this.state, request), expr.range);
40+
dep.loc = expr.loc;
41+
this.state.current.addDependency(dep);
42+
return dep;
43+
}, this);
44+
if(dependencies.length > 0) {
45+
var dep = new HarmonyAcceptDependency(expr.range, dependencies);
46+
dep.loc = expr.loc;
47+
this.state.current.addDependency(dep);
48+
}
3249
}
3350
});

lib/dependencies/HarmonyImportSpecifierDependency.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ var NullDependency = require("./NullDependency");
66

77
function HarmonyImportSpecifierDependency(importDependency, importedVar, id, name, range) {
88
NullDependency.call(this);
9-
this.Class = HarmonyImportSpecifierDependency;
109
this.importDependency = importDependency;
1110
this.importedVar = importedVar;
1211
this.id = id;

0 commit comments

Comments
 (0)