NamedModuleIdsPlugin.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const { compareModulesByIdentifier } = require("../util/comparators");
  7. const {
  8. assignAscendingModuleIds,
  9. assignNames,
  10. getLongModuleName,
  11. getShortModuleName,
  12. getUsedModuleIdsAndModules
  13. } = require("./IdHelpers");
  14. /** @typedef {import("../Compiler")} Compiler */
  15. /**
  16. * Defines the named module ids plugin options type used by this module.
  17. * @typedef {object} NamedModuleIdsPluginOptions
  18. * @property {string=} context context
  19. */
  20. const PLUGIN_NAME = "NamedModuleIdsPlugin";
  21. class NamedModuleIdsPlugin {
  22. /**
  23. * Creates an instance of NamedModuleIdsPlugin.
  24. * @param {NamedModuleIdsPluginOptions=} options options
  25. */
  26. constructor(options = {}) {
  27. /** @type {NamedModuleIdsPluginOptions} */
  28. this.options = options;
  29. }
  30. /**
  31. * Applies the plugin by registering its hooks on the compiler.
  32. * @param {Compiler} compiler the compiler instance
  33. * @returns {void}
  34. */
  35. apply(compiler) {
  36. const { root } = compiler;
  37. compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
  38. const hashFunction = compilation.outputOptions.hashFunction;
  39. compilation.hooks.moduleIds.tap(PLUGIN_NAME, () => {
  40. const chunkGraph = compilation.chunkGraph;
  41. const context = this.options.context
  42. ? this.options.context
  43. : compiler.context;
  44. const [usedIds, modules] = getUsedModuleIdsAndModules(compilation);
  45. const unnamedModules = assignNames(
  46. modules,
  47. (m) => getShortModuleName(m, context, root),
  48. (m, shortName) =>
  49. getLongModuleName(shortName, m, context, hashFunction, root),
  50. compareModulesByIdentifier,
  51. usedIds,
  52. (m, name) => chunkGraph.setModuleId(m, name)
  53. );
  54. if (unnamedModules.length > 0) {
  55. assignAscendingModuleIds(usedIds, unnamedModules, compilation);
  56. }
  57. });
  58. });
  59. }
  60. }
  61. module.exports = NamedModuleIdsPlugin;