const createHash = require('webpack/lib/util/createHash') module.exports = class CustomModuleIdsPlugin { constructor (options) { this.options = Object.assign({ prefix: '', hashFunction: 'md4', hashDigest: 'base64', hashDigestLength: 4 }, options || {}) } apply (compiler) { const options = this.options compiler.hooks.compilation.tap('CustomModuleIdsPlugin', compilation => { const usedIds = new Set() compilation.hooks.beforeModuleIds.tap('CustomModuleIdsPlugin', modules => { for (const module of modules) { if (module.id !== null) { continue } const libIdent = module.libIdent ? module.libIdent({ context: options.context || compiler.options.context }) : null let id = options.custom && options.custom(libIdent, module) if (!id && libIdent) { const hash = createHash(options.hashFunction) hash.update(options.prefix + libIdent) const hashId = (hash.digest(options.hashDigest)) let len = options.hashDigestLength while (usedIds.has(hashId.substr(0, len))) len++ id = hashId.substr(0, len) usedIds.add(id) } if (id) { module.id = id } } }) }) } }