CommonJsChunkLoadingPlugin.js 3.8 KB

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