AutomaticPrefetchPlugin.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const asyncLib = require("neo-async");
  7. const NormalModule = require("./NormalModule");
  8. const PrefetchDependency = require("./dependencies/PrefetchDependency");
  9. /** @typedef {import("./Compiler")} Compiler */
  10. const PLUGIN_NAME = "AutomaticPrefetchPlugin";
  11. /**
  12. * Records modules from one compilation and adds them back as prefetch
  13. * dependencies in the next compilation.
  14. */
  15. class AutomaticPrefetchPlugin {
  16. /**
  17. * Registers hooks that remember previously built normal modules and enqueue
  18. * them as `PrefetchDependency` requests during the next make phase.
  19. * @param {Compiler} compiler the compiler instance
  20. * @returns {void}
  21. */
  22. apply(compiler) {
  23. compiler.hooks.compilation.tap(
  24. PLUGIN_NAME,
  25. (compilation, { normalModuleFactory }) => {
  26. compilation.dependencyFactories.set(
  27. PrefetchDependency,
  28. normalModuleFactory
  29. );
  30. }
  31. );
  32. /** @type {{ context: string | null, request: string }[] | null} */
  33. let lastModules = null;
  34. compiler.hooks.afterCompile.tap(PLUGIN_NAME, (compilation) => {
  35. lastModules = [];
  36. for (const m of compilation.modules) {
  37. if (m instanceof NormalModule) {
  38. lastModules.push({
  39. context: m.context,
  40. request: m.request
  41. });
  42. }
  43. }
  44. });
  45. compiler.hooks.make.tapAsync(PLUGIN_NAME, (compilation, callback) => {
  46. if (!lastModules) return callback();
  47. asyncLib.each(
  48. lastModules,
  49. (m, callback) => {
  50. compilation.addModuleChain(
  51. m.context || compiler.context,
  52. new PrefetchDependency(`!!${m.request}`),
  53. callback
  54. );
  55. },
  56. (err) => {
  57. lastModules = null;
  58. callback(err);
  59. }
  60. );
  61. });
  62. }
  63. }
  64. module.exports = AutomaticPrefetchPlugin;