ExternalModuleDependency.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Ivan Kopeykin @vankop
  4. */
  5. "use strict";
  6. const makeSerializable = require("../util/makeSerializable");
  7. const CachedConstDependency = require("./CachedConstDependency");
  8. const ExternalModuleInitFragment = require("./ExternalModuleInitFragment");
  9. /** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
  10. /** @typedef {import("../Dependency")} Dependency */
  11. /** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
  12. /** @typedef {import("../javascript/JavascriptParser").Range} Range */
  13. /** @typedef {import("../dependencies/ExternalModuleInitFragment").ArrayImportSpecifiers} ArrayImportSpecifiers */
  14. /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
  15. /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
  16. class ExternalModuleDependency extends CachedConstDependency {
  17. /**
  18. * Creates an instance of ExternalModuleDependency.
  19. * @param {string} module module
  20. * @param {ArrayImportSpecifiers} importSpecifiers import specifiers
  21. * @param {string | undefined} defaultImport default import
  22. * @param {string} expression expression
  23. * @param {Range | null} range range
  24. * @param {string} identifier identifier
  25. * @param {number=} place place where we inject the expression
  26. */
  27. constructor(
  28. module,
  29. importSpecifiers,
  30. defaultImport,
  31. expression,
  32. range,
  33. identifier,
  34. place = CachedConstDependency.PLACE_MODULE
  35. ) {
  36. super(expression, range, identifier, place);
  37. this.importedModule = module;
  38. this.specifiers = importSpecifiers;
  39. this.default = defaultImport;
  40. }
  41. /**
  42. * Create hash update.
  43. * @returns {string} hash update
  44. */
  45. _createHashUpdate() {
  46. return `${this.importedModule}${JSON.stringify(this.specifiers)}${
  47. this.default || "null"
  48. }${super._createHashUpdate()}`;
  49. }
  50. /**
  51. * Serializes this instance into the provided serializer context.
  52. * @param {ObjectSerializerContext} context context
  53. */
  54. serialize(context) {
  55. super.serialize(context);
  56. const { write } = context;
  57. write(this.importedModule);
  58. write(this.specifiers);
  59. write(this.default);
  60. }
  61. /**
  62. * Restores this instance from the provided deserializer context.
  63. * @param {ObjectDeserializerContext} context context
  64. */
  65. deserialize(context) {
  66. super.deserialize(context);
  67. const { read } = context;
  68. this.importedModule = read();
  69. this.specifiers = read();
  70. this.default = read();
  71. }
  72. }
  73. makeSerializable(
  74. ExternalModuleDependency,
  75. "webpack/lib/dependencies/ExternalModuleDependency"
  76. );
  77. ExternalModuleDependency.Template = class ExternalModuleDependencyTemplate extends (
  78. CachedConstDependency.Template
  79. ) {
  80. /**
  81. * Applies the plugin by registering its hooks on the compiler.
  82. * @param {Dependency} dependency the dependency for which the template should be applied
  83. * @param {ReplaceSource} source the current replace source which can be modified
  84. * @param {DependencyTemplateContext} templateContext the context object
  85. * @returns {void}
  86. */
  87. apply(dependency, source, templateContext) {
  88. super.apply(dependency, source, templateContext);
  89. const dep = /** @type {ExternalModuleDependency} */ (dependency);
  90. const { chunkInitFragments, runtimeTemplate } = templateContext;
  91. chunkInitFragments.push(
  92. new ExternalModuleInitFragment(
  93. `${runtimeTemplate.supportNodePrefixForCoreModules() ? "node:" : ""}${
  94. dep.importedModule
  95. }`,
  96. dep.specifiers,
  97. dep.default
  98. )
  99. );
  100. }
  101. };
  102. module.exports = ExternalModuleDependency;