From 8bef94fdcc2f4b44a66ad0b8b39c78fa16429c4c Mon Sep 17 00:00:00 2001 From: bluwy Date: Tue, 20 Dec 2022 14:35:25 +0800 Subject: [PATCH 1/5] perf: improve file readable check --- packages/vite/src/node/plugins/resolve.ts | 7 ++++--- packages/vite/src/node/utils.ts | 11 +++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/vite/src/node/plugins/resolve.ts b/packages/vite/src/node/plugins/resolve.ts index 2c45771c46e101..0ba0ed0c314abf 100644 --- a/packages/vite/src/node/plugins/resolve.ts +++ b/packages/vite/src/node/plugins/resolve.ts @@ -26,7 +26,6 @@ import { isBuiltin, isDataUrl, isExternalUrl, - isFileReadable, isNonDriveRelativeAbsolutePath, isObject, isOptimizable, @@ -36,6 +35,7 @@ import { lookupFile, nestedResolveFrom, normalizePath, + readMode, resolveFrom, slash, } from '../utils' @@ -531,8 +531,9 @@ function tryResolveFile( tryPrefix?: string, skipPackageJson?: boolean, ): string | undefined { - if (isFileReadable(file)) { - if (!fs.statSync(file).isDirectory()) { + const stat = fs.statSync(file, { throwIfNoEntry: false }) + if (stat && (stat.mode & readMode) > 0) { + if (!stat.isDirectory()) { return getRealPath(file, options.preserveSymlinks) + postfix } else if (tryIndex) { if (!skipPackageJson) { diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts index d56b2fd5b8e302..fb8058db23c93d 100644 --- a/packages/vite/src/node/utils.ts +++ b/packages/vite/src/node/utils.ts @@ -535,13 +535,12 @@ export function writeFile( fs.writeFileSync(filename, content) } +export const readMode = + fs.constants.S_IRUSR | fs.constants.S_IRGRP | fs.constants.S_IROTH + export function isFileReadable(filename: string): boolean { - try { - fs.accessSync(filename, fs.constants.R_OK) - return true - } catch { - return false - } + const stat = fs.statSync(filename, { throwIfNoEntry: false }) + return stat ? (stat.mode & readMode) > 0 : false } const splitFirstDirRE = /(.+?)[\\/](.+)/ From e3505eada398c8df85160ca2c1268f7dc8497837 Mon Sep 17 00:00:00 2001 From: bluwy Date: Tue, 20 Dec 2022 15:42:05 +0800 Subject: [PATCH 2/5] fix: update check --- packages/vite/src/node/plugins/resolve.ts | 3 +-- packages/vite/src/node/utils.ts | 5 +---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/vite/src/node/plugins/resolve.ts b/packages/vite/src/node/plugins/resolve.ts index 0ba0ed0c314abf..de7e1b6d30695a 100644 --- a/packages/vite/src/node/plugins/resolve.ts +++ b/packages/vite/src/node/plugins/resolve.ts @@ -35,7 +35,6 @@ import { lookupFile, nestedResolveFrom, normalizePath, - readMode, resolveFrom, slash, } from '../utils' @@ -532,7 +531,7 @@ function tryResolveFile( skipPackageJson?: boolean, ): string | undefined { const stat = fs.statSync(file, { throwIfNoEntry: false }) - if (stat && (stat.mode & readMode) > 0) { + if (stat && (stat.mode & fs.constants.S_IRUSR) > 0) { if (!stat.isDirectory()) { return getRealPath(file, options.preserveSymlinks) + postfix } else if (tryIndex) { diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts index fb8058db23c93d..a20f8bde68bc50 100644 --- a/packages/vite/src/node/utils.ts +++ b/packages/vite/src/node/utils.ts @@ -535,12 +535,9 @@ export function writeFile( fs.writeFileSync(filename, content) } -export const readMode = - fs.constants.S_IRUSR | fs.constants.S_IRGRP | fs.constants.S_IROTH - export function isFileReadable(filename: string): boolean { const stat = fs.statSync(filename, { throwIfNoEntry: false }) - return stat ? (stat.mode & readMode) > 0 : false + return stat ? (stat.mode & fs.constants.S_IRUSR) > 0 : false } const splitFirstDirRE = /(.+?)[\\/](.+)/ From 28b6200357073a5fdb3b78e1ddff4c5899dcec12 Mon Sep 17 00:00:00 2001 From: bluwy Date: Tue, 20 Dec 2022 21:31:48 +0800 Subject: [PATCH 3/5] fix(resolve): remove file readable check --- packages/vite/src/node/plugins/resolve.ts | 2 +- packages/vite/src/node/utils.ts | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/vite/src/node/plugins/resolve.ts b/packages/vite/src/node/plugins/resolve.ts index de7e1b6d30695a..1cba88d3f68a42 100644 --- a/packages/vite/src/node/plugins/resolve.ts +++ b/packages/vite/src/node/plugins/resolve.ts @@ -531,7 +531,7 @@ function tryResolveFile( skipPackageJson?: boolean, ): string | undefined { const stat = fs.statSync(file, { throwIfNoEntry: false }) - if (stat && (stat.mode & fs.constants.S_IRUSR) > 0) { + if (stat) { if (!stat.isDirectory()) { return getRealPath(file, options.preserveSymlinks) + postfix } else if (tryIndex) { diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts index a20f8bde68bc50..d56b2fd5b8e302 100644 --- a/packages/vite/src/node/utils.ts +++ b/packages/vite/src/node/utils.ts @@ -536,8 +536,12 @@ export function writeFile( } export function isFileReadable(filename: string): boolean { - const stat = fs.statSync(filename, { throwIfNoEntry: false }) - return stat ? (stat.mode & fs.constants.S_IRUSR) > 0 : false + try { + fs.accessSync(filename, fs.constants.R_OK) + return true + } catch { + return false + } } const splitFirstDirRE = /(.+?)[\\/](.+)/ From 80f405ec22cb589d6ba5a52f7b7d8e8ed71ad1ff Mon Sep 17 00:00:00 2001 From: bluwy Date: Tue, 20 Dec 2022 21:36:11 +0800 Subject: [PATCH 4/5] perf(resolve): reduce ts check regex run --- packages/vite/src/node/plugins/resolve.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/vite/src/node/plugins/resolve.ts b/packages/vite/src/node/plugins/resolve.ts index 1cba88d3f68a42..8e029baf0fa907 100644 --- a/packages/vite/src/node/plugins/resolve.ts +++ b/packages/vite/src/node/plugins/resolve.ts @@ -529,6 +529,7 @@ function tryResolveFile( targetWeb: boolean, tryPrefix?: string, skipPackageJson?: boolean, + skipTsExtension?: boolean, ): string | undefined { const stat = fs.statSync(file, { throwIfNoEntry: false }) if (stat) { @@ -553,8 +554,12 @@ function tryResolveFile( } } - const tryTsExtension = options.isFromTsImporter && isPossibleTsOutput(file) - if (tryTsExtension) { + // try resolve .js import to typescript file + if ( + !skipTsExtension && + options.isFromTsImporter && + isPossibleTsOutput(file) + ) { const tsSrcPaths = getPotentialTsSrcPaths(file) for (const srcPath of tsSrcPaths) { const res = tryResolveFile( @@ -565,6 +570,7 @@ function tryResolveFile( targetWeb, tryPrefix, skipPackageJson, + true, ) if (res) return res } From b56801220804a3f039591a02e81010479a868e4e Mon Sep 17 00:00:00 2001 From: bluwy Date: Thu, 22 Dec 2022 16:38:04 +0800 Subject: [PATCH 5/5] perf(resolve): prevent ts resolve for extensions --- packages/vite/src/node/plugins/resolve.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/vite/src/node/plugins/resolve.ts b/packages/vite/src/node/plugins/resolve.ts index 8e029baf0fa907..d07589f40862cb 100644 --- a/packages/vite/src/node/plugins/resolve.ts +++ b/packages/vite/src/node/plugins/resolve.ts @@ -471,6 +471,7 @@ function tryFsResolve( targetWeb, options.tryPrefix, options.skipPackageJson, + false, )) ) { return res @@ -485,12 +486,16 @@ function tryFsResolve( targetWeb, options.tryPrefix, options.skipPackageJson, + false, )) ) { return res } } + // if `tryIndex` false, skip as we've already tested above + if (!tryIndex) return + if ( postfix && (res = tryResolveFile(