Skip to content

Commit 8131061

Browse files
committed
added weak dependencies, require.resolveWeak
webpack#526
1 parent 10c45eb commit 8131061

10 files changed

Lines changed: 44 additions & 10 deletions

File tree

lib/Compilation.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,7 @@ Compilation.prototype.processDependenciesBlockForChunk = function processDepende
567567
this.processDependenciesBlockForChunk(b, c);
568568
}, this);
569569
function iteratorDependency(d) {
570-
if(!d.module) {
570+
if(!d.module || d.weak) {
571571
return;
572572
}
573573
if(d.module.error) {

lib/dependencies/CommonJsPlugin.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,17 @@ function CommonJsPlugin(options) {
2323
module.exports = CommonJsPlugin;
2424

2525
CommonJsPlugin.prototype.apply = function(compiler) {
26+
function setTypeof(expr, value) {
27+
compiler.parser.plugin("evaluate typeof " + expr, function(expr) {
28+
return new BasicEvaluatedExpression().setString(value).setRange(expr.range);
29+
});
30+
compiler.parser.plugin("typeof " + expr, function(expr) {
31+
var dep = new ConstDependency(JSON.stringify(value), expr.range);
32+
dep.loc = expr.loc;
33+
this.state.current.addDependency(dep);
34+
return true;
35+
});
36+
}
2637
compiler.plugin("compilation", function(compilation, params) {
2738
var normalModuleFactory = params.normalModuleFactory;
2839
var contextModuleFactory = params.contextModuleFactory;
@@ -45,9 +56,9 @@ CommonJsPlugin.prototype.apply = function(compiler) {
4556
compilation.dependencyFactories.set(RequireHeaderDependency, new NullFactory());
4657
compilation.dependencyTemplates.set(RequireHeaderDependency, new RequireHeaderDependency.Template());
4758
});
48-
compiler.parser.plugin("evaluate typeof require", function(expr) {
49-
return new BasicEvaluatedExpression().setString("function").setRange(expr.range);
50-
});
59+
setTypeof("require", "function");
60+
setTypeof("require.resolve", "function");
61+
setTypeof("require.resolveWeak", "function");
5162
compiler.parser.plugin("evaluate typeof module", function(expr) {
5263
return new BasicEvaluatedExpression().setString("object").setRange(expr.range);
5364
});

lib/dependencies/ModuleHotAcceptDependency.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ function ModuleHotAcceptDependency(request, range) {
88
ModuleDependency.call(this, request);
99
this.Class = ModuleHotAcceptDependency;
1010
this.range = range;
11+
this.weak = true;
1112
}
1213
module.exports = ModuleHotAcceptDependency;
1314

lib/dependencies/ModuleHotDeclineDependency.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ function ModuleHotDeclineDependency(request, range) {
88
ModuleDependency.call(this, request);
99
this.Class = ModuleHotDeclineDependency;
1010
this.range = range;
11+
this.weak = true;
1112
}
1213
module.exports = ModuleHotDeclineDependency;
1314

lib/dependencies/RequireResolveDependencyParserPlugin.js

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,40 +16,48 @@ module.exports = RequireResolveDependencyParserPlugin;
1616
RequireResolveDependencyParserPlugin.prototype.apply = function(parser) {
1717
var options = this.options;
1818
parser.plugin("call require.resolve", function(expr) {
19+
return this.applyPluginsBailResult("call require.resolve(Weak)", expr, false)
20+
});
21+
parser.plugin("call require.resolveWeak", function(expr) {
22+
return this.applyPluginsBailResult("call require.resolve(Weak)", expr, true)
23+
});
24+
parser.plugin("call require.resolve(Weak)", function(expr, weak) {
1925
if(expr.arguments.length !== 1) return;
2026
var param = this.evaluateExpression(expr.arguments[0]);
2127
if(param.isConditional()) {
2228
param.options.forEach(function(option) {
23-
var result = this.applyPluginsBailResult("call require.resolve:item", expr, option);
29+
var result = this.applyPluginsBailResult("call require.resolve(Weak):item", expr, option, weak);
2430
if(result === undefined) {
25-
this.applyPluginsBailResult("call require.resolve:context", expr, option);
31+
this.applyPluginsBailResult("call require.resolve(Weak):context", expr, option, weak);
2632
}
2733
}, this);
2834
this.state.current.addDependency(new RequireResolveHeaderDependency(expr.callee.range));
2935
return true;
3036
} else {
31-
var result = this.applyPluginsBailResult("call require.resolve:item", expr, param);
37+
var result = this.applyPluginsBailResult("call require.resolve(Weak):item", expr, param, weak);
3238
if(result === undefined) {
33-
this.applyPluginsBailResult("call require.resolve:context", expr, param);
39+
this.applyPluginsBailResult("call require.resolve(Weak):context", expr, param, weak);
3440
}
3541
this.state.current.addDependency(new RequireResolveHeaderDependency(expr.callee.range));
3642
return true;
3743
}
3844
});
39-
parser.plugin("call require.resolve:item", function(expr, param) {
45+
parser.plugin("call require.resolve(Weak):item", function(expr, param, weak) {
4046
if(param.isString()) {
4147
var dep = new RequireResolveDependency(param.string, param.range);
4248
dep.loc = expr.loc;
4349
dep.optional = !!this.scope.inTry;
50+
dep.weak = weak;
4451
this.state.current.addDependency(dep);
4552
return true;
4653
}
4754
});
48-
parser.plugin("call require.resolve:context", function(expr, param) {
55+
parser.plugin("call require.resolve(Weak):context", function(expr, param, weak) {
4956
var dep = ContextDependencyHelpers.create(RequireResolveContextDependency, param.range, param, expr, options);
5057
if(!dep) return;
5158
dep.loc = expr.loc;
5259
dep.optional = !!this.scope.inTry;
60+
dep.weak = weak;
5361
this.state.current.addDependency(dep);
5462
return true;
5563
});

test/cases/chunks/weak-dependencies/a.js

Whitespace-only changes.

test/cases/chunks/weak-dependencies/b.js

Whitespace-only changes.

test/cases/chunks/weak-dependencies/c.js

Whitespace-only changes.

test/cases/chunks/weak-dependencies/d.js

Whitespace-only changes.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
it("should not include a module with a weak dependency", function() {
2+
var a = !!__webpack_modules__[require.resolveWeak("./a")];
3+
var b = !!__webpack_modules__[require.resolve("./b")];
4+
var c = !!__webpack_modules__[require.resolveWeak("./c")];
5+
var d = !!__webpack_modules__[require.resolveWeak("./d")];
6+
require(["./c"]);
7+
require("./d");
8+
9+
a.should.be.eql(false);
10+
b.should.be.eql(true);
11+
c.should.be.eql(false);
12+
d.should.be.eql(true);
13+
});

0 commit comments

Comments
 (0)