bugfixes, css and style loader

This commit is contained in:
Tobias Koppers 2012-04-07 03:20:45 +02:00
parent b40a43f37b
commit 295be3d5bc
12 changed files with 73 additions and 17 deletions

View File

@ -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

View File

@ -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 {

View File

@ -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;
} }
} }

View File

@ -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);

View File

@ -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("");
} }

View File

@ -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": [
{ {

View File

@ -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", ""]
}
};

View File

@ -0,0 +1,5 @@
@import url(./stylesheet-import2.css);
.rule-import1 {
background: green;
}

View File

@ -0,0 +1,3 @@
.rule-import2 {
background: green;
}

View File

@ -0,0 +1,5 @@
@import url(./stylesheet-import1.css);
.rule-direct {
background: green;
}

View File

@ -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";

View File

@ -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>