RequireEnsurePlugin.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const {
  7. JAVASCRIPT_MODULE_TYPE_AUTO,
  8. JAVASCRIPT_MODULE_TYPE_DYNAMIC
  9. } = require("../ModuleTypeConstants");
  10. const {
  11. evaluateToString,
  12. toConstantDependency
  13. } = require("../javascript/JavascriptParserHelpers");
  14. const RequireEnsureDependenciesBlockParserPlugin = require("./RequireEnsureDependenciesBlockParserPlugin");
  15. const RequireEnsureDependency = require("./RequireEnsureDependency");
  16. const RequireEnsureItemDependency = require("./RequireEnsureItemDependency");
  17. /**
  18. * @import {
  19. * JavascriptParserOptions
  20. * } from "../../declarations/WebpackOptions"
  21. */
  22. /** @import Compiler from "../Compiler" */
  23. /** @import Parser from "../javascript/JavascriptParser" */
  24. const PLUGIN_NAME = "RequireEnsurePlugin";
  25. class RequireEnsurePlugin {
  26. /**
  27. * Applies the plugin by registering its hooks on the compiler.
  28. * @param {Compiler} compiler the compiler instance
  29. * @returns {void}
  30. */
  31. apply(compiler) {
  32. compiler.hooks.compilation.tap(
  33. PLUGIN_NAME,
  34. (compilation, { normalModuleFactory }) => {
  35. compilation.dependencyFactories.set(
  36. RequireEnsureItemDependency,
  37. normalModuleFactory
  38. );
  39. compilation.dependencyTemplates.set(
  40. RequireEnsureItemDependency,
  41. new RequireEnsureItemDependency.Template()
  42. );
  43. compilation.dependencyTemplates.set(
  44. RequireEnsureDependency,
  45. new RequireEnsureDependency.Template()
  46. );
  47. /**
  48. * Handles the hook callback for this code path.
  49. * @param {Parser} parser parser parser
  50. * @param {JavascriptParserOptions} parserOptions parserOptions
  51. * @returns {void}
  52. */
  53. const handler = (parser, parserOptions) => {
  54. if (
  55. parserOptions.requireEnsure !== undefined &&
  56. !parserOptions.requireEnsure
  57. ) {
  58. return;
  59. }
  60. new RequireEnsureDependenciesBlockParserPlugin().apply(parser);
  61. parser.hooks.evaluateTypeof
  62. .for("require.ensure")
  63. .tap(PLUGIN_NAME, evaluateToString("function"));
  64. parser.hooks.typeof
  65. .for("require.ensure")
  66. .tap(
  67. PLUGIN_NAME,
  68. toConstantDependency(parser, JSON.stringify("function"))
  69. );
  70. };
  71. normalModuleFactory.hooks.parser
  72. .for(JAVASCRIPT_MODULE_TYPE_AUTO)
  73. .tap(PLUGIN_NAME, handler);
  74. normalModuleFactory.hooks.parser
  75. .for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
  76. .tap(PLUGIN_NAME, handler);
  77. }
  78. );
  79. }
  80. }
  81. module.exports = RequireEnsurePlugin;