CommonJsChunkLoadingPlugin.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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 StartupChunkDependenciesPlugin = require("../runtime/StartupChunkDependenciesPlugin");
  8. /** @typedef {import("../Chunk")} Chunk */
  9. /** @typedef {import("../Compiler")} Compiler */
  10. /** @typedef {import("../Module").RuntimeRequirements} RuntimeRequirements */
  11. /**
  12. * @typedef {object} CommonJsChunkLoadingPluginOptions
  13. * @property {boolean=} asyncChunkLoading enable async chunk loading
  14. */
  15. const PLUGIN_NAME = "CommonJsChunkLoadingPlugin";
  16. class CommonJsChunkLoadingPlugin {
  17. /**
  18. * @param {CommonJsChunkLoadingPluginOptions=} options options
  19. */
  20. constructor(options = {}) {
  21. /** @type {CommonJsChunkLoadingPluginOptions} */
  22. this.options = options;
  23. }
  24. /**
  25. * Apply the plugin
  26. * @param {Compiler} compiler the compiler instance
  27. * @returns {void}
  28. */
  29. apply(compiler) {
  30. const ChunkLoadingRuntimeModule = this.options.asyncChunkLoading
  31. ? require("./ReadFileChunkLoadingRuntimeModule")
  32. : require("./RequireChunkLoadingRuntimeModule");
  33. const chunkLoadingValue = this.options.asyncChunkLoading
  34. ? "async-node"
  35. : "require";
  36. new StartupChunkDependenciesPlugin({
  37. chunkLoading: chunkLoadingValue,
  38. asyncChunkLoading: this.options.asyncChunkLoading
  39. }).apply(compiler);
  40. compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {
  41. const globalChunkLoading = compilation.outputOptions.chunkLoading;
  42. /**
  43. * @param {Chunk} chunk chunk
  44. * @returns {boolean} true, if wasm loading is enabled for the chunk
  45. */
  46. const isEnabledForChunk = (chunk) => {
  47. const options = chunk.getEntryOptions();
  48. const chunkLoading =
  49. options && options.chunkLoading !== undefined
  50. ? options.chunkLoading
  51. : globalChunkLoading;
  52. return chunkLoading === chunkLoadingValue;
  53. };
  54. /** @type {WeakSet<Chunk>} */
  55. const onceForChunkSet = new WeakSet();
  56. /**
  57. * @param {Chunk} chunk chunk
  58. * @param {RuntimeRequirements} set runtime requirements
  59. */
  60. const handler = (chunk, set) => {
  61. if (onceForChunkSet.has(chunk)) return;
  62. onceForChunkSet.add(chunk);
  63. if (!isEnabledForChunk(chunk)) return;
  64. set.add(RuntimeGlobals.moduleFactoriesAddOnly);
  65. set.add(RuntimeGlobals.hasOwnProperty);
  66. compilation.addRuntimeModule(chunk, new ChunkLoadingRuntimeModule(set));
  67. };
  68. compilation.hooks.runtimeRequirementInTree
  69. .for(RuntimeGlobals.ensureChunkHandlers)
  70. .tap(PLUGIN_NAME, handler);
  71. compilation.hooks.runtimeRequirementInTree
  72. .for(RuntimeGlobals.hmrDownloadUpdateHandlers)
  73. .tap(PLUGIN_NAME, handler);
  74. compilation.hooks.runtimeRequirementInTree
  75. .for(RuntimeGlobals.hmrDownloadManifest)
  76. .tap(PLUGIN_NAME, handler);
  77. compilation.hooks.runtimeRequirementInTree
  78. .for(RuntimeGlobals.baseURI)
  79. .tap(PLUGIN_NAME, handler);
  80. compilation.hooks.runtimeRequirementInTree
  81. .for(RuntimeGlobals.externalInstallChunk)
  82. .tap(PLUGIN_NAME, handler);
  83. compilation.hooks.runtimeRequirementInTree
  84. .for(RuntimeGlobals.onChunksLoaded)
  85. .tap(PLUGIN_NAME, handler);
  86. compilation.hooks.runtimeRequirementInTree
  87. .for(RuntimeGlobals.ensureChunkHandlers)
  88. .tap(PLUGIN_NAME, (chunk, set) => {
  89. if (!isEnabledForChunk(chunk)) return;
  90. set.add(RuntimeGlobals.getChunkScriptFilename);
  91. });
  92. compilation.hooks.runtimeRequirementInTree
  93. .for(RuntimeGlobals.hmrDownloadUpdateHandlers)
  94. .tap(PLUGIN_NAME, (chunk, set) => {
  95. if (!isEnabledForChunk(chunk)) return;
  96. set.add(RuntimeGlobals.getChunkUpdateScriptFilename);
  97. set.add(RuntimeGlobals.moduleCache);
  98. set.add(RuntimeGlobals.hmrModuleData);
  99. set.add(RuntimeGlobals.moduleFactoriesAddOnly);
  100. });
  101. compilation.hooks.runtimeRequirementInTree
  102. .for(RuntimeGlobals.hmrDownloadManifest)
  103. .tap(PLUGIN_NAME, (chunk, set) => {
  104. if (!isEnabledForChunk(chunk)) return;
  105. set.add(RuntimeGlobals.getUpdateManifestFilename);
  106. });
  107. });
  108. }
  109. }
  110. module.exports = CommonJsChunkLoadingPlugin;