ChunkPrefetchTriggerRuntimeModule.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. */
  4. "use strict";
  5. const RuntimeGlobals = require("../RuntimeGlobals");
  6. const RuntimeModule = require("../RuntimeModule");
  7. const Template = require("../Template");
  8. /** @typedef {import("../Compilation")} Compilation */
  9. /** @typedef {import("../Chunk").ChunkChildIdsByOrdersMap} ChunkChildIdsByOrdersMap */
  10. class ChunkPrefetchTriggerRuntimeModule extends RuntimeModule {
  11. /**
  12. * @param {ChunkChildIdsByOrdersMap} chunkMap map from chunk to
  13. */
  14. constructor(chunkMap) {
  15. super("chunk prefetch trigger", RuntimeModule.STAGE_TRIGGER);
  16. /** @type {ChunkChildIdsByOrdersMap} */
  17. this.chunkMap = chunkMap;
  18. }
  19. /**
  20. * @returns {string | null} runtime code
  21. */
  22. generate() {
  23. const { chunkMap } = this;
  24. const compilation = /** @type {Compilation} */ (this.compilation);
  25. const { runtimeTemplate } = compilation;
  26. const body = [
  27. "var chunks = chunkToChildrenMap[chunkId];",
  28. `Array.isArray(chunks) && chunks.map(${RuntimeGlobals.prefetchChunk});`
  29. ];
  30. return Template.asString([
  31. Template.asString([
  32. `var chunkToChildrenMap = ${JSON.stringify(chunkMap, null, "\t")};`,
  33. `${
  34. RuntimeGlobals.ensureChunkHandlers
  35. }.prefetch = ${runtimeTemplate.expressionFunction(
  36. `Promise.all(promises).then(${runtimeTemplate.basicFunction(
  37. "",
  38. body
  39. )})`,
  40. "chunkId, promises"
  41. )};`
  42. ])
  43. ]);
  44. }
  45. }
  46. module.exports = ChunkPrefetchTriggerRuntimeModule;