webpack-hashed-module-id-plugin
Version:
Help making stable module id (compatible with Webpack 1 & 2)
46 lines (39 loc) • 1.65 kB
JavaScript
;
var createHash = require("crypto").createHash;
var extend = require("extend");
function HashedModuleIdsPlugin(options) {
this.options = extend(true, {
hashFunction: "md5",
hashDigest: "base64",
hashDigestLength: 4
}, options)
}
HashedModuleIdsPlugin.prototype.apply = function (compiler) {
var options = this.options;
compiler.plugin("compilation", function (compilation) {
var usedIds = new Set();
compilation.plugin("before-module-ids", function (modules) {
modules.forEach(function (module, index) {
if (module.id === null && module.libIdent && options) {
var id = module.libIdent({
context: options.context || compiler.options.context
});
var hash = createHash(options.hashFunction);
hash.update(id);
var hashId = hash.digest(options.hashDigest);
var len = options.hashDigestLength;
while (usedIds.has(hashId.substr(0, len)))
len++;
// Webpack 1 can't take character as id, so transform hash to ascii code here.
var shortenedHashId = hashId.substr(0, len);
module.id = 0;
for(var i = 0; i < len; i++) {
module.id += shortenedHashId[i].charCodeAt(0) * Math.pow(10, 2 * (len - i) - 2);
}
usedIds.add(module.id);
}
});
});
});
}
module.exports = HashedModuleIdsPlugin;