next
Version:
The React Framework
9 lines • 3.67 kB
JavaScript
exports.__esModule=true;exports.CssMinimizerPlugin=void 0;var _cssnanoSimple=_interopRequireDefault(require("cssnano-simple"));var _postcssScss=_interopRequireDefault(require("next/dist/compiled/postcss-scss"));var _postcss=_interopRequireDefault(require("postcss"));var _webpack=require("next/dist/compiled/webpack/webpack");var _tracer=require("../../tracer");var _profilingPlugin=require("./profiling-plugin");function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}// https://github.com/NMFR/optimize-css-assets-webpack-plugin/blob/0a410a9bf28c7b0e81a3470a13748e68ca2f50aa/src/index.js#L20
const CSS_REGEX=/\.css(\?.*)?$/i;class CssMinimizerPlugin{constructor(options){this.__next_css_remove=true;this.options=void 0;this.options=options;}optimizeAsset(file,asset){const postcssOptions={...this.options.postcssOptions,to:file,from:file,// We don't actually add this parser to support Sass. It can also be used
// for inline comment support. See the README:
// https://github.com/postcss/postcss-scss/blob/master/README.md#2-inline-comments-for-postcss
parser:_postcssScss.default};let input;if(postcssOptions.map&&asset.sourceAndMap){const{source,map}=asset.sourceAndMap();input=source;postcssOptions.map.prev=map?map:false;}else{input=asset.source();}return(0,_postcss.default)([_cssnanoSimple.default]).process(input,postcssOptions).then(res=>{if(res.map){return new _webpack.sources.SourceMapSource(res.css,file,res.map.toJSON());}else{return new _webpack.sources.RawSource(res.css);}});}apply(compiler){compiler.hooks.compilation.tap('CssMinimizerPlugin',compilation=>{if(_webpack.isWebpack5){const cache=compilation.getCache('CssMinimizerPlugin');compilation.hooks.processAssets.tapPromise({name:'CssMinimizerPlugin',// @ts-ignore TODO: Remove ignore when webpack 5 is stable
stage:_webpack.webpack.Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE},async assets=>{return _tracer.tracer.withSpan(_profilingPlugin.spans.get(compiler),()=>{const span=_tracer.tracer.startSpan('css-minimizer-plugin',{attributes:{webpackVersion:5}});return(0,_tracer.traceAsyncFn)(span,async()=>{const files=Object.keys(assets);await Promise.all(files.filter(file=>CSS_REGEX.test(file)).map(async file=>{const assetSpan=_tracer.tracer.startSpan('minify-css',{attributes:{file}});return(0,_tracer.traceAsyncFn)(span,async()=>{const asset=assets[file];const etag=cache.getLazyHashedEtag(asset);const cachedResult=await cache.getPromise(file,etag);assetSpan.setAttribute('cache',cachedResult?'HIT':'MISS');if(cachedResult){assets[file]=cachedResult;return;}const result=await this.optimizeAsset(file,asset);await cache.storePromise(file,etag,result);assets[file]=result;});}));});});});return;}compilation.hooks.optimizeChunkAssets.tapPromise('CssMinimizerPlugin',chunks=>{return _tracer.tracer.withSpan(_profilingPlugin.spans.get(compiler),()=>{const span=_tracer.tracer.startSpan('css-minimizer-plugin',{attributes:{webpackVersion:4,compilationName:compilation.name}});return(0,_tracer.traceAsyncFn)(span,async()=>{const res=await Promise.all(chunks.reduce((acc,chunk)=>acc.concat(chunk.files||[]),[]).filter(entry=>CSS_REGEX.test(entry)).map(async file=>{const assetSpan=_tracer.tracer.startSpan('minify-css',{attributes:{file}});return(0,_tracer.traceAsyncFn)(assetSpan,async()=>{const asset=compilation.assets[file];// Makes trace attributes the same as webpack 5
// When using webpack 4 the result is not cached
assetSpan.setAttribute('cache','MISS');compilation.assets[file]=await this.optimizeAsset(file,asset);});}));return res;});});});});}}exports.CssMinimizerPlugin=CssMinimizerPlugin;
//# sourceMappingURL=css-minimizer-plugin.js.map
;