Skip to content

Commit 1d0cf82

Browse files
committed
added experimental DelegatedModules
1 parent 5a5b732 commit 1d0cf82

11 files changed

Lines changed: 165 additions & 0 deletions

File tree

lib/DelegatedModule.js

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*
2+
MIT License http://www.opensource.org/licenses/mit-license.php
3+
Author Tobias Koppers @sokra
4+
*/
5+
var Module = require("./Module");
6+
var OriginalSource = require("webpack-core/lib/OriginalSource");
7+
var RawSource = require("webpack-core/lib/RawSource");
8+
var WebpackMissingModule = require("./dependencies/WebpackMissingModule");
9+
var DelegatedSourceDependency = require("./dependencies/DelegatedSourceDependency");
10+
11+
function DelegatedModule(sourceRequest, request, type) {
12+
Module.call(this);
13+
this.sourceRequest = sourceRequest;
14+
this.request = request;
15+
this.type = type;
16+
this.built = false;
17+
}
18+
module.exports = DelegatedModule;
19+
20+
DelegatedModule.prototype = Object.create(Module.prototype);
21+
22+
DelegatedModule.prototype.delegated = true;
23+
24+
DelegatedModule.prototype.identifier = function() {
25+
return "delegated " + JSON.stringify(this.request) + " from " + this.sourceRequest;
26+
};
27+
28+
DelegatedModule.prototype.readableIdentifier = function() {
29+
return "delegated " + JSON.stringify(this.request) + " from " + this.sourceRequest;
30+
};
31+
32+
DelegatedModule.prototype.needRebuild = function() {
33+
return false;
34+
};
35+
36+
DelegatedModule.prototype.build = function(options, compilation, resolver, fs, callback) {
37+
this.builtTime = new Date().getTime();
38+
this.dependencies.length = 0;
39+
this.addDependency(new DelegatedSourceDependency(this.sourceRequest));
40+
callback();
41+
};
42+
43+
DelegatedModule.prototype.source = function() {
44+
var sourceModule = this.dependencies[0].module;
45+
var str;
46+
if(!sourceModule) {
47+
str = WebpackMissingModule.moduleCode(this.sourceRequest);
48+
} else {
49+
str = "module.exports = (__webpack_require__(" + sourceModule.id + "))";
50+
switch(this.type) {
51+
case "require":
52+
str += "(" + JSON.stringify(this.request) + ");";
53+
break;
54+
case "object":
55+
str += "[" + JSON.stringify(this.request) + "];";
56+
break;
57+
}
58+
}
59+
if(this.useSourceMap) {
60+
return new OriginalSource(str, this.identifier());
61+
} else {
62+
return new RawSource(str);
63+
}
64+
};
65+
66+
DelegatedModule.prototype.size = function() {
67+
return 42;
68+
};
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
MIT License http://www.opensource.org/licenses/mit-license.php
3+
Author Tobias Koppers @sokra
4+
*/
5+
var DelegatedModule = require("./DelegatedModule");
6+
var path = require("path");
7+
8+
function DelegatedModuleFactoryPlugin(options) {
9+
this.options = options;
10+
options.type = options.type || "require";
11+
// this.source = source;
12+
// this.type = type;
13+
// this.scope = scope;
14+
// this.context = context;
15+
// this.content = content;
16+
}
17+
module.exports = DelegatedModuleFactoryPlugin;
18+
19+
DelegatedModuleFactoryPlugin.prototype.apply = function(normalModuleFactory) {
20+
normalModuleFactory.plugin("create-module", function(data) {
21+
var request = DelegatedModuleFactoryPlugin.contextify(this.options.context, data.userRequest);
22+
if(request in this.options.content) {
23+
var resolved = this.options.content[request];
24+
return new DelegatedModule(this.options.source, resolved, this.options.type);
25+
}
26+
}.bind(this));
27+
};
28+
29+
DelegatedModuleFactoryPlugin.contextify = function(context, request) {
30+
return request.split("!").map(function(r) {
31+
var rp = path.relative(context, r);
32+
if(path.sep === "\\")
33+
rp = rp.replace(/\\/g, "/");
34+
if(rp.indexOf("../") !== 0)
35+
rp = "./" + rp;
36+
return rp;
37+
}).join("!");
38+
};

lib/DelegatedPlugin.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
MIT License http://www.opensource.org/licenses/mit-license.php
3+
Author Tobias Koppers @sokra
4+
*/
5+
var DelegatedModuleFactoryPlugin = require("./DelegatedModuleFactoryPlugin");
6+
var DelegatedSourceDependency = require("./dependencies/DelegatedSourceDependency");
7+
8+
function DelegatedPlugin(options) {
9+
this.options = options;
10+
}
11+
module.exports = DelegatedPlugin;
12+
DelegatedPlugin.prototype.apply = function(compiler) {
13+
compiler.plugin("compilation", function(compilation, params) {
14+
var normalModuleFactory = params.normalModuleFactory;
15+
16+
compilation.dependencyFactories.set(DelegatedSourceDependency, normalModuleFactory);
17+
});
18+
compiler.plugin("compile", function(params) {
19+
params.normalModuleFactory.apply(new DelegatedModuleFactoryPlugin(this.options));
20+
}.bind(this));
21+
};
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*
2+
MIT License http://www.opensource.org/licenses/mit-license.php
3+
Author Tobias Koppers @sokra
4+
*/
5+
var ModuleDependency = require("./ModuleDependency");
6+
7+
function DelegatedSourceDependency(request) {
8+
ModuleDependency.call(this, request);
9+
this.Class = DelegatedSourceDependency;
10+
}
11+
module.exports = DelegatedSourceDependency;
12+
13+
DelegatedSourceDependency.prototype = Object.create(ModuleDependency.prototype);
14+
DelegatedSourceDependency.prototype.constructor = DelegatedSourceDependency;
15+
DelegatedSourceDependency.prototype.type = "delegated source";

test/configCases/delegated/simple/a.js

Whitespace-only changes.

test/configCases/delegated/simple/b.js

Whitespace-only changes.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module.exports = function(req) {
2+
return ["a", "b", "c"][req];
3+
}

test/configCases/delegated/simple/dir/c.js

Whitespace-only changes.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
it("should delegate the modules", function() {
2+
require("./a").should.be.eql("a");
3+
require("./loader!./b").should.be.eql("b");
4+
require("./dir/c").should.be.eql("c");
5+
});

test/configCases/delegated/simple/loader.js

Whitespace-only changes.

0 commit comments

Comments
 (0)