CommonJsChunkLoadingPlugin.js 3.6 KB

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