AutomaticPrefetchPlugin.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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. class AutomaticPrefetchPlugin {
  12. /**
  13. * Apply the plugin
  14. * @param {Compiler} compiler the compiler instance
  15. * @returns {void}
  16. */
  17. apply(compiler) {
  18. compiler.hooks.compilation.tap(
  19. PLUGIN_NAME,
  20. (compilation, { normalModuleFactory }) => {
  21. compilation.dependencyFactories.set(
  22. PrefetchDependency,
  23. normalModuleFactory
  24. );
  25. }
  26. );
  27. /** @type {{context: string | null, request: string}[] | null} */
  28. let lastModules = null;
  29. compiler.hooks.afterCompile.tap(PLUGIN_NAME, compilation => {
  30. lastModules = [];
  31. for (const m of compilation.modules) {
  32. if (m instanceof NormalModule) {
  33. lastModules.push({
  34. context: m.context,
  35. request: m.request
  36. });
  37. }
  38. }
  39. });
  40. compiler.hooks.make.tapAsync(PLUGIN_NAME, (compilation, callback) => {
  41. if (!lastModules) return callback();
  42. asyncLib.each(
  43. lastModules,
  44. (m, callback) => {
  45. compilation.addModuleChain(
  46. m.context || compiler.context,
  47. new PrefetchDependency(`!!${m.request}`),
  48. callback
  49. );
  50. },
  51. err => {
  52. lastModules = null;
  53. callback(err);
  54. }
  55. );
  56. });
  57. }
  58. }
  59. module.exports = AutomaticPrefetchPlugin;