index.js
1.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
var crypto = require('crypto');
module.exports = WebpackChunkHash;
function WebpackChunkHash(options)
{
options = options || {};
this.algorithm = options.algorithm || 'md5';
this.digest = options.digest || 'hex';
this.additionalHashContent = options.additionalHashContent || function() { return ''; };
}
WebpackChunkHash.prototype.apply = function(compiler)
{
var _plugin = this;
compiler.plugin('compilation', function(compilation)
{
compilation.plugin('chunk-hash', function(chunk, chunkHash)
{
var source = chunk.modules.map(getModuleSource).sort(sortById).reduce(concatenateSource, '')
, hash = crypto.createHash(_plugin.algorithm).update(source + _plugin.additionalHashContent(chunk))
;
chunkHash.digest = function(digest)
{
return hash.digest(digest || _plugin.digest);
};
});
});
};
// helpers
function sortById(a, b)
{
return a.id - b.id;
}
function getModuleSource(module)
{
return {
id : module.id,
source: (module._source || {})._value || '',
dependencies: (module.dependencies || []).map(function(d){ return d.module ? d.module.id : ''; })
};
}
function concatenateSource(result, module)
{
return result + '#' + module.id + ':' + module.source + '$' + (module.dependencies.join(','));
}