Skip to content

Commit f04875d

Browse files
authored
perf(dev-server): make asset middleware file lookup async (#6295)
1 parent 3f421ee commit f04875d

File tree

4 files changed

+28
-11
lines changed

4 files changed

+28
-11
lines changed

packages/core/src/server/assets-middleware/getFileFromUrl.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@ import type { OutputFileSystem } from './index';
66

77
const UP_PATH_REGEXP = /(?:^|[\\/])\.\.(?:[\\/]|$)/;
88

9-
export function getFileFromUrl(
9+
export async function getFileFromUrl(
1010
url: string,
1111
outputFileSystem: OutputFileSystem,
1212
environments: Record<string, EnvironmentContext>,
13-
): { filename: string; fsStats: FSStats } | { errorCode: number } | undefined {
13+
): Promise<
14+
{ filename: string; fsStats: FSStats } | { errorCode: number } | undefined
15+
> {
1416
let pathname: string | undefined;
1517

1618
try {
@@ -40,12 +42,24 @@ export function getFileFromUrl(
4042
Object.values(environments).map((env) => env.distPath),
4143
);
4244

45+
const stat = async (filename: string) => {
46+
return new Promise<FSStats | undefined>((resolve, reject) => {
47+
outputFileSystem.stat(filename, (err, stats) => {
48+
if (err) {
49+
reject(err);
50+
} else {
51+
resolve(stats);
52+
}
53+
});
54+
});
55+
};
56+
4357
for (const distPath of distPaths) {
4458
let filename = path.join(distPath, pathname);
4559
let fsStats: FSStats | undefined;
4660

4761
try {
48-
fsStats = outputFileSystem.statSync?.(filename);
62+
fsStats = await stat(filename);
4963
} catch {
5064
continue;
5165
}
@@ -62,7 +76,7 @@ export function getFileFromUrl(
6276
filename = path.join(filename, 'index.html');
6377

6478
try {
65-
fsStats = outputFileSystem.statSync?.(filename);
79+
fsStats = await stat(filename);
6680
} catch {
6781
continue;
6882
}

packages/core/src/server/assets-middleware/index.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Copyright JS Foundation and other contributors
77
* https://github.com/webpack/webpack-dev-middleware/blob/master/LICENSE
88
*/
9-
import type { Stats as FSStats, ReadStream } from 'node:fs';
9+
import type { ReadStream } from 'node:fs';
1010
import { createRequire } from 'node:module';
1111
import type { Compiler, MultiCompiler, Watching } from '@rspack/core';
1212
import { applyToCompiler, isMultiCompiler } from '../../helpers';
@@ -17,6 +17,7 @@ import type {
1717
NormalizedDevConfig,
1818
NormalizedEnvironmentConfig,
1919
RequestHandler,
20+
Rspack,
2021
} from '../../types';
2122
import { resolveHostname } from './../hmrFallback';
2223
import type { SocketServer } from '../socketServer';
@@ -28,14 +29,12 @@ const noop = () => {};
2829

2930
export type MultiWatching = ReturnType<MultiCompiler['watch']>;
3031

31-
// TODO: refine types to match underlying fs-like implementations
32-
export type OutputFileSystem = {
32+
export type OutputFileSystem = Rspack.OutputFileSystem & {
33+
// TODO: can be removed after Rspack adding this type
3334
createReadStream?: (
3435
p: string,
3536
opts: { start: number; end: number },
3637
) => ReadStream;
37-
statSync?: (p: string) => FSStats;
38-
readFileSync?: (p: string) => Buffer;
3938
};
4039

4140
export type Options = {

packages/core/src/server/assets-middleware/middleware.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,11 @@ export function createMiddleware(
325325
return;
326326
}
327327

328-
const resolved = getFileFromUrl(req.url, outputFileSystem, environments);
328+
const resolved = await getFileFromUrl(
329+
req.url,
330+
outputFileSystem,
331+
environments,
332+
);
329333

330334
if (!resolved) {
331335
await goNext();

packages/core/src/server/browserLogs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ const resolveSourceLocation = async (
5959
}
6060

6161
const { file, column, lineNumber } = frame;
62-
const sourceMapInfo = getFileFromUrl(
62+
const sourceMapInfo = await getFileFromUrl(
6363
`${file}.map`,
6464
fs as OutputFileSystem,
6565
environments,

0 commit comments

Comments
 (0)