OccurrenceChunkOrderPlugin.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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/OccurrenceOrderChunkIdsPlugin.json");
  8. class OccurrenceOrderChunkIdsPlugin {
  9. constructor(options = {}) {
  10. validateOptions(schema, options, "Occurrence Order Chunk Ids Plugin");
  11. this.options = options;
  12. }
  13. apply(compiler) {
  14. const prioritiseInitial = this.options.prioritiseInitial;
  15. compiler.hooks.compilation.tap(
  16. "OccurrenceOrderChunkIdsPlugin",
  17. compilation => {
  18. compilation.hooks.optimizeChunkOrder.tap(
  19. "OccurrenceOrderChunkIdsPlugin",
  20. chunks => {
  21. const occursInInitialChunksMap = new Map();
  22. const originalOrder = new Map();
  23. let i = 0;
  24. for (const c of chunks) {
  25. let occurs = 0;
  26. for (const chunkGroup of c.groupsIterable) {
  27. for (const parent of chunkGroup.parentsIterable) {
  28. if (parent.isInitial()) occurs++;
  29. }
  30. }
  31. occursInInitialChunksMap.set(c, occurs);
  32. originalOrder.set(c, i++);
  33. }
  34. chunks.sort((a, b) => {
  35. if (prioritiseInitial) {
  36. const aEntryOccurs = occursInInitialChunksMap.get(a);
  37. const bEntryOccurs = occursInInitialChunksMap.get(b);
  38. if (aEntryOccurs > bEntryOccurs) return -1;
  39. if (aEntryOccurs < bEntryOccurs) return 1;
  40. }
  41. const aOccurs = a.getNumberOfGroups();
  42. const bOccurs = b.getNumberOfGroups();
  43. if (aOccurs > bOccurs) return -1;
  44. if (aOccurs < bOccurs) return 1;
  45. const orgA = originalOrder.get(a);
  46. const orgB = originalOrder.get(b);
  47. return orgA - orgB;
  48. });
  49. }
  50. );
  51. }
  52. );
  53. }
  54. }
  55. module.exports = OccurrenceOrderChunkIdsPlugin;