-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
77 lines (65 loc) · 2.13 KB
/
index.js
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
'use strict';
const workerFarm = require('worker-farm');
const SourceMapConsumer = require("source-map").SourceMapConsumer;
const RawSource = require("webpack-sources").RawSource;
const SourceMapSource = require("webpack-sources").SourceMapSource;
const maxConcurrentWorkers = require('os').cpus().length;
const currentWorkers = 3;
function Compress(options) {
this.options = options || {};
}
Compress.prototype.apply = function(compiler) {
const options = this.options;
console.log(`maxConcurrentWorkers: ${maxConcurrentWorkers}`);
console.log(`currentWorkers: ${currentWorkers}`);
const worker = workerFarm({
maxConcurrentWorkers: currentWorkers,
maxRetries: 0,
}, require.resolve('./worker.js'));
compiler.plugin('compilation', compilation => {
compilation.plugin('optimize-chunk-assets', (chunks, callback) => {
const startTime = Date.now();
let files = [];
chunks.forEach(chunk => {
chunk.files.forEach(file => {
files.push(file);
});
});
compilation.additionalChunkAssets.forEach(file => {
files.push(file);
});
files = files.filter(f => /\js($|\?)/.test(f));
if (!files.length) return callback();
const tasks = files.map(file => {
const asset = compilation.assets[file];
const input = asset.source();
return new Promise((resolve, reject) => {
worker(input, file, options, (err, stream) => {
if (err) {
return reject(err);
}
compilation.assets[file] = new RawSource(stream);
resolve();
});
});
});
Promise.all(tasks)
.then(() => {
workerFarm.end(worker);
console.log(`Compress done. Cost ${Date.now() - startTime} ms.`);
callback();
})
.catch(err => {
workerFarm.end(worker);
console.log(`Compress error`);
console.error(err);
compilation.errors.push(err);
callback();
});
});
compilation.plugin("normal-module-loader", context => {
context.minimize = true;
});
});
};
module.exports = Compress;