Skip to content

Commit 1f66b3a

Browse files
committed
allow module.hot.accept without callback (harmony)
1 parent 7fa2886 commit 1f66b3a

File tree

9 files changed

+85
-20
lines changed

9 files changed

+85
-20
lines changed

lib/HotModuleReplacementPlugin.js

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ HotModuleReplacementPlugin.prototype.apply = function(compiler) {
202202
});
203203
compiler.parser.plugin("call module.hot.accept", function(expr) {
204204
if(!this.state.compilation.hotUpdateChunkTemplate) return false;
205-
if(expr.arguments.length > 1) {
205+
if(expr.arguments.length >= 1) {
206206
var arg = this.evaluateExpression(expr.arguments[0]);
207207
var params = [],
208208
requests = [];
@@ -213,16 +213,21 @@ HotModuleReplacementPlugin.prototype.apply = function(compiler) {
213213
return param.isString();
214214
});
215215
}
216-
params.forEach(function(param, idx) {
217-
var request = param.string;
218-
var dep = new ModuleHotAcceptDependency(request, param.range);
219-
dep.optional = true;
220-
dep.loc = Object.create(expr.loc);
221-
dep.loc.index = idx;
222-
this.state.module.addDependency(dep);
223-
requests.push(request);
224-
}.bind(this));
225-
this.applyPluginsBailResult("hot accept callback", expr.arguments[1], requests);
216+
if(params.length > 0) {
217+
params.forEach(function(param, idx) {
218+
var request = param.string;
219+
var dep = new ModuleHotAcceptDependency(request, param.range);
220+
dep.optional = true;
221+
dep.loc = Object.create(expr.loc);
222+
dep.loc.index = idx;
223+
this.state.module.addDependency(dep);
224+
requests.push(request);
225+
}.bind(this));
226+
if(expr.arguments.length > 1)
227+
this.applyPluginsBailResult("hot accept callback", expr.arguments[1], requests);
228+
else
229+
this.applyPluginsBailResult("hot accept without callback", expr, requests);
230+
}
226231
}
227232
});
228233
compiler.parser.plugin("call module.hot.decline", function(expr) {

lib/dependencies/HarmonyAcceptDependency.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@
55
var NullDependency = require("./NullDependency");
66
var HarmonyImportDependency = require("./HarmonyImportDependency");
77

8-
function HarmonyAcceptDependency(range, dependencies) {
8+
function HarmonyAcceptDependency(range, dependencies, hasCallback) {
99
NullDependency.call(this);
1010
this.range = range;
1111
this.dependencies = dependencies;
12+
this.hasCallback = hasCallback;
1213
}
1314
module.exports = HarmonyAcceptDependency;
1415

@@ -21,7 +22,11 @@ HarmonyAcceptDependency.Template = function HarmonyAcceptDependencyTemplate() {}
2122
HarmonyAcceptDependency.Template.prototype.apply = function(dep, source, outputOptions, requestShortener) {
2223
var content = dep.dependencies.map(function(d) {
2324
return HarmonyImportDependency.makeStatement(false, d, outputOptions, requestShortener);
24-
}).join("");
25-
source.insert(dep.range[0], "function(__WEBPACK_OUTDATED_DEPENDENCIES__) { " + content + " (");
26-
source.insert(dep.range[1], ")(__WEBPACK_OUTDATED_DEPENDENCIES__); }");
25+
}).join(" ");
26+
if(dep.hasCallback) {
27+
source.insert(dep.range[0], "function(__WEBPACK_OUTDATED_DEPENDENCIES__) { " + content + " (");
28+
source.insert(dep.range[1], ")(__WEBPACK_OUTDATED_DEPENDENCIES__); }");
29+
} else {
30+
source.insert(dep.range[1] - 1, ", function() { " + content + " }");
31+
}
2732
};

lib/dependencies/HarmonyImportDependency.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,15 @@ HarmonyImportDependency.makeStatement = function(declare, dep, outputOptions, re
3232
var comment = "";
3333
if(outputOptions.pathinfo) comment = "/*! " + requestShortener.shorten(dep.request) + " */ ";
3434
var declaration = declare ? "var " : "";
35+
var newline = declare ? "\n" : "";
3536
var content;
3637
if(!dep.module) {
37-
content = "throw new Error(" + JSON.stringify("Cannot find module \"" + dep.request + "\"") + ");\n";
38+
content = "throw new Error(" + JSON.stringify("Cannot find module \"" + dep.request + "\"") + ");" + newline;
3839
} else if(dep.importedVar) {
39-
content = "/* harmony import */ " + declaration + dep.importedVar + " = __webpack_require__(" + comment + JSON.stringify(dep.module.id) + ");\n";
40+
content = "/* harmony import */ " + declaration + dep.importedVar + " = __webpack_require__(" + comment + JSON.stringify(dep.module.id) + ");" + newline;
4041
if(!(dep.module.meta && dep.module.meta.harmonyModule)) {
41-
content += "/* harmony import */ " + declaration + dep.importedVar + "_default = " + dep.importedVar + " && " + dep.importedVar + ".__esModule ? function() { return " + dep.importedVar + "['default'] } : function() { return " + dep.importedVar + "; }\n";
42-
content += "/* harmony import */ Object.defineProperty(" + dep.importedVar + "_default, 'a', { get: " + dep.importedVar + "_default });\n";
42+
content += "/* harmony import */ " + declaration + dep.importedVar + "_default = " + dep.importedVar + " && " + dep.importedVar + ".__esModule ? function() { return " + dep.importedVar + "['default'] } : function() { return " + dep.importedVar + "; }" + newline;
43+
content += "/* harmony import */ Object.defineProperty(" + dep.importedVar + "_default, 'a', { get: " + dep.importedVar + "_default });" + newline;
4344
}
4445
} else {
4546
content = "";

lib/dependencies/HarmonyImportDependencyParserPlugin.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,22 @@ module.exports = AbstractPlugin.create({
5959
return dep;
6060
}, this);
6161
if(dependencies.length > 0) {
62-
var dep = new HarmonyAcceptDependency(expr.range, dependencies);
62+
var dep = new HarmonyAcceptDependency(expr.range, dependencies, true);
63+
dep.loc = expr.loc;
64+
this.state.current.addDependency(dep);
65+
}
66+
},
67+
"hot accept without callback": function(expr, requests) {
68+
var dependencies = requests.filter(function(request) {
69+
return HarmonyModulesHelpers.checkModuleVar(this.state, request);
70+
}, this).map(function(request) {
71+
var dep = new HarmonyAcceptImportDependency(request, HarmonyModulesHelpers.getModuleVar(this.state, request), expr.range);
72+
dep.loc = expr.loc;
73+
this.state.current.addDependency(dep);
74+
return dep;
75+
}, this);
76+
if(dependencies.length > 0) {
77+
var dep = new HarmonyAcceptDependency(expr.range, dependencies, false);
6378
dep.loc = expr.loc;
6479
this.state.current.addDependency(dep);
6580
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export { value } from "./file";
2+
export { value as value2 } from "./file2";
3+
export var counter = 0;
4+
module.hot.accept("./file");
5+
module.hot.accept("./file2", function() {
6+
counter++;
7+
});
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export { value } from "./file";
2+
export { value as value2 } from "./file2";
3+
export var counter = 0;
4+
module.hot.accept("./file");
5+
module.hot.accept("./file2", function() {
6+
counter++;
7+
});
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export var value = 1;
2+
---
3+
export var value = 2;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export var value = 3;
2+
---
3+
export var value = 4;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
it("should import a changed chunk", function(done) {
2+
System.import("./chunk").then(function(chunk) {
3+
chunk.value.should.be.eql(1);
4+
chunk.value2.should.be.eql(3);
5+
chunk.counter.should.be.eql(0);
6+
NEXT(require("../../update")(done));
7+
setTimeout(function() {
8+
chunk.value.should.be.eql(2);
9+
chunk.value2.should.be.eql(4);
10+
chunk.counter.should.be.eql(1);
11+
System.import("./chunk2").then(function(chunk2) {
12+
chunk2.value.should.be.eql(2);
13+
chunk2.value2.should.be.eql(4);
14+
chunk2.counter.should.be.eql(0);
15+
done();
16+
}).catch(done);
17+
}, 100);
18+
}).catch(done);
19+
});

0 commit comments

Comments
 (0)