mirror of https://github.com/webpack/webpack.git
				
				
				
			bugfixes, css and style loader
This commit is contained in:
		
							parent
							
								
									b40a43f37b
								
							
						
					
					
						commit
						295be3d5bc
					
				|  | @ -183,10 +183,12 @@ The following loaders are included as optional dependencies: | ||||||
| * `json` (default at `.json`): Loads file as JSON | * `json` (default at `.json`): Loads file as JSON | ||||||
| * `jade` (default at `.jade`): Loads jade template and returns a function | * `jade` (default at `.jade`): Loads jade template and returns a function | ||||||
| * `coffee` (default at `.coffee`): Loads coffee-script like javascript | * `coffee` (default at `.coffee`): Loads coffee-script like javascript | ||||||
|  | * `css`: Loads css file with resolved imports | ||||||
|  | * `style`: Adds result of javascript execution to DOM | ||||||
|  | * `.css` defaults to `style!css` loader, so all css rules are added to DOM | ||||||
| 
 | 
 | ||||||
| TODO | TODO | ||||||
| 
 | 
 | ||||||
| * `css`: CSS rules are added to DOM on require |  | ||||||
| * `less`, `sass`: like `css` but compiles | * `less`, `sass`: like `css` but compiles | ||||||
| 
 | 
 | ||||||
| ## TL;DR | ## TL;DR | ||||||
|  |  | ||||||
|  | @ -101,6 +101,7 @@ function execLoaders(request, loaders, filenames, contents, options, callback) { | ||||||
| 						}, | 						}, | ||||||
| 						web: true, | 						web: true, | ||||||
| 						debug: options.debug, | 						debug: options.debug, | ||||||
|  | 						minimize: options.minimize, | ||||||
| 						values: undefined, | 						values: undefined, | ||||||
| 						options: options | 						options: options | ||||||
| 					}; | 					}; | ||||||
|  | @ -108,7 +109,7 @@ function execLoaders(request, loaders, filenames, contents, options, callback) { | ||||||
| 					if(!async) | 					if(!async) | ||||||
| 						nextLoader(retVal === undefined ? new Error("loader did not return a value") : null, retVal); | 						nextLoader(retVal === undefined ? new Error("loader did not return a value") : null, retVal); | ||||||
| 				} catch(e) { | 				} catch(e) { | ||||||
| 					callback(err); | 					callback("Loader throwed exeception: " + e); | ||||||
| 					return; | 					return; | ||||||
| 				} | 				} | ||||||
| 			} else { | 			} else { | ||||||
|  |  | ||||||
|  | @ -75,13 +75,13 @@ function doResolve(context, identifier, options, type, callback) { | ||||||
| 		options.paths = []; | 		options.paths = []; | ||||||
| 	if(!options.alias) | 	if(!options.alias) | ||||||
| 		options.alias = {}; | 		options.alias = {}; | ||||||
| 	var identifiers = identifier.split(/!/g); | 	var identifiers = identifier.replace(/^!|!$/g, "").replace(/!!/g, "!").split(/!/g); | ||||||
| 	if(identifiers.length === 1) { | 	if(identifier.indexOf("!") === -1) { | ||||||
| 		var resource = identifiers.pop(); | 		var resource = identifiers.pop(); | ||||||
| 		for(var i = 0; i < options.loaders.length; i++) { | 		for(var i = 0; i < options.loaders.length; i++) { | ||||||
| 			var line = options.loaders[i]; | 			var line = options.loaders[i]; | ||||||
| 			if(line.test.test(resource)) { | 			if(line.test.test(resource)) { | ||||||
| 				identifiers.push(line.loader); | 				Array.prototype.push.apply(identifiers, line.loader.split(/!/g)); | ||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -87,6 +87,7 @@ module.exports = function(context, moduleName, options, callback) { | ||||||
| 	options.resolve.loaders.push({test: /\.coffee$/, loader: "coffee"}); | 	options.resolve.loaders.push({test: /\.coffee$/, loader: "coffee"}); | ||||||
| 	options.resolve.loaders.push({test: /\.json$/, loader: "json"}); | 	options.resolve.loaders.push({test: /\.json$/, loader: "json"}); | ||||||
| 	options.resolve.loaders.push({test: /\.jade$/, loader: "jade"}); | 	options.resolve.loaders.push({test: /\.jade$/, loader: "jade"}); | ||||||
|  | 	options.resolve.loaders.push({test: /\.css$/, loader: "style!css"}); | ||||||
| 	buildDeps(context, moduleName, options, function(err, depTree) { | 	buildDeps(context, moduleName, options, function(err, depTree) { | ||||||
| 		if(err) { | 		if(err) { | ||||||
| 			callback(err); | 			callback(err); | ||||||
|  |  | ||||||
|  | @ -8,14 +8,14 @@ module.exports = function(module, options) { | ||||||
| 			var extensions = (options.resolve && options.resolve.extensions) || [".web.js", ".js"]; | 			var extensions = (options.resolve && options.resolve.extensions) || [".web.js", ".js"]; | ||||||
| 			var extensionsAccess = []; | 			var extensionsAccess = []; | ||||||
| 			extensions.forEach(function(ext) { | 			extensions.forEach(function(ext) { | ||||||
| 				extensionsAccess.push("||map[name+\""); | 				extensionsAccess.push("map[name+\"" + | ||||||
| 				extensionsAccess.push(ext.replace(/\\/g, "\\\\").replace(/"/g, "\\\"")); | 						ext.replace(/\\/g, "\\\\").replace(/"/g, "\\\"") + | ||||||
| 				extensionsAccess.push("\"]"); | 						"\"]"); | ||||||
| 			}); | 			}); | ||||||
| 
 | 
 | ||||||
| 			return "/***/module.exports = function(name) {\n" + | 			return "/***/module.exports = function(name) {\n" + | ||||||
| 				"/***/\tvar map = " + JSON.stringify(module.requireMap) + ";\n" + | 				"/***/\tvar map = " + JSON.stringify(module.requireMap) + ";\n" + | ||||||
| 				"/***/\treturn require(map[name]" + extensionsAccess.join("") + "||name);\n" + | 				"/***/\treturn require(" + extensionsAccess.join("||") + "||name);\n" + | ||||||
| 				"/***/};"; | 				"/***/};"; | ||||||
| 		} | 		} | ||||||
| 		return; | 		return; | ||||||
|  | @ -171,7 +171,7 @@ module.exports = function(module, options) { | ||||||
| 		result = ["eval(", JSON.stringify(result.join("")), ")"]; | 		result = ["eval(", JSON.stringify(result.join("")), ")"]; | ||||||
| 	} | 	} | ||||||
| 	result.unshift.apply(result, modulePrepends.reverse()); | 	result.unshift.apply(result, modulePrepends.reverse()); | ||||||
| 	result.push.apply(result, moduleAppends);	 | 	result.push.apply(result, moduleAppends); | ||||||
| 	return result.join(""); | 	return result.join(""); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -13,7 +13,9 @@ | ||||||
| 		"raw-loader": "0.1.x", | 		"raw-loader": "0.1.x", | ||||||
| 		"json-loader": "0.1.x", | 		"json-loader": "0.1.x", | ||||||
| 		"jade-loader": "0.1.x", | 		"jade-loader": "0.1.x", | ||||||
| 		"coffee-loader": "0.1.x" | 		"coffee-loader": "0.1.x", | ||||||
|  | 		"css-loader": "0.1.x", | ||||||
|  | 		"style-loader": "0.1.x" | ||||||
| 	}, | 	}, | ||||||
| 	"licenses": [ | 	"licenses": [ | ||||||
| 		{ | 		{ | ||||||
|  |  | ||||||
|  | @ -10,7 +10,7 @@ module.exports = function(req) { | ||||||
| 		var oldReq = req; | 		var oldReq = req; | ||||||
| 		req = function(name) { | 		req = function(name) { | ||||||
| 			if(name.indexOf("!") !== -1) { | 			if(name.indexOf("!") !== -1) { | ||||||
| 				var items = name.split(/!/g); | 				var items = name.replace(/^!|!$/g, "").replace(/!!/g, "!").split(/!/g); | ||||||
| 				var resource = oldReq.resolve(items.pop()); | 				var resource = oldReq.resolve(items.pop()); | ||||||
| 				var resolved = []; | 				var resolved = []; | ||||||
| 				items.forEach(function(item, index) { | 				items.forEach(function(item, index) { | ||||||
|  | @ -30,7 +30,7 @@ module.exports = function(req) { | ||||||
| 						relative = true; | 						relative = true; | ||||||
| 					var tries = []; | 					var tries = []; | ||||||
| 					if(!relative) { | 					if(!relative) { | ||||||
| 						postfixes.forEach(function(postfix) { | 						module.exports.options.resolve.loaderPostfixes.forEach(function(postfix) { | ||||||
| 							if(item.indexOf("/") !== -1) | 							if(item.indexOf("/") !== -1) | ||||||
| 								tries.push(item.replace("/", postfix+"/")); | 								tries.push(item.replace("/", postfix+"/")); | ||||||
| 							else | 							else | ||||||
|  | @ -38,6 +38,7 @@ module.exports = function(req) { | ||||||
| 						}); | 						}); | ||||||
| 					} | 					} | ||||||
| 					tries.push(item); | 					tries.push(item); | ||||||
|  | 					var extensions = module.exports.options.resolve.loaderExtensions; | ||||||
| 					for(var i = 0; i < tries.length; i++) { | 					for(var i = 0; i < tries.length; i++) { | ||||||
| 						for(var ext = 0; ext < extensions.length; ext++) { | 						for(var ext = 0; ext < extensions.length; ext++) { | ||||||
| 							try { | 							try { | ||||||
|  | @ -80,6 +81,10 @@ module.exports = function(req) { | ||||||
| 							err = content.shift(); | 							err = content.shift(); | ||||||
| 							values = context.values; | 							values = context.values; | ||||||
| 						}, | 						}, | ||||||
|  | 						options: module.exports.options, | ||||||
|  | 						minimize: module.exports.options.minimize, | ||||||
|  | 						debug: module.exports.options.debug, | ||||||
|  | 						web: false, | ||||||
| 						inputValues: values, | 						inputValues: values, | ||||||
| 						values: undefined | 						values: undefined | ||||||
| 					}; | 					}; | ||||||
|  | @ -94,8 +99,16 @@ module.exports = function(req) { | ||||||
| 				if(values !== undefined) | 				if(values !== undefined) | ||||||
| 					return values[0]; | 					return values[0]; | ||||||
| 				return exec(content[0], cacheLine); | 				return exec(content[0], cacheLine); | ||||||
| 			} else | 			} else { | ||||||
|  | 				var resolved = oldReq.resolve(name); | ||||||
|  | 				var match = false; | ||||||
|  | 				var loaders = module.exports.resolve.loaders; | ||||||
|  | 				for(var i = 0; i < loaders.length; i++) | ||||||
|  | 					if(loaders[i].test.test(resolved)) | ||||||
|  | 						return req(loader.loader + "!" + name); | ||||||
|  | 
 | ||||||
| 				return oldReq(name); | 				return oldReq(name); | ||||||
|  | 			} | ||||||
| 		}; | 		}; | ||||||
| 		req.__proto__ = oldReq; | 		req.__proto__ = oldReq; | ||||||
| 		req.webpackPolyfill = true; | 		req.webpackPolyfill = true; | ||||||
|  | @ -114,5 +127,15 @@ module.exports = function(req) { | ||||||
| 	} | 	} | ||||||
| 	return req; | 	return req; | ||||||
| } | } | ||||||
| var extensions = [".webpack-loader.js", ".loader.js", ".js", ""]; | var options = module.exports.options = { | ||||||
| var postfixes = ["-webpack-loader", "-loader", ""] | 	resolve: { | ||||||
|  | 		loaders: [ | ||||||
|  | 			{test: /\.coffee$/, loader: "coffee"}, | ||||||
|  | 			// {test: /\.json$/, loader: "json"}, // This works out of the box in node.js
 | ||||||
|  | 			{test: /\.jade$/, loader: "jade"}, | ||||||
|  | 			{test: /\.css$/, loader: "style!css"} | ||||||
|  | 		], | ||||||
|  | 		loaderExtensions: [".webpack-loader.js", ".loader.js", ".js", ""], | ||||||
|  | 		loaderPostfixes: ["-webpack-loader", "-loader", ""] | ||||||
|  | 	} | ||||||
|  | }; | ||||||
|  | @ -0,0 +1,5 @@ | ||||||
|  | @import url(./stylesheet-import2.css); | ||||||
|  | 
 | ||||||
|  | .rule-import1 { | ||||||
|  | 	background: green; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,3 @@ | ||||||
|  | .rule-import2 { | ||||||
|  | 	background: green; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,5 @@ | ||||||
|  | @import url(./stylesheet-import1.css); | ||||||
|  | 
 | ||||||
|  | .rule-direct { | ||||||
|  | 	background: green; | ||||||
|  | } | ||||||
|  | @ -121,6 +121,11 @@ window.test(require("json!../../../package.json").name === "webpack", "Buildin ' | ||||||
| window.test(require("../../../package.json").name === "webpack", "Buildin 'json' loader, by ext"); | window.test(require("../../../package.json").name === "webpack", "Buildin 'json' loader, by ext"); | ||||||
| window.test(require("coffee!../resources/script.coffee") === "coffee test", "Buildin 'coffee' loader"); | window.test(require("coffee!../resources/script.coffee") === "coffee test", "Buildin 'coffee' loader"); | ||||||
| window.test(require("../resources/script.coffee") === "coffee test", "Buildin 'coffee' loader, by ext"); | window.test(require("../resources/script.coffee") === "coffee test", "Buildin 'coffee' loader, by ext"); | ||||||
|  | window.test(require("css!../css/stylesheet.css").indexOf(".rule-direct") !== -1, "Buildin 'css' loader, direct content"); | ||||||
|  | window.test(require("css!../css/stylesheet.css").indexOf(".rule-import1") !== -1, "Buildin 'css' loader, imported rule"); | ||||||
|  | window.test(require("css!../css/stylesheet.css").indexOf(".rule-import2") !== -1, "Buildin 'css' loader, double imported rule"); | ||||||
|  | // Buildin 'style' loader adds css to document
 | ||||||
|  | require("../css/stylesheet.css"); | ||||||
| 
 | 
 | ||||||
| // Loader & Context
 | // Loader & Context
 | ||||||
| var abc = "abc", scr = "script.coffee"; | var abc = "abc", scr = "script.coffee"; | ||||||
|  |  | ||||||
|  | @ -23,9 +23,18 @@ | ||||||
| 		}; | 		}; | ||||||
| 		window.writing = false; | 		window.writing = false; | ||||||
| 	</script> | 	</script> | ||||||
|  | 	<style> | ||||||
|  | 		span { | ||||||
|  | 			background: red; | ||||||
|  | 		} | ||||||
|  | 	</style> | ||||||
| </head> | </head> | ||||||
| 
 | 
 | ||||||
| <body> | <body> | ||||||
| 
 | 	<p> | ||||||
|  | 		<span class="rule-direct">Buildin 'style' loader, direct content</span> | ||||||
|  | 		<span class="rule-import1">Buildin 'style' loader, imported rule</span> | ||||||
|  | 		<span class="rule-import2">Buildin 'style' loader, double imported rule</span> | ||||||
|  | 	</p> | ||||||
| </body> | </body> | ||||||
| </html> | </html> | ||||||
		Loading…
	
		Reference in New Issue