mirror of https://github.com/webpack/webpack.git
				
				
				
			
							parent
							
								
									10c45eb34e
								
							
						
					
					
						commit
						8131061c8e
					
				|  | @ -567,7 +567,7 @@ Compilation.prototype.processDependenciesBlockForChunk = function processDepende | ||||||
| 		this.processDependenciesBlockForChunk(b, c); | 		this.processDependenciesBlockForChunk(b, c); | ||||||
| 	}, this); | 	}, this); | ||||||
| 	function iteratorDependency(d) { | 	function iteratorDependency(d) { | ||||||
| 		if(!d.module) { | 		if(!d.module || d.weak) { | ||||||
| 			return; | 			return; | ||||||
| 		} | 		} | ||||||
| 		if(d.module.error) { | 		if(d.module.error) { | ||||||
|  |  | ||||||
|  | @ -23,6 +23,17 @@ function CommonJsPlugin(options) { | ||||||
| module.exports = CommonJsPlugin; | module.exports = CommonJsPlugin; | ||||||
| 
 | 
 | ||||||
| CommonJsPlugin.prototype.apply = function(compiler) { | CommonJsPlugin.prototype.apply = function(compiler) { | ||||||
|  | 	function setTypeof(expr, value) { | ||||||
|  | 		compiler.parser.plugin("evaluate typeof " + expr, function(expr) { | ||||||
|  | 			return new BasicEvaluatedExpression().setString(value).setRange(expr.range); | ||||||
|  | 		}); | ||||||
|  | 		compiler.parser.plugin("typeof " + expr, function(expr) { | ||||||
|  | 			var dep = new ConstDependency(JSON.stringify(value), expr.range); | ||||||
|  | 			dep.loc = expr.loc; | ||||||
|  | 			this.state.current.addDependency(dep); | ||||||
|  | 			return true; | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
| 	compiler.plugin("compilation", function(compilation, params) { | 	compiler.plugin("compilation", function(compilation, params) { | ||||||
| 		var normalModuleFactory = params.normalModuleFactory; | 		var normalModuleFactory = params.normalModuleFactory; | ||||||
| 		var contextModuleFactory = params.contextModuleFactory; | 		var contextModuleFactory = params.contextModuleFactory; | ||||||
|  | @ -45,9 +56,9 @@ CommonJsPlugin.prototype.apply = function(compiler) { | ||||||
| 		compilation.dependencyFactories.set(RequireHeaderDependency, new NullFactory()); | 		compilation.dependencyFactories.set(RequireHeaderDependency, new NullFactory()); | ||||||
| 		compilation.dependencyTemplates.set(RequireHeaderDependency, new RequireHeaderDependency.Template()); | 		compilation.dependencyTemplates.set(RequireHeaderDependency, new RequireHeaderDependency.Template()); | ||||||
| 	}); | 	}); | ||||||
| 	compiler.parser.plugin("evaluate typeof require", function(expr) { | 	setTypeof("require", "function"); | ||||||
| 		return new BasicEvaluatedExpression().setString("function").setRange(expr.range); | 	setTypeof("require.resolve", "function"); | ||||||
| 	}); | 	setTypeof("require.resolveWeak", "function"); | ||||||
| 	compiler.parser.plugin("evaluate typeof module", function(expr) { | 	compiler.parser.plugin("evaluate typeof module", function(expr) { | ||||||
| 		return new BasicEvaluatedExpression().setString("object").setRange(expr.range); | 		return new BasicEvaluatedExpression().setString("object").setRange(expr.range); | ||||||
| 	}); | 	}); | ||||||
|  |  | ||||||
|  | @ -8,6 +8,7 @@ function ModuleHotAcceptDependency(request, range) { | ||||||
| 	ModuleDependency.call(this, request); | 	ModuleDependency.call(this, request); | ||||||
| 	this.Class = ModuleHotAcceptDependency; | 	this.Class = ModuleHotAcceptDependency; | ||||||
| 	this.range = range; | 	this.range = range; | ||||||
|  | 	this.weak = true; | ||||||
| } | } | ||||||
| module.exports = ModuleHotAcceptDependency; | module.exports = ModuleHotAcceptDependency; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -8,6 +8,7 @@ function ModuleHotDeclineDependency(request, range) { | ||||||
| 	ModuleDependency.call(this, request); | 	ModuleDependency.call(this, request); | ||||||
| 	this.Class = ModuleHotDeclineDependency; | 	this.Class = ModuleHotDeclineDependency; | ||||||
| 	this.range = range; | 	this.range = range; | ||||||
|  | 	this.weak = true; | ||||||
| } | } | ||||||
| module.exports = ModuleHotDeclineDependency; | module.exports = ModuleHotDeclineDependency; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -16,40 +16,48 @@ module.exports = RequireResolveDependencyParserPlugin; | ||||||
| RequireResolveDependencyParserPlugin.prototype.apply = function(parser) { | RequireResolveDependencyParserPlugin.prototype.apply = function(parser) { | ||||||
| 	var options = this.options; | 	var options = this.options; | ||||||
| 	parser.plugin("call require.resolve", function(expr) { | 	parser.plugin("call require.resolve", function(expr) { | ||||||
|  | 		return this.applyPluginsBailResult("call require.resolve(Weak)", expr, false) | ||||||
|  | 	}); | ||||||
|  | 	parser.plugin("call require.resolveWeak", function(expr) { | ||||||
|  | 		return this.applyPluginsBailResult("call require.resolve(Weak)", expr, true) | ||||||
|  | 	}); | ||||||
|  | 	parser.plugin("call require.resolve(Weak)", function(expr, weak) { | ||||||
| 		if(expr.arguments.length !== 1) return; | 		if(expr.arguments.length !== 1) return; | ||||||
| 		var param = this.evaluateExpression(expr.arguments[0]); | 		var param = this.evaluateExpression(expr.arguments[0]); | ||||||
| 		if(param.isConditional()) { | 		if(param.isConditional()) { | ||||||
| 			param.options.forEach(function(option) { | 			param.options.forEach(function(option) { | ||||||
| 				var result = this.applyPluginsBailResult("call require.resolve:item", expr, option); | 				var result = this.applyPluginsBailResult("call require.resolve(Weak):item", expr, option, weak); | ||||||
| 				if(result === undefined) { | 				if(result === undefined) { | ||||||
| 					this.applyPluginsBailResult("call require.resolve:context", expr, option); | 					this.applyPluginsBailResult("call require.resolve(Weak):context", expr, option, weak); | ||||||
| 				} | 				} | ||||||
| 			}, this); | 			}, this); | ||||||
| 			this.state.current.addDependency(new RequireResolveHeaderDependency(expr.callee.range)); | 			this.state.current.addDependency(new RequireResolveHeaderDependency(expr.callee.range)); | ||||||
| 			return true; | 			return true; | ||||||
| 		} else { | 		} else { | ||||||
| 			var result = this.applyPluginsBailResult("call require.resolve:item", expr, param); | 			var result = this.applyPluginsBailResult("call require.resolve(Weak):item", expr, param, weak); | ||||||
| 			if(result === undefined) { | 			if(result === undefined) { | ||||||
| 				this.applyPluginsBailResult("call require.resolve:context", expr, param); | 				this.applyPluginsBailResult("call require.resolve(Weak):context", expr, param, weak); | ||||||
| 			} | 			} | ||||||
| 			this.state.current.addDependency(new RequireResolveHeaderDependency(expr.callee.range)); | 			this.state.current.addDependency(new RequireResolveHeaderDependency(expr.callee.range)); | ||||||
| 			return true; | 			return true; | ||||||
| 		} | 		} | ||||||
| 	}); | 	}); | ||||||
| 	parser.plugin("call require.resolve:item", function(expr, param) { | 	parser.plugin("call require.resolve(Weak):item", function(expr, param, weak) { | ||||||
| 		if(param.isString()) { | 		if(param.isString()) { | ||||||
| 			var dep = new RequireResolveDependency(param.string, param.range); | 			var dep = new RequireResolveDependency(param.string, param.range); | ||||||
| 			dep.loc = expr.loc; | 			dep.loc = expr.loc; | ||||||
| 			dep.optional = !!this.scope.inTry; | 			dep.optional = !!this.scope.inTry; | ||||||
|  | 			dep.weak = weak; | ||||||
| 			this.state.current.addDependency(dep); | 			this.state.current.addDependency(dep); | ||||||
| 			return true; | 			return true; | ||||||
| 		} | 		} | ||||||
| 	}); | 	}); | ||||||
| 	parser.plugin("call require.resolve:context", function(expr, param) { | 	parser.plugin("call require.resolve(Weak):context", function(expr, param, weak) { | ||||||
| 		var dep = ContextDependencyHelpers.create(RequireResolveContextDependency, param.range, param, expr, options); | 		var dep = ContextDependencyHelpers.create(RequireResolveContextDependency, param.range, param, expr, options); | ||||||
| 		if(!dep) return; | 		if(!dep) return; | ||||||
| 		dep.loc = expr.loc; | 		dep.loc = expr.loc; | ||||||
| 		dep.optional = !!this.scope.inTry; | 		dep.optional = !!this.scope.inTry; | ||||||
|  | 		dep.weak = weak; | ||||||
| 		this.state.current.addDependency(dep); | 		this.state.current.addDependency(dep); | ||||||
| 		return true; | 		return true; | ||||||
| 	}); | 	}); | ||||||
|  |  | ||||||
|  | @ -0,0 +1,13 @@ | ||||||
|  | it("should not include a module with a weak dependency", function() { | ||||||
|  | 	var a = !!__webpack_modules__[require.resolveWeak("./a")]; | ||||||
|  | 	var b = !!__webpack_modules__[require.resolve("./b")]; | ||||||
|  | 	var c = !!__webpack_modules__[require.resolveWeak("./c")]; | ||||||
|  | 	var d = !!__webpack_modules__[require.resolveWeak("./d")]; | ||||||
|  | 	require(["./c"]); | ||||||
|  | 	require("./d"); | ||||||
|  | 	 | ||||||
|  | 	a.should.be.eql(false); | ||||||
|  | 	b.should.be.eql(true); | ||||||
|  | 	c.should.be.eql(false); | ||||||
|  | 	d.should.be.eql(true); | ||||||
|  | }); | ||||||
		Loading…
	
		Reference in New Issue