Repository navigation
Expand file tree
/
Copy pathindex.js
More file actions
59 lines (53 loc) · 2.1 KB
/
Copy pathindex.js
File metadata and controls
59 lines (53 loc) · 2.1 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
54
55
56
57
58
59
var util = require('util');
var path = require('path');
var fs = require('fs');
var crypto = require('crypto');
var packingGlob = require('packing-glob');
var mkdirp = require('mkdirp');
var assign = require('object-assign');
function RevWorldPlugin(patterns, options) {
this.patterns = util.isArray(patterns) ? patterns : [patterns];
this.options = assign({}, options, {
format: '[name]-[hash][ext]',
algorithm: 'md5',
length: 8
});
}
RevWorldPlugin.prototype.apply = function(compiler) {
var self = this;
var options = this.options;
compiler.plugin('emit', function(compilation, callback) {
var sourceMap = {};
self.patterns.forEach(function(pattern) {
var cwd = pattern.cwd ? (path.isAbsolute(pattern.cwd) ? pattern.cwd : path.resolve(process.cwd(), pattern.cwd)) : process.cwd();
var src = pattern.src;
var dest = path.isAbsolute(pattern.dest) ? pattern.dest : path.resolve(process.cwd(), pattern.dest);
var options = assign({ cwd: cwd, nodir: true}, pattern.glob);
packingGlob(src, options).forEach(function(item) {
var file = path.join(cwd, item);
var createHash = crypto.createHash(self.options.algorithm);
var fileData = fs.readFileSync(file);
var hash = createHash.update(fileData).digest('hex');
var suffix = hash.slice(0, self.options.length);
var ext = path.extname(file);
var newName = self.options.format
.replace('[name]', path.basename(file, ext))
.replace('[hash]', suffix)
.replace('[ext]', ext);
var destDir = path.join(dest, path.dirname(item))
var destFile = path.join(destDir, newName);
if (!fs.existsSync(destDir)) {
mkdirp.sync(destDir);
}
fs.writeFileSync(destFile, fileData);
var value = path.join(path.dirname(item), newName);
sourceMap[item] = value;
console.log('%s ====> %s', item, value);
});
});
// 将sourcemap绑定在compiler对象上传递给replace-hash-webpack-plugin使用
compiler.revSourceMap = sourceMap;
callback();
});
};
module.exports = RevWorldPlugin;