mirror of https://github.com/webpack/webpack.git
				
				
				
			fix named chunks, added multi entry plugin
This commit is contained in:
		
							parent
							
								
									ee01837d66
								
							
						
					
					
						commit
						55d1af8109
					
				|  | @ -241,15 +241,22 @@ module.exports = function(optimist, argv, convertOptions) { | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if(argv._.length > 1) { | ||||
| 	if(argv._.length > 0) { | ||||
| 		ensureObject(options, "entry"); | ||||
| 		function addTo(name, entry) { | ||||
| 			if(options.entry[name]) { | ||||
| 				if(!Array.isArray(options.entry[name])) | ||||
| 					options.entry[name] = [options.entry[name]]; | ||||
| 				options.entry[name].push(entry); | ||||
| 			} else { | ||||
| 				options.entry[name] = entry; | ||||
| 			} | ||||
| 		} | ||||
| 		argv._.forEach(function(content) { | ||||
| 			var i = content.indexOf("="); | ||||
| 			if(i < 0) throw new Error("Each element must be <string>=<string>."); | ||||
| 			else return options.entry[content.substr(0, i)] = content.substr(i+1); | ||||
| 			if(i < 0) addTo("main", content); | ||||
| 			else addTo(content.substr(0, i), content.substr(i+1)) | ||||
| 		}); | ||||
| 	} else if(argv._.length == 1) { | ||||
| 		options.entry = argv._[0]; | ||||
| 	} | ||||
| 
 | ||||
| 	return options; | ||||
|  |  | |||
|  | @ -267,7 +267,7 @@ Compilation.prototype.seal = function seal(callback) { | |||
| 
 | ||||
| Compilation.prototype.addChunk = function addChunk(name) { | ||||
| 	if(name) { | ||||
| 		if(Object.prototype.hasOwnProperty(this.namedChunks, name)) | ||||
| 		if(Object.prototype.hasOwnProperty.call(this.namedChunks, name)) | ||||
| 			return this.namedChunks[name]; | ||||
| 	} | ||||
| 	var chunk = new Chunk(name); | ||||
|  |  | |||
|  | @ -0,0 +1,29 @@ | |||
| /* | ||||
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||||
| 	Author Tobias Koppers @sokra | ||||
| */ | ||||
| var MultiEntryDependency = require("./dependencies/MultiEntryDependency"); | ||||
| var SingleEntryDependency = require("./dependencies/SingleEntryDependency"); | ||||
| var MultiModuleFactory = require("./MultiModuleFactory"); | ||||
| 
 | ||||
| function MultiEntryPlugin(context, entries, name) { | ||||
| 	this.context = context; | ||||
| 	this.entries = entries; | ||||
| 	this.name = name; | ||||
| } | ||||
| module.exports = MultiEntryPlugin; | ||||
| MultiEntryPlugin.prototype.apply = function(compiler) { | ||||
| 	compiler.plugin("compilation", function(compilation, params) { | ||||
| 		var multiModuleFactory = new MultiModuleFactory(); | ||||
| 		var normalModuleFactory = params.normalModuleFactory; | ||||
| 
 | ||||
| 		compilation.dependencyFactories.set(MultiEntryDependency, multiModuleFactory); | ||||
| 
 | ||||
| 		compilation.dependencyFactories.set(SingleEntryDependency, normalModuleFactory); | ||||
| 	}); | ||||
| 	compiler.plugin("make", function(compilation, callback) { | ||||
| 		compilation.addEntry(this.context, new MultiEntryDependency(this.entries.map(function(e) { | ||||
| 			return new SingleEntryDependency(e); | ||||
| 		}), this.name), this.name, callback); | ||||
| 	}.bind(this)); | ||||
| }; | ||||
|  | @ -0,0 +1,69 @@ | |||
| /* | ||||
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||||
| 	Author Tobias Koppers @sokra | ||||
| */ | ||||
| var Module = require("./Module"); | ||||
| var RawSource = require("webpack-core/lib/RawSource"); | ||||
| 
 | ||||
| function MultiModule(context, dependencies, name) { | ||||
| 	Module.call(this); | ||||
| 	this.context = context; | ||||
| 	this.dependencies = dependencies; | ||||
| 	this.name = name; | ||||
| 	this.built = false; | ||||
| 	this.cacheable = true; | ||||
| } | ||||
| module.exports = MultiModule; | ||||
| 
 | ||||
| MultiModule.prototype = Object.create(Module.prototype); | ||||
| 
 | ||||
| MultiModule.prototype.identifier = function() { | ||||
| 	return "multi " + this.name; | ||||
| }; | ||||
| 
 | ||||
| MultiModule.prototype.readableIdentifier = function(requestShortener) { | ||||
| 	return "multi " + this.name; | ||||
| }; | ||||
| 
 | ||||
| MultiModule.prototype.disconnect = function disconnect() { | ||||
| 	this.built = false; | ||||
| 	Module.prototype.disconnect.call(this); | ||||
| }; | ||||
| 
 | ||||
| MultiModule.prototype.build = function build(options, compilation, resolver, fs, callback) { | ||||
| 	this.built = true; | ||||
| 	return callback(); | ||||
| }; | ||||
| 
 | ||||
| MultiModule.prototype.source = function(dependencyTemplates, outputOptions, requestShortener) { | ||||
| 	var str = ["module.exports = "]; | ||||
| 	this.dependencies.forEach(function(dep, idx) { | ||||
| 		if(dep.module) { | ||||
| 			str.push("require("); | ||||
| 			if(outputOptions.pathinfo) | ||||
| 				str.push("/*! "+dep.request+" */"); | ||||
| 			str.push(""+dep.module.id); | ||||
| 			str.push(")"); | ||||
| 		} else { | ||||
| 			str.push("(function webpackMissingModule() { throw new Error("); | ||||
| 			str.push(JSON.stringify("Cannot find module \"" + dep.request + "\"")); | ||||
| 			str.push("); }())"); | ||||
| 		} | ||||
| 		str.push(";\n"); | ||||
| 	}); | ||||
| 	return new RawSource(str.join("")); | ||||
| }; | ||||
| 
 | ||||
| MultiModule.prototype.needRebuild = function needRebuild(fileTimestamps, contextTimestamps) { | ||||
| 	return false; | ||||
| }; | ||||
| 
 | ||||
| MultiModule.prototype.size = function() { | ||||
| 	return 16 + this.dependencies.length * 12; | ||||
| }; | ||||
| 
 | ||||
| MultiModule.prototype.updateHash = function(hash) { | ||||
| 	hash.update("multi module"); | ||||
| 	hash.update(this.name || ""); | ||||
| 	Module.prototype.updateHash.call(this, hash); | ||||
| }; | ||||
|  | @ -0,0 +1,18 @@ | |||
| /* | ||||
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||||
| 	Author Tobias Koppers @sokra | ||||
| */ | ||||
| var async = require("async"); | ||||
| 
 | ||||
| var Tapable = require("tapable"); | ||||
| var MultiModule = require("./MultiModule"); | ||||
| 
 | ||||
| function MultiModuleFactory() { | ||||
| 	Tapable.call(this); | ||||
| } | ||||
| module.exports = MultiModuleFactory; | ||||
| 
 | ||||
| MultiModuleFactory.prototype = Object.create(Tapable.prototype); | ||||
| MultiModuleFactory.prototype.create = function(context, dependency, callback) { | ||||
| 	callback(null, new MultiModule(context, dependency.dependencies, dependency.name)); | ||||
| }; | ||||
|  | @ -10,6 +10,7 @@ var EvalDevToolModulePlugin = require("./EvalDevToolModulePlugin"); | |||
| var LibraryTemplatePlugin = require("./LibraryTemplatePlugin"); | ||||
| 
 | ||||
| var SingleEntryPlugin = require("./SingleEntryPlugin"); | ||||
| var MultiEntryPlugin = require("./MultiEntryPlugin"); | ||||
| var CachePlugin = require("./CachePlugin"); | ||||
| 
 | ||||
| var UglifyJsPlugin = require("./UglifyJsPlugin"); | ||||
|  | @ -59,11 +60,17 @@ WebpackOptionsApply.prototype.process = function(options, compiler) { | |||
| 		compiler.apply(new LibraryTemplatePlugin(options.output.library, options.output.libraryTarget)); | ||||
| 	if(options.devtool == "eval") | ||||
| 		compiler.apply(new EvalDevToolModulePlugin()); | ||||
| 	if(typeof options.entry == "string") { | ||||
| 		compiler.apply(new SingleEntryPlugin(options.context, options.entry, "main")); | ||||
| 	function itemToPlugin(item, name) { | ||||
| 		if(Array.isArray(item)) | ||||
| 			return new MultiEntryPlugin(options.context, item, name); | ||||
| 		else | ||||
| 			return new SingleEntryPlugin(options.context, item, name) | ||||
| 	} | ||||
| 	if(typeof options.entry == "string" || Array.isArray(options.entry)) { | ||||
| 		compiler.apply(itemToPlugin(options.entry, "main")); | ||||
| 	} else if(typeof options.entry == "object") { | ||||
| 		Object.keys(options.entry).forEach(function(name) { | ||||
| 			compiler.apply(new SingleEntryPlugin(options.context, options.entry[name], name)); | ||||
| 			compiler.apply(itemToPlugin(options.entry[name], name)); | ||||
| 		}); | ||||
| 	} | ||||
| 	compiler.apply( | ||||
|  |  | |||
|  | @ -0,0 +1,16 @@ | |||
| /* | ||||
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||||
| 	Author Tobias Koppers @sokra | ||||
| */ | ||||
| var Dependency = require("../Dependency"); | ||||
| 
 | ||||
| function MultiEntryDependency(dependencies, name) { | ||||
| 	Dependency.call(this); | ||||
| 	this.Class = MultiEntryDependency; | ||||
| 	this.dependencies = dependencies; | ||||
| 	this.name = name; | ||||
| } | ||||
| module.exports = MultiEntryDependency; | ||||
| 
 | ||||
| MultiEntryDependency.prototype = Object.create(Dependency.prototype); | ||||
| MultiEntryDependency.prototype.type = "multi entry"; | ||||
|  | @ -40,7 +40,7 @@ library1.on("exit", function(code) { | |||
| 		bindOutput(main); | ||||
| 	} | ||||
| }); | ||||
| // node ../../bin/webpack --output-pathinfo --colors --output-library library2 --output-public-path js/ --config library2config.js library2 js/library2.js
 | ||||
| // node ../../bin/webpack --output-pathinfo --colors --output-library library2 --output-public-path js/ --config library2config.js library2 library2b js/library2.js
 | ||||
| var library2 = cp.spawn("node", join(["../../bin/webpack.js", "--output-pathinfo", "--colors", "--output-library", "library2", | ||||
| 									"--output-public-path", "js/", "--config", "library2config.js", "library2", "js/library2.js"], extraArgsNoWatch)); | ||||
| 									"--output-public-path", "js/", "--config", "library2config.js", "library2", "library2b", "js/library2.js"], extraArgsNoWatch)); | ||||
| bindOutput(library2); | ||||
|  |  | |||
|  | @ -240,6 +240,25 @@ describe("main", function() { | |||
| 				if(firstOne) done(); | ||||
| 			}); | ||||
| 		}); | ||||
| 
 | ||||
| 		it("should handle named chunks", function(done) { | ||||
| 			var sync = false; | ||||
| 			require.ensure([], function(require) { | ||||
| 				require("./empty?a"); | ||||
| 				require("./empty?b"); | ||||
| 				sync = true; | ||||
| 				testLoad(); | ||||
| 				sync = false; | ||||
| 				done(); | ||||
| 			}, "named-chunk"); | ||||
| 			function testLoad() { | ||||
| 				require.ensure([], function(require) { | ||||
| 					require("./empty?c"); | ||||
| 					require("./empty?d"); | ||||
| 					sync.should.be.ok; | ||||
| 				}, "named-chunk"); | ||||
| 			} | ||||
| 		}); | ||||
| 	}); | ||||
| 
 | ||||
| 	describe("loaders", function() { | ||||
|  |  | |||
|  | @ -0,0 +1,5 @@ | |||
| describe("library2b", function() { | ||||
| 	it("should load this library", function() { | ||||
| 		true.should.be.ok; | ||||
| 	}); | ||||
| }); | ||||
		Loading…
	
		Reference in New Issue