index.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. var LastCallWebpackPlugin = require('last-call-webpack-plugin');
  2. function OptimizeCssAssetsPlugin(options) {
  3. this.options = options || {};
  4. if (this.options.assetNameRegExp === undefined) {
  5. this.options.assetNameRegExp = /\.css$/g;
  6. }
  7. if (this.options.cssProcessor === undefined) {
  8. this.options.cssProcessor = require('cssnano');
  9. }
  10. if (this.options.cssProcessorOptions === undefined) {
  11. this.options.cssProcessorOptions = {};
  12. }
  13. if (this.options.canPrint === undefined) {
  14. this.options.canPrint = true;
  15. }
  16. var self = this;
  17. this.lastCallInstance = new LastCallWebpackPlugin({
  18. assetProcessors: [
  19. {
  20. phase: LastCallWebpackPlugin.PHASE.OPTIMIZE_CHUNK_ASSETS,
  21. regExp: this.options.assetNameRegExp,
  22. processor: function (assetName, asset, assets) {
  23. return self.processCss(assetName, asset, assets);
  24. },
  25. }
  26. ],
  27. canPrint: this.options.canPrint
  28. });
  29. };
  30. OptimizeCssAssetsPlugin.prototype.processCss = function(assetName, asset, assets) {
  31. var css = asset.source();
  32. var processOptions = Object.assign(
  33. { from: assetName, to: assetName },
  34. this.options.cssProcessorOptions || {}
  35. );
  36. if (processOptions.map && !processOptions.map.prev) {
  37. try {
  38. var mapJson = assets.getAsset(assetName + '.map');
  39. if (mapJson) {
  40. var map = JSON.parse(mapJson);
  41. if (
  42. map &&
  43. (
  44. (map.sources && map.sources.length > 0) ||
  45. (map.mappings && map.mappings.length > 0)
  46. )
  47. ) {
  48. processOptions.map = Object.assign({ prev: mapJson }, processOptions.map);
  49. }
  50. }
  51. } catch (err) {
  52. console.warn('OptimizeCssAssetsPlugin.processCss() Error getting previous source map', err);
  53. }
  54. }
  55. return this.options
  56. .cssProcessor.process(css, processOptions)
  57. .then(r => {
  58. if (processOptions.map && r.map && r.map.toString) {
  59. assets.setAsset(assetName + '.map', r.map.toString());
  60. }
  61. return r.css;
  62. });
  63. };
  64. OptimizeCssAssetsPlugin.prototype.apply = function(compiler) {
  65. return this.lastCallInstance.apply(compiler);
  66. };
  67. module.exports = OptimizeCssAssetsPlugin;