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