HashedModuleIdsPlugin.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const createHash = require("./util/createHash");
  7. const validateOptions = require("schema-utils");
  8. const schema = require("../schemas/plugins/HashedModuleIdsPlugin.json");
  9. class HashedModuleIdsPlugin {
  10. constructor(options) {
  11. validateOptions(schema, options || {}, "Hashed Module Ids Plugin");
  12. this.options = Object.assign(
  13. {
  14. context: null,
  15. hashFunction: "md4",
  16. hashDigest: "base64",
  17. hashDigestLength: 4
  18. },
  19. options
  20. );
  21. }
  22. apply(compiler) {
  23. const options = this.options;
  24. compiler.hooks.compilation.tap("HashedModuleIdsPlugin", compilation => {
  25. const usedIds = new Set();
  26. compilation.hooks.beforeModuleIds.tap(
  27. "HashedModuleIdsPlugin",
  28. modules => {
  29. for (const module of modules) {
  30. if (module.id === null && module.libIdent) {
  31. const id = module.libIdent({
  32. context: this.options.context || compiler.options.context
  33. });
  34. const hash = createHash(options.hashFunction);
  35. hash.update(id);
  36. const hashId = hash.digest(options.hashDigest);
  37. let len = options.hashDigestLength;
  38. while (usedIds.has(hashId.substr(0, len))) len++;
  39. module.id = hashId.substr(0, len);
  40. usedIds.add(module.id);
  41. }
  42. }
  43. }
  44. );
  45. });
  46. }
  47. }
  48. module.exports = HashedModuleIdsPlugin;