RequireEnsurePlugin.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. /** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
  18. /** @typedef {import("../Compiler")} Compiler */
  19. /** @typedef {import("../javascript/JavascriptParser")} Parser */
  20. const PLUGIN_NAME = "RequireEnsurePlugin";
  21. class RequireEnsurePlugin {
  22. /**
  23. * Applies the plugin by registering its hooks on the compiler.
  24. * @param {Compiler} compiler the compiler instance
  25. * @returns {void}
  26. */
  27. apply(compiler) {
  28. compiler.hooks.compilation.tap(
  29. PLUGIN_NAME,
  30. (compilation, { normalModuleFactory }) => {
  31. compilation.dependencyFactories.set(
  32. RequireEnsureItemDependency,
  33. normalModuleFactory
  34. );
  35. compilation.dependencyTemplates.set(
  36. RequireEnsureItemDependency,
  37. new RequireEnsureItemDependency.Template()
  38. );
  39. compilation.dependencyTemplates.set(
  40. RequireEnsureDependency,
  41. new RequireEnsureDependency.Template()
  42. );
  43. /**
  44. * Handles the hook callback for this code path.
  45. * @param {Parser} parser parser parser
  46. * @param {JavascriptParserOptions} parserOptions parserOptions
  47. * @returns {void}
  48. */
  49. const handler = (parser, parserOptions) => {
  50. if (
  51. parserOptions.requireEnsure !== undefined &&
  52. !parserOptions.requireEnsure
  53. ) {
  54. return;
  55. }
  56. new RequireEnsureDependenciesBlockParserPlugin().apply(parser);
  57. parser.hooks.evaluateTypeof
  58. .for("require.ensure")
  59. .tap(PLUGIN_NAME, evaluateToString("function"));
  60. parser.hooks.typeof
  61. .for("require.ensure")
  62. .tap(
  63. PLUGIN_NAME,
  64. toConstantDependency(parser, JSON.stringify("function"))
  65. );
  66. };
  67. normalModuleFactory.hooks.parser
  68. .for(JAVASCRIPT_MODULE_TYPE_AUTO)
  69. .tap(PLUGIN_NAME, handler);
  70. normalModuleFactory.hooks.parser
  71. .for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
  72. .tap(PLUGIN_NAME, handler);
  73. }
  74. );
  75. }
  76. }
  77. module.exports = RequireEnsurePlugin;