css-minimizer-plugin.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. var _cssnanoSimple = _interopRequireDefault(require("next/dist/compiled/cssnano-simple"));
  6. var _postcssScss = _interopRequireDefault(require("next/dist/compiled/postcss-scss"));
  7. var _postcss = _interopRequireDefault(require("postcss"));
  8. var _webpack = require("next/dist/compiled/webpack/webpack");
  9. var _profilingPlugin = require("./profiling-plugin");
  10. function _interopRequireDefault(obj) {
  11. return obj && obj.__esModule ? obj : {
  12. default: obj
  13. };
  14. }
  15. // https://github.com/NMFR/optimize-css-assets-webpack-plugin/blob/0a410a9bf28c7b0e81a3470a13748e68ca2f50aa/src/index.js#L20
  16. const CSS_REGEX = /\.css(\?.*)?$/i;
  17. class CssMinimizerPlugin {
  18. __next_css_remove = true;
  19. constructor(options){
  20. this.options = options;
  21. }
  22. optimizeAsset(file, asset) {
  23. const postcssOptions = {
  24. ...this.options.postcssOptions,
  25. to: file,
  26. from: file,
  27. // We don't actually add this parser to support Sass. It can also be used
  28. // for inline comment support. See the README:
  29. // https://github.com/postcss/postcss-scss/blob/master/README.md#2-inline-comments-for-postcss
  30. parser: _postcssScss.default
  31. };
  32. let input;
  33. if (postcssOptions.map && asset.sourceAndMap) {
  34. const { source , map } = asset.sourceAndMap();
  35. input = source;
  36. postcssOptions.map.prev = map ? map : false;
  37. } else {
  38. input = asset.source();
  39. }
  40. return (0, _postcss).default([
  41. (0, _cssnanoSimple).default({}, _postcss.default)
  42. ]).process(input, postcssOptions).then((res)=>{
  43. if (res.map) {
  44. return new _webpack.sources.SourceMapSource(res.css, file, res.map.toJSON());
  45. } else {
  46. return new _webpack.sources.RawSource(res.css);
  47. }
  48. });
  49. }
  50. apply(compiler) {
  51. compiler.hooks.compilation.tap("CssMinimizerPlugin", (compilation)=>{
  52. const cache = compilation.getCache("CssMinimizerPlugin");
  53. compilation.hooks.processAssets.tapPromise({
  54. name: "CssMinimizerPlugin",
  55. // @ts-ignore TODO: Remove ignore when webpack 5 is stable
  56. stage: _webpack.webpack.Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE
  57. }, async (assets)=>{
  58. const compilationSpan = _profilingPlugin.spans.get(compilation) || _profilingPlugin.spans.get(compiler);
  59. const cssMinimizerSpan = compilationSpan.traceChild("css-minimizer-plugin");
  60. cssMinimizerSpan.setAttribute("webpackVersion", 5);
  61. return cssMinimizerSpan.traceAsyncFn(async ()=>{
  62. const files = Object.keys(assets);
  63. await Promise.all(files.filter((file)=>CSS_REGEX.test(file)).map(async (file)=>{
  64. const assetSpan = cssMinimizerSpan.traceChild("minify-css");
  65. assetSpan.setAttribute("file", file);
  66. return assetSpan.traceAsyncFn(async ()=>{
  67. const asset = assets[file];
  68. const etag = cache.getLazyHashedEtag(asset);
  69. const cachedResult = await cache.getPromise(file, etag);
  70. assetSpan.setAttribute("cache", cachedResult ? "HIT" : "MISS");
  71. if (cachedResult) {
  72. assets[file] = cachedResult;
  73. return;
  74. }
  75. const result = await this.optimizeAsset(file, asset);
  76. await cache.storePromise(file, etag, result);
  77. assets[file] = result;
  78. });
  79. }));
  80. });
  81. });
  82. });
  83. }
  84. }
  85. exports.CssMinimizerPlugin = CssMinimizerPlugin;
  86. //# sourceMappingURL=css-minimizer-plugin.js.map