|
1 |
| -var fs = require('fs'); |
2 |
| -var path = require('path'); |
3 | 1 | var _ = require('underscore');
|
4 | 2 | var cssnano = require('cssnano');
|
5 | 3 |
|
6 | 4 | function OptimizeCssAssetsPlugin() {};
|
7 | 5 |
|
8 | 6 | OptimizeCssAssetsPlugin.prototype.apply = function(compiler) {
|
9 |
| - compiler.plugin('after-emit', function (compilation, callback) { |
| 7 | + compiler.plugin('emit', function(compilation, compileCallback) { |
| 8 | + |
10 | 9 | console.log('');
|
11 | 10 | console.log('Starting to optimize CSS...');
|
12 |
| - var outputPath = compiler.options.output.path; |
13 |
| - var stats = compilation.getStats().toJson(); |
14 |
| - var assetsByChunkName = stats.assetsByChunkName; |
15 |
| - var files = _.flatten(_.values(assetsByChunkName)); |
16 |
| - var cssFiles = _.filter(files, function(fn){ return fn && fn.match && fn.match(/\.css$/g); }); |
| 11 | + |
| 12 | + var cssFiles = _.filter(_.keys(compilation.assets), function(fn){ return fn && fn.match && fn.match(/\.css$/g); }); |
| 13 | + |
17 | 14 | var counter = 0;
|
18 | 15 | function checkFinish() {
|
19 | 16 | if (cssFiles.length >= counter++) {
|
20 | 17 | console.log('CSS optimize ended.');
|
21 |
| - callback(); |
| 18 | + compileCallback(); |
22 | 19 | }
|
23 | 20 | };
|
| 21 | + |
24 | 22 | _.each(
|
25 |
| - cssFiles, |
26 |
| - function(filename) { |
27 |
| - console.log('Processing ' + filename); |
28 |
| - var filePath = path.join(outputPath, filename); |
29 |
| - var css = fs.readFileSync(filePath, 'utf8'); |
30 |
| - cssnano.process(css, {discardComments: {removeAll: true}}).then( |
| 23 | + cssFiles, |
| 24 | + function(assetName) { |
| 25 | + console.log('Processing ' + assetName); |
| 26 | + var asset = compilation.assets[assetName]; |
| 27 | + var originalCss = asset.source(); |
| 28 | + cssnano.process(originalCss, {discardComments: {removeAll: true}}).then( |
31 | 29 | function (result) {
|
32 |
| - fs.writeFileSync(filePath, result.css); |
33 |
| - console.log('Processing ' + filename + ' ended'); |
| 30 | + var processedCss = result.css; |
| 31 | + compilation.assets[assetName] = { |
| 32 | + source: function() { |
| 33 | + return processedCss; |
| 34 | + }, |
| 35 | + size: function() { |
| 36 | + return processedCss.length; |
| 37 | + } |
| 38 | + }; |
| 39 | + console.log('Processing ' + assetName + ' ended, before: ' + originalCss.length + ', after: ' + processedCss.length + ', ratio: ' + (Math.round(((processedCss.length * 100) / originalCss.length) * 100) / 100) + '%'); |
34 | 40 | checkFinish();
|
35 | 41 | }, function(err) {
|
36 |
| - console.log('Error processing file: ' + filename); |
| 42 | + console.log('Error processing file: ' + assetName); |
37 | 43 | console.log(err);
|
38 | 44 | checkFinish();
|
39 | 45 | }
|
|
0 commit comments