Skip to content

Commit 5c3a172

Browse files
author
Gleb Mikheev
committed
Feature: Async queue added (limit 4 parallel minification)
Fixed: jpg to png cache bug
1 parent f85e907 commit 5c3a172

File tree

3 files changed

+87
-18
lines changed

3 files changed

+87
-18
lines changed

index.js

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@ const streamifier = require('streamifier');
1616

1717
const Cache = require('async-disk-cache');
1818
const cache = new Cache('image-optimize-loader', { supportBuffer: true });
19+
const TaskQueue = require('task-queue-async');
20+
const asyncQueue = new TaskQueue({
21+
sleepBetweenTasks: 1,
22+
concurrency: 4,
23+
});
24+
// const concurrency = 0;
1925

2026
function getHashOf(value) {
2127
return crypto.createHash('sha256').update(value).digest('hex');
@@ -90,69 +96,83 @@ module.exports = function (content) {
9096

9197
const promiseOptimizeImage = Q.defer();
9298
const promisePrepareImage = Q.defer();
93-
const promiseCacheExists = Q.defer();
99+
const checkCacheExists = Q.defer();
100+
101+
102+
function startOptimization() {
103+
asyncQueue.addTask(function () {
104+
// concurrency++;
105+
// console.log(`\r optimize:start ${concurrency}`);
106+
107+
const completePromise = Q.defer();
108+
promisePrepareImage.resolve(completePromise);
109+
completePromise.promise.then(this.wrapCallback(() => {
110+
// concurrency--;
111+
// console.log(`\r optimize:finished ${concurrency}`);
112+
}));
113+
});
114+
}
94115

95116
// ensure cache exists
96-
promiseCacheExists.promise.then(() => {
117+
checkCacheExists.promise.then(() => {
97118
Q.all([
98119
cache.has(cacheKey),
99120
cache.has(`${cacheKey}-checksum`),
100121
]).then(checks => {
101-
promisePrepareImage.resolve();
102-
103122
// if cache is not found
104123
if (!checks[0] || !checks[1]) {
105-
promisePrepareImage.resolve();
124+
startOptimization();
106125
return;
107126
}
108127

109-
// check is cache up to date
128+
// check is cache up to date
110129
cache.get(`${cacheKey}-checksum`).then(results => {
111130
// if file not changed, return cached value
112-
if (results.value === fileHash) {
131+
if (results.value.fileHash === fileHash) {
113132
cache.get(cacheKey).then(cacheEntry => {
133+
this.resource = results.value.fileHash;
114134
promisePrepareImage.reject();
115135
return callback(null, cacheEntry.value);
116136
}).catch(callback);
117137

118138
// cache is outdated, create new image
119139
} else {
120-
promisePrepareImage.resolve();
140+
startOptimization();
121141
}
122142
});
123143
}).catch(callback);
124144
});
125145

126-
promisePrepareImage.promise.then(() => {
146+
promisePrepareImage.promise.then((completePromise) => {
127147
if (settings.optimizer.covertPngToJpg && fileExt === 'png' && isWebpack2) {
128148
streamifier.createReadStream(content)
129149
.pipe(new PNG())
130150
.on('metadata', data => {
131151
if (data.alpha) {
132-
return promiseOptimizeImage.resolve();
152+
return promiseOptimizeImage.resolve(completePromise);
133153
}
134154

135155
// if alpha not found - convert buffer to jpg
136-
this.resource = this.resource.replace(/.png$/, '.jpg');
137156
gm(content).toBuffer('JPG', (err, buffer) => {
138157
if (err) {
139158
return callback(err);
140159
}
141160

161+
this.resource = this.resource.replace(/.png$/, '.jpg');
142162
content = buffer;
143-
promiseOptimizeImage.resolve();
163+
promiseOptimizeImage.resolve(completePromise);
144164

145165
return false;
146166
});
147167

148168
return false;
149169
});
150170
} else {
151-
promiseOptimizeImage.resolve();
171+
promiseOptimizeImage.resolve(completePromise);
152172
}
153173
});
154174

155-
promiseOptimizeImage.promise.then(() => {
175+
promiseOptimizeImage.promise.then((completePromise) => {
156176
imagemin.buffer(content, {
157177
plugins: [
158178
imageminMozjpeg(settings.mozjpeg),
@@ -161,12 +181,17 @@ module.exports = function (content) {
161181
],
162182
}).then(file => {
163183
cache.set(cacheKey, file);
164-
cache.set(`${cacheKey}-checksum`, fileHash);
184+
cache.set(`${cacheKey}-checksum`, {
185+
fileHash,
186+
resource: this.resource,
187+
});
188+
189+
completePromise.resolve();
165190
callback(null, file);
166191
}).catch(callback);
167192
}).catch(callback);
168193

169-
promiseCacheExists.resolve();
194+
checkCacheExists.resolve();
170195
};
171196

172197
module.exports.raw = true;

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,5 +48,6 @@
4848
"istanbul": "0.4.4",
4949
"mocha": "2.5.3",
5050
"webpack": "git://github.com/webpack/webpack.git#6748dca837b6402f056b6ac94ffc3c99f8a25c36"
51-
}
52-
}
51+
},
52+
"versionify": "0.1.1"
53+
}

test/app.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,46 @@ require('./test.jpg');
44
require('./test.png');
55
require('./test-noalpha.png');
66
require('./test.svg');
7+
8+
require('./test.png?0');
9+
require('./test.png?1');
10+
require('./test.png?2');
11+
require('./test.png?3');
12+
require('./test.png?4');
13+
require('./test.png?5');
14+
require('./test.png?6');
15+
require('./test.png?7');
16+
require('./test.png?8');
17+
require('./test.png?9');
18+
require('./test.png?10');
19+
require('./test.png?11');
20+
require('./test.png?12');
21+
require('./test.png?13');
22+
require('./test.png?14');
23+
require('./test.png?15');
24+
require('./test.png?16');
25+
require('./test.png?17');
26+
require('./test.png?18');
27+
require('./test.png?19');
28+
29+
require('./test.png?20');
30+
require('./test.png?21');
31+
require('./test.png?22');
32+
require('./test.png?23');
33+
require('./test.png?24');
34+
require('./test.png?25');
35+
require('./test.png?26');
36+
require('./test.png?27');
37+
require('./test.png?28');
38+
require('./test.png?29');
39+
40+
require('./test.png?30');
41+
require('./test.png?31');
42+
require('./test.png?32');
43+
require('./test.png?33');
44+
require('./test.png?34');
45+
require('./test.png?35');
46+
require('./test.png?36');
47+
require('./test.png?37');
48+
require('./test.png?38');
49+
require('./test.png?39');

0 commit comments

Comments
 (0)