Dashboard sipadu mbip
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

index.js 2.6KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. const url = require('url');
  2. const LastCallWebpackPlugin = require('last-call-webpack-plugin');
  3. class OptimizeCssAssetsWebpackPlugin extends LastCallWebpackPlugin {
  4. constructor(options) {
  5. super({
  6. assetProcessors: [
  7. {
  8. phase: LastCallWebpackPlugin.PHASES.OPTIMIZE_CHUNK_ASSETS,
  9. regExp: (options && options.assetNameRegExp) || /\.css(\?.*)?$/i,
  10. processor: (assetName, asset, assets) =>
  11. this.processCss(assetName, asset, assets),
  12. }
  13. ],
  14. canPrint: options && options.canPrint,
  15. });
  16. this.options.assetNameRegExp = !options || !options.assetNameRegExp ?
  17. /\.css(\?.*)?$/i :
  18. options.assetNameRegExp;
  19. this.options.cssProcessor = !options || !options.cssProcessor ?
  20. require('cssnano') :
  21. options.cssProcessor;
  22. this.options.cssProcessorOptions = !options || options.cssProcessorOptions === undefined ?
  23. {} :
  24. options.cssProcessorOptions;
  25. this.options.cssProcessorPluginOptions = !options || options.cssProcessorPluginOptions === undefined ?
  26. {} :
  27. options.cssProcessorPluginOptions;
  28. }
  29. buildPluginDescriptor() {
  30. return { name: 'OptimizeCssAssetsWebpackPlugin' };
  31. }
  32. processCss(assetName, asset, assets) {
  33. const parse = url.parse(assetName);
  34. const assetInfo = {
  35. path: parse.pathname,
  36. query: parse.query ? `?${parse.query}` : '',
  37. };
  38. const css = asset.sourceAndMap ? asset.sourceAndMap() : { source: asset.source() };
  39. const processOptions = Object.assign(
  40. { from: assetName, to: assetName },
  41. this.options.cssProcessorOptions
  42. );
  43. if (processOptions.map && !processOptions.map.prev) {
  44. try {
  45. let map = css.map;
  46. if (!map) {
  47. const mapJson = assets.getAsset(`${assetInfo.path}.map`);
  48. if (mapJson) {
  49. map = JSON.parse(mapJson);
  50. }
  51. }
  52. if (
  53. map &&
  54. (
  55. (map.sources && map.sources.length > 0) ||
  56. (map.mappings && map.mappings.length > 0)
  57. )
  58. ) {
  59. processOptions.map = Object.assign({ prev: map }, processOptions.map);
  60. }
  61. } catch (err) {
  62. console.warn('OptimizeCssAssetsPlugin.processCss() Error getting previous source map', err);
  63. }
  64. }
  65. return this.options
  66. .cssProcessor.process(css.source, processOptions, this.options.cssProcessorPluginOptions)
  67. .then(r => {
  68. if (processOptions.map && r.map && r.map.toString) {
  69. assets.setAsset(`${assetInfo.path}.map${assetInfo.query}`, r.map.toString());
  70. }
  71. return r.css;
  72. });
  73. }
  74. }
  75. module.exports = OptimizeCssAssetsWebpackPlugin;