index.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. var _ = require('underscore');
  2. var webpackSources = require('webpack-sources');
  3. function OptimizeCssAssetsPlugin(options) {
  4. this.options = options || {};
  5. if (this.options.assetNameRegExp === undefined) {
  6. this.options.assetNameRegExp = /\.css$/g;
  7. }
  8. if (this.options.cssProcessor === undefined) {
  9. this.options.cssProcessor = require('cssnano');
  10. }
  11. if (this.options.cssProcessorOptions === undefined) {
  12. this.options.cssProcessorOptions = {};
  13. }
  14. if (this.options.canPrint === undefined) {
  15. this.options.canPrint = true;
  16. }
  17. };
  18. OptimizeCssAssetsPlugin.prototype.print = function() {
  19. if (this.options.canPrint) {
  20. console.log.apply(console, arguments);
  21. }
  22. };
  23. OptimizeCssAssetsPlugin.prototype.processCss = function(css, assetName) {
  24. return this.options.cssProcessor.process(css, Object.assign({ to: assetName }, this.options.cssProcessorOptions));
  25. };
  26. OptimizeCssAssetsPlugin.prototype.createCssAsset = function(css, originalAsset) {
  27. return new webpackSources.RawSource(css);
  28. };
  29. OptimizeCssAssetsPlugin.prototype.apply = function(compiler) {
  30. var self = this;
  31. compiler.plugin('emit', function(compilation, compileCallback) {
  32. self.print('\nStarting to optimize CSS...');
  33. var assets = compilation.assets;
  34. var cssAssetNames = _.filter(
  35. _.keys(assets),
  36. function(assetName) {
  37. return assetName.match(self.options.assetNameRegExp);
  38. }
  39. );
  40. var hasErrors = false;
  41. var promises = [];
  42. _.each(
  43. cssAssetNames,
  44. function(assetName) {
  45. self.print('Processing ' + assetName + '...');
  46. var asset = assets[assetName];
  47. var originalCss = asset.source();
  48. var promise = self.processCss(originalCss, assetName);
  49. promise.then(
  50. function (result) {
  51. if (hasErrors) {
  52. self.print('Skiping ' + assetName + ' because of an error.');
  53. return;
  54. }
  55. var processedCss = result.css;
  56. assets[assetName] = self.createCssAsset(processedCss, asset);
  57. self.print('Processed ' + assetName + ', before: ' + originalCss.length + ', after: ' + processedCss.length + ', ratio: ' + (Math.round(((processedCss.length * 100) / originalCss.length) * 100) / 100) + '%');
  58. }, function(err) {
  59. hasErrors = true;
  60. self.print('Error processing file: ' + assetName);
  61. console.error(err);
  62. }
  63. );
  64. promises.push(promise);
  65. }
  66. );
  67. Promise.all(promises).then(function () { compileCallback(); }, compileCallback);
  68. });
  69. };
  70. module.exports = OptimizeCssAssetsPlugin;