Skip to content

Commit 36c6cad

Browse files
committed
feat(Server): support max middleware count
1 parent 4356b58 commit 36c6cad

File tree

1 file changed

+37
-2
lines changed

1 file changed

+37
-2
lines changed

src/commands/server.js

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ exports.run = (options) => {
208208
const project = Manager.getProject(projectCwd, { cache: false });
209209
const wpConfig = project.config._config;
210210
const outputDir = project.config._config.output.local.path || 'prd';
211+
const maxMiddleware = project.config._config.maxMiddleware || 3;
211212

212213
// 非 output.path 下的资源不做处理
213214
if(keys[2] !== sysPath.relative(projectCwd, outputDir)) {
@@ -235,9 +236,40 @@ exports.run = (options) => {
235236
const requestUrl = req.url.replace('.map', '').slice(1);
236237
const cacheId = sysPath.join(projectName, requestUrl);
237238

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+
238269
// 寻找已有的 middlewareCache
239-
if(middlewareCache[cacheId]) {
270+
if (middlewareCache[cacheId]) {
240271
middlewareCache[cacheId](req, res, next);
272+
middlewareCache[cacheId]._visit += 1;
241273
return;
242274
}
243275

@@ -439,7 +471,7 @@ exports.run = (options) => {
439471
io.emit('testAppID', assetEntrys);
440472

441473
Object.keys(stats.compilation.assets).map((key) => {
442-
const keyCacheId = sysPath.join(projectName, key);
474+
const keyCacheId = sysPath.join(projectName, key).replace('.map', '');
443475
middlewareCache[keyCacheId] = middleware;
444476

445477
if(verbose) {
@@ -452,6 +484,9 @@ exports.run = (options) => {
452484
}
453485
);
454486

487+
middleware._timestamp = +new Date();
488+
middleware._visit = 1;
489+
455490
if(hotEnabled) {
456491
app.use(require('webpack-hot-middleware')(compiler, {
457492
log: false,

0 commit comments

Comments
 (0)