Skip to content

Commit 336b680

Browse files
committed
minify css
1 parent 1703721 commit 336b680

File tree

1 file changed

+138
-134
lines changed

1 file changed

+138
-134
lines changed

lib/loader.js

Lines changed: 138 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -10,137 +10,141 @@ var createResolver = require("./createResolver");
1010

1111

1212
module.exports = function(content, map) {
13-
if(this.cacheable) this.cacheable();
14-
var callback = this.async();
15-
var query = loaderUtils.getOptions(this) || {};
16-
var root = query.root;
17-
var moduleMode = query.modules || query.module;
18-
var camelCaseKeys = query.camelCase || query.camelcase;
19-
var sourceMap = query.sourceMap || false;
20-
var resolve = createResolver(query.alias);
21-
22-
if(sourceMap) {
23-
if (map) {
24-
if (typeof map === "string") {
25-
map = JSON.stringify(map);
26-
}
27-
28-
if (map.sources) {
29-
map.sources = map.sources.map(function (source) {
30-
return source.replace(/\\/g, '/');
31-
});
32-
map.sourceRoot = '';
33-
}
34-
}
35-
} else {
36-
// Some loaders (example `"postcss-loader": "1.x.x"`) always generates source map, we should remove it
37-
map = null;
38-
}
39-
40-
processCss(content, map, {
41-
mode: moduleMode ? "local" : "global",
42-
from: loaderUtils.getRemainingRequest(this).split("!").pop(),
43-
to: loaderUtils.getCurrentRequest(this).split("!").pop(),
44-
query: query,
45-
resolve: resolve,
46-
minimize: this.minimize,
47-
loaderContext: this,
48-
sourceMap: sourceMap
49-
}, function(err, result) {
50-
if(err) return callback(err);
51-
52-
var cssAsString = JSON.stringify(result.source);
53-
54-
// for importing CSS
55-
var importUrlPrefix = getImportPrefix(this, query);
56-
57-
var alreadyImported = {};
58-
var importJs = result.importItems.filter(function(imp) {
59-
if(!imp.mediaQuery) {
60-
if(alreadyImported[imp.url])
61-
return false;
62-
alreadyImported[imp.url] = true;
63-
}
64-
return true;
65-
}).map(function(imp) {
66-
if(!loaderUtils.isUrlRequest(imp.url, root)) {
67-
return "exports.push([module.id, " +
68-
JSON.stringify("@import url(" + imp.url + ");") + ", " +
69-
JSON.stringify(imp.mediaQuery) + "]);";
70-
} else {
71-
var importUrl = importUrlPrefix + imp.url;
72-
return "exports.i(require(" + loaderUtils.stringifyRequest(this, importUrl) + "), " + JSON.stringify(imp.mediaQuery) + ");";
73-
}
74-
}, this).join("\n");
75-
76-
function importItemMatcher(item) {
77-
var match = result.importItemRegExp.exec(item);
78-
var idx = +match[1];
79-
var importItem = result.importItems[idx];
80-
var importUrl = importUrlPrefix + importItem.url;
81-
return "\" + require(" + loaderUtils.stringifyRequest(this, importUrl) + ").locals" +
82-
"[" + JSON.stringify(importItem.export) + "] + \"";
83-
}
84-
85-
cssAsString = cssAsString.replace(result.importItemRegExpG, importItemMatcher.bind(this));
86-
87-
// helper for ensuring valid CSS strings from requires
88-
var urlEscapeHelper = "";
89-
90-
if(query.url !== false && result.urlItems.length > 0) {
91-
urlEscapeHelper = "var escape = require(" + loaderUtils.stringifyRequest(this, require.resolve("./url/escape.js")) + ");\n";
92-
93-
cssAsString = cssAsString.replace(result.urlItemRegExpG, function(item) {
94-
var match = result.urlItemRegExp.exec(item);
95-
var idx = +match[1];
96-
var urlItem = result.urlItems[idx];
97-
var url = resolve(urlItem.url);
98-
idx = url.indexOf("?#");
99-
if(idx < 0) idx = url.indexOf("#");
100-
var urlRequest;
101-
if(idx > 0) { // idx === 0 is catched by isUrlRequest
102-
// in cases like url('webfont.eot?#iefix')
103-
urlRequest = url.substr(0, idx);
104-
return "\" + escape(require(" + loaderUtils.stringifyRequest(this, urlRequest) + ")) + \"" +
105-
url.substr(idx);
106-
}
107-
urlRequest = url;
108-
return "\" + escape(require(" + loaderUtils.stringifyRequest(this, urlRequest) + ")) + \"";
109-
}.bind(this));
110-
}
111-
112-
var exportJs = compileExports(result, importItemMatcher.bind(this), camelCaseKeys);
113-
if (exportJs) {
114-
exportJs = "exports.locals = " + exportJs + ";";
115-
}
116-
117-
var moduleJs;
118-
if(sourceMap && result.map) {
119-
// add a SourceMap
120-
map = result.map;
121-
if(map.sources) {
122-
map.sources = map.sources.map(function(source) {
123-
return source.split("!").pop().replace(/\\/g, '/');
124-
}, this);
125-
map.sourceRoot = "";
126-
}
127-
map.file = map.file.split("!").pop().replace(/\\/g, '/');
128-
map = JSON.stringify(map);
129-
moduleJs = "exports.push([module.id, " + cssAsString + ", \"\", " + map + "]);";
130-
} else {
131-
moduleJs = "exports.push([module.id, " + cssAsString + ", \"\"]);";
132-
}
133-
134-
// embed runtime
135-
callback(null, urlEscapeHelper +
136-
"exports = module.exports = require(" +
137-
loaderUtils.stringifyRequest(this, require.resolve("./css-base.js")) +
138-
")(" + sourceMap + ");\n" +
139-
"// imports\n" +
140-
importJs + "\n\n" +
141-
"// module\n" +
142-
moduleJs + "\n\n" +
143-
"// exports\n" +
144-
exportJs);
145-
}.bind(this));
146-
};
13+
if (this.cacheable) this.cacheable();
14+
var callback = this.async();
15+
var query = loaderUtils.getOptions(this) || {};
16+
var root = query.root;
17+
var moduleMode = query.modules || query.module;
18+
var camelCaseKeys = query.camelCase || query.camelcase;
19+
var sourceMap = query.sourceMap || false;
20+
var resolve = createResolver(query.alias);
21+
22+
if (global && global.getLocalIdent) {
23+
query.getLocalIdent = global.getLocalIdent
24+
}
25+
26+
if (sourceMap) {
27+
if (map) {
28+
if (typeof map === "string") {
29+
map = JSON.stringify(map);
30+
}
31+
32+
if (map.sources) {
33+
map.sources = map.sources.map(function(source) {
34+
return source.replace(/\\/g, '/');
35+
});
36+
map.sourceRoot = '';
37+
}
38+
}
39+
} else {
40+
// Some loaders (example `"postcss-loader": "1.x.x"`) always generates source map, we should remove it
41+
map = null;
42+
}
43+
44+
processCss(content, map, {
45+
mode: moduleMode ? "local" : "global",
46+
from: loaderUtils.getRemainingRequest(this).split("!").pop(),
47+
to: loaderUtils.getCurrentRequest(this).split("!").pop(),
48+
query: query,
49+
resolve: resolve,
50+
minimize: this.minimize,
51+
loaderContext: this,
52+
sourceMap: sourceMap
53+
}, function(err, result) {
54+
if (err) return callback(err);
55+
56+
var cssAsString = JSON.stringify(result.source);
57+
58+
// for importing CSS
59+
var importUrlPrefix = getImportPrefix(this, query);
60+
61+
var alreadyImported = {};
62+
var importJs = result.importItems.filter(function(imp) {
63+
if (!imp.mediaQuery) {
64+
if (alreadyImported[imp.url])
65+
return false;
66+
alreadyImported[imp.url] = true;
67+
}
68+
return true;
69+
}).map(function(imp) {
70+
if (!loaderUtils.isUrlRequest(imp.url, root)) {
71+
return "exports.push([module.id, " +
72+
JSON.stringify("@import url(" + imp.url + ");") + ", " +
73+
JSON.stringify(imp.mediaQuery) + "]);";
74+
} else {
75+
var importUrl = importUrlPrefix + imp.url;
76+
return "exports.i(require(" + loaderUtils.stringifyRequest(this, importUrl) + "), " + JSON.stringify(imp.mediaQuery) + ");";
77+
}
78+
}, this).join("\n");
79+
80+
function importItemMatcher(item) {
81+
var match = result.importItemRegExp.exec(item);
82+
var idx = +match[1];
83+
var importItem = result.importItems[idx];
84+
var importUrl = importUrlPrefix + importItem.url;
85+
return "\" + require(" + loaderUtils.stringifyRequest(this, importUrl) + ").locals" +
86+
"[" + JSON.stringify(importItem.export) + "] + \"";
87+
}
88+
89+
cssAsString = cssAsString.replace(result.importItemRegExpG, importItemMatcher.bind(this));
90+
91+
// helper for ensuring valid CSS strings from requires
92+
var urlEscapeHelper = "";
93+
94+
if (query.url !== false && result.urlItems.length > 0) {
95+
urlEscapeHelper = "var escape = require(" + loaderUtils.stringifyRequest(this, require.resolve("./url/escape.js")) + ");\n";
96+
97+
cssAsString = cssAsString.replace(result.urlItemRegExpG, function(item) {
98+
var match = result.urlItemRegExp.exec(item);
99+
var idx = +match[1];
100+
var urlItem = result.urlItems[idx];
101+
var url = resolve(urlItem.url);
102+
idx = url.indexOf("?#");
103+
if (idx < 0) idx = url.indexOf("#");
104+
var urlRequest;
105+
if (idx > 0) { // idx === 0 is catched by isUrlRequest
106+
// in cases like url('webfont.eot?#iefix')
107+
urlRequest = url.substr(0, idx);
108+
return "\" + escape(require(" + loaderUtils.stringifyRequest(this, urlRequest) + ")) + \"" +
109+
url.substr(idx);
110+
}
111+
urlRequest = url;
112+
return "\" + escape(require(" + loaderUtils.stringifyRequest(this, urlRequest) + ")) + \"";
113+
}.bind(this));
114+
}
115+
116+
var exportJs = compileExports(result, importItemMatcher.bind(this), camelCaseKeys);
117+
if (exportJs) {
118+
exportJs = "exports.locals = " + exportJs + ";";
119+
}
120+
121+
var moduleJs;
122+
if (sourceMap && result.map) {
123+
// add a SourceMap
124+
map = result.map;
125+
if (map.sources) {
126+
map.sources = map.sources.map(function(source) {
127+
return source.split("!").pop().replace(/\\/g, '/');
128+
}, this);
129+
map.sourceRoot = "";
130+
}
131+
map.file = map.file.split("!").pop().replace(/\\/g, '/');
132+
map = JSON.stringify(map);
133+
moduleJs = "exports.push([module.id, " + cssAsString + ", \"\", " + map + "]);";
134+
} else {
135+
moduleJs = "exports.push([module.id, " + cssAsString + ", \"\"]);";
136+
}
137+
138+
// embed runtime
139+
callback(null, urlEscapeHelper +
140+
"exports = module.exports = require(" +
141+
loaderUtils.stringifyRequest(this, require.resolve("./css-base.js")) +
142+
")(" + sourceMap + ");\n" +
143+
"// imports\n" +
144+
importJs + "\n\n" +
145+
"// module\n" +
146+
moduleJs + "\n\n" +
147+
"// exports\n" +
148+
exportJs);
149+
}.bind(this));
150+
};

0 commit comments

Comments
 (0)