@@ -16,6 +16,12 @@ const streamifier = require('streamifier');
16
16
17
17
const Cache = require ( 'async-disk-cache' ) ;
18
18
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;
19
25
20
26
function getHashOf ( value ) {
21
27
return crypto . createHash ( 'sha256' ) . update ( value ) . digest ( 'hex' ) ;
@@ -90,69 +96,83 @@ module.exports = function (content) {
90
96
91
97
const promiseOptimizeImage = Q . defer ( ) ;
92
98
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
+ }
94
115
95
116
// ensure cache exists
96
- promiseCacheExists . promise . then ( ( ) => {
117
+ checkCacheExists . promise . then ( ( ) => {
97
118
Q . all ( [
98
119
cache . has ( cacheKey ) ,
99
120
cache . has ( `${ cacheKey } -checksum` ) ,
100
121
] ) . then ( checks => {
101
- promisePrepareImage . resolve ( ) ;
102
-
103
122
// if cache is not found
104
123
if ( ! checks [ 0 ] || ! checks [ 1 ] ) {
105
- promisePrepareImage . resolve ( ) ;
124
+ startOptimization ( ) ;
106
125
return ;
107
126
}
108
127
109
- // check is cache up to date
128
+ // check is cache up to date
110
129
cache . get ( `${ cacheKey } -checksum` ) . then ( results => {
111
130
// if file not changed, return cached value
112
- if ( results . value === fileHash ) {
131
+ if ( results . value . fileHash === fileHash ) {
113
132
cache . get ( cacheKey ) . then ( cacheEntry => {
133
+ this . resource = results . value . fileHash ;
114
134
promisePrepareImage . reject ( ) ;
115
135
return callback ( null , cacheEntry . value ) ;
116
136
} ) . catch ( callback ) ;
117
137
118
138
// cache is outdated, create new image
119
139
} else {
120
- promisePrepareImage . resolve ( ) ;
140
+ startOptimization ( ) ;
121
141
}
122
142
} ) ;
123
143
} ) . catch ( callback ) ;
124
144
} ) ;
125
145
126
- promisePrepareImage . promise . then ( ( ) => {
146
+ promisePrepareImage . promise . then ( ( completePromise ) => {
127
147
if ( settings . optimizer . covertPngToJpg && fileExt === 'png' && isWebpack2 ) {
128
148
streamifier . createReadStream ( content )
129
149
. pipe ( new PNG ( ) )
130
150
. on ( 'metadata' , data => {
131
151
if ( data . alpha ) {
132
- return promiseOptimizeImage . resolve ( ) ;
152
+ return promiseOptimizeImage . resolve ( completePromise ) ;
133
153
}
134
154
135
155
// if alpha not found - convert buffer to jpg
136
- this . resource = this . resource . replace ( / .p n g $ / , '.jpg' ) ;
137
156
gm ( content ) . toBuffer ( 'JPG' , ( err , buffer ) => {
138
157
if ( err ) {
139
158
return callback ( err ) ;
140
159
}
141
160
161
+ this . resource = this . resource . replace ( / .p n g $ / , '.jpg' ) ;
142
162
content = buffer ;
143
- promiseOptimizeImage . resolve ( ) ;
163
+ promiseOptimizeImage . resolve ( completePromise ) ;
144
164
145
165
return false ;
146
166
} ) ;
147
167
148
168
return false ;
149
169
} ) ;
150
170
} else {
151
- promiseOptimizeImage . resolve ( ) ;
171
+ promiseOptimizeImage . resolve ( completePromise ) ;
152
172
}
153
173
} ) ;
154
174
155
- promiseOptimizeImage . promise . then ( ( ) => {
175
+ promiseOptimizeImage . promise . then ( ( completePromise ) => {
156
176
imagemin . buffer ( content , {
157
177
plugins : [
158
178
imageminMozjpeg ( settings . mozjpeg ) ,
@@ -161,12 +181,17 @@ module.exports = function (content) {
161
181
] ,
162
182
} ) . then ( file => {
163
183
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 ( ) ;
165
190
callback ( null , file ) ;
166
191
} ) . catch ( callback ) ;
167
192
} ) . catch ( callback ) ;
168
193
169
- promiseCacheExists . resolve ( ) ;
194
+ checkCacheExists . resolve ( ) ;
170
195
} ;
171
196
172
197
module . exports . raw = true ;
0 commit comments