@@ -208,6 +208,7 @@ exports.run = (options) => {
208
208
const project = Manager . getProject ( projectCwd , { cache : false } ) ;
209
209
const wpConfig = project . config . _config ;
210
210
const outputDir = project . config . _config . output . local . path || 'prd' ;
211
+ const maxMiddleware = project . config . _config . maxMiddleware || 3 ;
211
212
212
213
// 非 output.path 下的资源不做处理
213
214
if ( keys [ 2 ] !== sysPath . relative ( projectCwd , outputDir ) ) {
@@ -235,9 +236,40 @@ exports.run = (options) => {
235
236
const requestUrl = req . url . replace ( '.map' , '' ) . slice ( 1 ) ;
236
237
const cacheId = sysPath . join ( projectName , requestUrl ) ;
237
238
239
+ // 按照访问次数/访问间隔做权重排序,默认保留三个 middleware
240
+ const now = + new Date ( ) ;
241
+ const middlewareList = Object . keys ( middlewareCache )
242
+ . map ( key => {
243
+ const middleware = middlewareCache [ key ] ;
244
+ return {
245
+ key,
246
+ middleware : middleware ,
247
+ weight : middleware . _visit / ( now - middleware . _timestamp ) * 1000
248
+ } ;
249
+ } )
250
+ . sort ( ( a , b ) => b . weight - a . weight ) ;
251
+
252
+ log ( middlewareList . map ( v => `${ v . key } ${ v . weight } ` ) ) ;
253
+
254
+ let removeLen = middlewareList . length - maxMiddleware ;
255
+ let index = middlewareList . length - 1 ;
256
+
257
+ while ( removeLen > 0 ) {
258
+ const key = middlewareList [ index ] . key ;
259
+ if ( key !== cacheId ) {
260
+ const md = middlewareCache [ key ] ;
261
+ delete middlewareCache [ key ] ;
262
+ md . close ( ) ;
263
+ }
264
+
265
+ removeLen -= 1 ;
266
+ index -= 1 ;
267
+ }
268
+
238
269
// 寻找已有的 middlewareCache
239
- if ( middlewareCache [ cacheId ] ) {
270
+ if ( middlewareCache [ cacheId ] ) {
240
271
middlewareCache [ cacheId ] ( req , res , next ) ;
272
+ middlewareCache [ cacheId ] . _visit += 1 ;
241
273
return ;
242
274
}
243
275
@@ -439,7 +471,7 @@ exports.run = (options) => {
439
471
io . emit ( 'testAppID' , assetEntrys ) ;
440
472
441
473
Object . keys ( stats . compilation . assets ) . map ( ( key ) => {
442
- const keyCacheId = sysPath . join ( projectName , key ) ;
474
+ const keyCacheId = sysPath . join ( projectName , key ) . replace ( '.map' , '' ) ;
443
475
middlewareCache [ keyCacheId ] = middleware ;
444
476
445
477
if ( verbose ) {
@@ -452,6 +484,9 @@ exports.run = (options) => {
452
484
}
453
485
) ;
454
486
487
+ middleware . _timestamp = + new Date ( ) ;
488
+ middleware . _visit = 1 ;
489
+
455
490
if ( hotEnabled ) {
456
491
app . use ( require ( 'webpack-hot-middleware' ) ( compiler , {
457
492
log : false ,
0 commit comments