index.js 2.7 KB

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