NamedModuleIdsPlugin.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. getShortModuleName,
  9. getLongModuleName,
  10. assignNames,
  11. getUsedModuleIdsAndModules,
  12. assignAscendingModuleIds
  13. } = require("./IdHelpers");
  14. /** @typedef {import("../../declarations/WebpackOptions").OutputNormalized} Output */
  15. /** @typedef {import("../Compiler")} Compiler */
  16. /** @typedef {import("../Module")} Module */
  17. /**
  18. * @typedef {object} NamedModuleIdsPluginOptions
  19. * @property {string=} context context
  20. */
  21. const PLUGIN_NAME = "NamedModuleIdsPlugin";
  22. class NamedModuleIdsPlugin {
  23. /**
  24. * @param {NamedModuleIdsPluginOptions=} options options
  25. */
  26. constructor(options = {}) {
  27. this.options = options;
  28. }
  29. /**
  30. * Apply the plugin
  31. * @param {Compiler} compiler the compiler instance
  32. * @returns {void}
  33. */
  34. apply(compiler) {
  35. const { root } = compiler;
  36. compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
  37. const hashFunction =
  38. /** @type {NonNullable<Output["hashFunction"]>} */
  39. (compilation.outputOptions.hashFunction);
  40. compilation.hooks.moduleIds.tap(PLUGIN_NAME, () => {
  41. const chunkGraph = compilation.chunkGraph;
  42. const context = this.options.context
  43. ? this.options.context
  44. : compiler.context;
  45. const [usedIds, modules] = getUsedModuleIdsAndModules(compilation);
  46. const unnamedModules = assignNames(
  47. modules,
  48. m => getShortModuleName(m, context, root),
  49. (m, shortName) =>
  50. getLongModuleName(shortName, m, context, hashFunction, root),
  51. compareModulesByIdentifier,
  52. usedIds,
  53. (m, name) => chunkGraph.setModuleId(m, name)
  54. );
  55. if (unnamedModules.length > 0) {
  56. assignAscendingModuleIds(usedIds, unnamedModules, compilation);
  57. }
  58. });
  59. });
  60. }
  61. }
  62. module.exports = NamedModuleIdsPlugin;