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 {Object} CommonJsChunkLoadingPluginOptions
  11. * @property {boolean} [asyncChunkLoading] enable async chunk loading
  12. */
  13. class CommonJsChunkLoadingPlugin {
  14. /**
  15. * @param {CommonJsChunkLoadingPluginOptions} [options] options
  16. */
  17. constructor(options = {}) {
  18. this._asyncChunkLoading = options.asyncChunkLoading;
  19. }
  20. /**
  21. * Apply the plugin
  22. * @param {Compiler} compiler the compiler instance
  23. * @returns {void}
  24. */
  25. apply(compiler) {
  26. const ChunkLoadingRuntimeModule = this._asyncChunkLoading
  27. ? require("./ReadFileChunkLoadingRuntimeModule")
  28. : require("./RequireChunkLoadingRuntimeModule");
  29. const chunkLoadingValue = this._asyncChunkLoading
  30. ? "async-node"
  31. : "require";
  32. new StartupChunkDependenciesPlugin({
  33. chunkLoading: chunkLoadingValue,
  34. asyncChunkLoading: this._asyncChunkLoading
  35. }).apply(compiler);
  36. compiler.hooks.thisCompilation.tap(
  37. "CommonJsChunkLoadingPlugin",
  38. 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(
  64. chunk,
  65. new ChunkLoadingRuntimeModule(set)
  66. );
  67. };
  68. compilation.hooks.runtimeRequirementInTree
  69. .for(RuntimeGlobals.ensureChunkHandlers)
  70. .tap("CommonJsChunkLoadingPlugin", handler);
  71. compilation.hooks.runtimeRequirementInTree
  72. .for(RuntimeGlobals.hmrDownloadUpdateHandlers)
  73. .tap("CommonJsChunkLoadingPlugin", handler);
  74. compilation.hooks.runtimeRequirementInTree
  75. .for(RuntimeGlobals.hmrDownloadManifest)
  76. .tap("CommonJsChunkLoadingPlugin", handler);
  77. compilation.hooks.runtimeRequirementInTree
  78. .for(RuntimeGlobals.baseURI)
  79. .tap("CommonJsChunkLoadingPlugin", handler);
  80. compilation.hooks.runtimeRequirementInTree
  81. .for(RuntimeGlobals.externalInstallChunk)
  82. .tap("CommonJsChunkLoadingPlugin", handler);
  83. compilation.hooks.runtimeRequirementInTree
  84. .for(RuntimeGlobals.onChunksLoaded)
  85. .tap("CommonJsChunkLoadingPlugin", handler);
  86. compilation.hooks.runtimeRequirementInTree
  87. .for(RuntimeGlobals.ensureChunkHandlers)
  88. .tap("CommonJsChunkLoadingPlugin", (chunk, set) => {
  89. if (!isEnabledForChunk(chunk)) return;
  90. set.add(RuntimeGlobals.getChunkScriptFilename);
  91. });
  92. compilation.hooks.runtimeRequirementInTree
  93. .for(RuntimeGlobals.hmrDownloadUpdateHandlers)
  94. .tap("CommonJsChunkLoadingPlugin", (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("CommonJsChunkLoadingPlugin", (chunk, set) => {
  104. if (!isEnabledForChunk(chunk)) return;
  105. set.add(RuntimeGlobals.getUpdateManifestFilename);
  106. });
  107. }
  108. );
  109. }
  110. }
  111. module.exports = CommonJsChunkLoadingPlugin;