ChunkPrefetchPreloadPlugin.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const RuntimeGlobals = require("../RuntimeGlobals");
  7. const ChunkPrefetchFunctionRuntimeModule = require("./ChunkPrefetchFunctionRuntimeModule");
  8. const ChunkPrefetchStartupRuntimeModule = require("./ChunkPrefetchStartupRuntimeModule");
  9. const ChunkPrefetchTriggerRuntimeModule = require("./ChunkPrefetchTriggerRuntimeModule");
  10. const ChunkPreloadTriggerRuntimeModule = require("./ChunkPreloadTriggerRuntimeModule");
  11. /** @typedef {import("../Compiler")} Compiler */
  12. const PLUGIN_NAME = "ChunkPrefetchPreloadPlugin";
  13. /**
  14. * Adds runtime support for chunk prefetch and preload relationships discovered
  15. * in the chunk graph.
  16. */
  17. class ChunkPrefetchPreloadPlugin {
  18. /**
  19. * Registers compilation hooks that emit the runtime modules responsible for
  20. * scheduling chunk prefetch and preload requests.
  21. * @param {Compiler} compiler the compiler
  22. * @returns {void}
  23. */
  24. apply(compiler) {
  25. compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
  26. compilation.hooks.additionalChunkRuntimeRequirements.tap(
  27. PLUGIN_NAME,
  28. (chunk, set, { chunkGraph }) => {
  29. if (chunkGraph.getNumberOfEntryModules(chunk) === 0) return;
  30. const startupChildChunks = chunk.getChildrenOfTypeInOrder(
  31. chunkGraph,
  32. "prefetchOrder"
  33. );
  34. if (startupChildChunks) {
  35. set.add(RuntimeGlobals.prefetchChunk);
  36. set.add(RuntimeGlobals.onChunksLoaded);
  37. set.add(RuntimeGlobals.exports);
  38. compilation.addRuntimeModule(
  39. chunk,
  40. new ChunkPrefetchStartupRuntimeModule(startupChildChunks)
  41. );
  42. }
  43. }
  44. );
  45. compilation.hooks.additionalTreeRuntimeRequirements.tap(
  46. PLUGIN_NAME,
  47. (chunk, set, { chunkGraph }) => {
  48. const chunkMap = chunk.getChildIdsByOrdersMap(chunkGraph);
  49. if (chunkMap.prefetch) {
  50. set.add(RuntimeGlobals.prefetchChunk);
  51. compilation.addRuntimeModule(
  52. chunk,
  53. new ChunkPrefetchTriggerRuntimeModule(chunkMap.prefetch)
  54. );
  55. }
  56. if (chunkMap.preload) {
  57. set.add(RuntimeGlobals.preloadChunk);
  58. compilation.addRuntimeModule(
  59. chunk,
  60. new ChunkPreloadTriggerRuntimeModule(chunkMap.preload)
  61. );
  62. }
  63. }
  64. );
  65. compilation.hooks.runtimeRequirementInTree
  66. .for(RuntimeGlobals.prefetchChunk)
  67. .tap(PLUGIN_NAME, (chunk, set) => {
  68. compilation.addRuntimeModule(
  69. chunk,
  70. new ChunkPrefetchFunctionRuntimeModule(
  71. "prefetch",
  72. RuntimeGlobals.prefetchChunk,
  73. RuntimeGlobals.prefetchChunkHandlers
  74. )
  75. );
  76. set.add(RuntimeGlobals.prefetchChunkHandlers);
  77. });
  78. compilation.hooks.runtimeRequirementInTree
  79. .for(RuntimeGlobals.preloadChunk)
  80. .tap(PLUGIN_NAME, (chunk, set) => {
  81. compilation.addRuntimeModule(
  82. chunk,
  83. new ChunkPrefetchFunctionRuntimeModule(
  84. "preload",
  85. RuntimeGlobals.preloadChunk,
  86. RuntimeGlobals.preloadChunkHandlers
  87. )
  88. );
  89. set.add(RuntimeGlobals.preloadChunkHandlers);
  90. });
  91. });
  92. }
  93. }
  94. module.exports = ChunkPrefetchPreloadPlugin;