LimitChunkCountPlugin.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const validateOptions = require("schema-utils");
  7. const schema = require("../../schemas/plugins/optimize/LimitChunkCountPlugin.json");
  8. class LimitChunkCountPlugin {
  9. constructor(options) {
  10. validateOptions(schema, options || {}, "Limit Chunk Count Plugin");
  11. this.options = options || {};
  12. }
  13. apply(compiler) {
  14. const options = this.options;
  15. compiler.hooks.compilation.tap("LimitChunkCountPlugin", compilation => {
  16. compilation.hooks.optimizeChunksAdvanced.tap(
  17. "LimitChunkCountPlugin",
  18. chunks => {
  19. const maxChunks = options.maxChunks;
  20. if (!maxChunks) return;
  21. if (maxChunks < 1) return;
  22. if (chunks.length <= maxChunks) return;
  23. const sortedExtendedPairCombinations = chunks
  24. .reduce((combinations, a, idx) => {
  25. // create combination pairs
  26. for (let i = 0; i < idx; i++) {
  27. const b = chunks[i];
  28. combinations.push([b, a]);
  29. }
  30. return combinations;
  31. }, [])
  32. .map(pair => {
  33. // extend combination pairs with size and integrated size
  34. const a = pair[0].size(options);
  35. const b = pair[1].size(options);
  36. const ab = pair[0].integratedSize(pair[1], options);
  37. return [a + b - ab, ab, pair[0], pair[1], a, b];
  38. })
  39. .filter(extendedPair => {
  40. // filter pairs that do not have an integratedSize
  41. // meaning they can NOT be integrated!
  42. return extendedPair[1] !== false;
  43. })
  44. .sort((a, b) => {
  45. // sadly javascript does an inplace sort here
  46. // sort them by size
  47. const diff = b[0] - a[0];
  48. if (diff !== 0) return diff;
  49. return a[1] - b[1];
  50. });
  51. const pair = sortedExtendedPairCombinations[0];
  52. if (pair && pair[2].integrate(pair[3], "limit")) {
  53. chunks.splice(chunks.indexOf(pair[3]), 1);
  54. return true;
  55. }
  56. }
  57. );
  58. });
  59. }
  60. }
  61. module.exports = LimitChunkCountPlugin;