ChunkPreloadTriggerRuntimeModule.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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. /** @import Compilation from "../Compilation" */
  9. /** @import { ChunkChildIdsByOrdersMap } from "../Chunk" */
  10. class ChunkPreloadTriggerRuntimeModule extends RuntimeModule {
  11. /**
  12. * @param {ChunkChildIdsByOrdersMap} chunkMap map from chunk to chunks
  13. * @param {string=} handlerKey the `ensureChunkHandlers` key to install under (default `"preload"`); `"cssPreload"` preloads only the CSS handler so it stays CSS-only even when the build also registers a JS preload handler
  14. */
  15. constructor(chunkMap, handlerKey = "preload") {
  16. super(`chunk ${handlerKey} trigger`, RuntimeModule.STAGE_TRIGGER);
  17. /** @type {ChunkChildIdsByOrdersMap} */
  18. this.chunkMap = chunkMap;
  19. /** @type {string} */
  20. this.handlerKey = handlerKey;
  21. }
  22. /**
  23. * Generates runtime code for this runtime module.
  24. * @returns {string | null} runtime code
  25. */
  26. generate() {
  27. const { chunkMap, handlerKey } = this;
  28. const compilation = /** @type {Compilation} */ (this.compilation);
  29. const { runtimeTemplate } = compilation;
  30. // `cssPreload` calls only the CSS preload handler (`preloadChunkHandlers.s`)
  31. // so it stays CSS-only regardless of a JS preload handler registered
  32. // elsewhere; plain `preload` fans out to every handler via `preloadChunk`.
  33. const body =
  34. handlerKey === "cssPreload"
  35. ? [
  36. `var handler = ${RuntimeGlobals.preloadChunkHandlers}.s;`,
  37. "var chunks = chunkToChildrenMap[chunkId];",
  38. "if (handler && Array.isArray(chunks)) chunks.forEach(handler);"
  39. ]
  40. : [
  41. "var chunks = chunkToChildrenMap[chunkId];",
  42. `Array.isArray(chunks) && chunks.map(${RuntimeGlobals.preloadChunk});`
  43. ];
  44. return Template.asString([
  45. `var chunkToChildrenMap = ${JSON.stringify(chunkMap, null, "\t")};`,
  46. `${
  47. RuntimeGlobals.ensureChunkHandlers
  48. }.${handlerKey} = ${runtimeTemplate.basicFunction("chunkId", body)};`
  49. ]);
  50. }
  51. }
  52. module.exports = ChunkPreloadTriggerRuntimeModule;