From fb7ba5353bb35d41f2ec2c90b6b8e5fecd508d07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arnaud=20Barr=C3=A9?= Date: Sun, 16 Jan 2022 21:40:15 +0100 Subject: [PATCH] refactor: enforce a cache directory (#6415) --- docs/config/index.md | 2 +- packages/vite/src/node/build.ts | 16 +++++++-------- packages/vite/src/node/config.ts | 6 +++++- packages/vite/src/node/http.ts | 13 +++--------- packages/vite/src/node/optimizer/index.ts | 5 ----- packages/vite/src/node/plugins/resolve.ts | 3 +-- packages/vite/src/node/server/index.ts | 20 +++++++++---------- .../src/node/server/middlewares/transform.ts | 17 ++++++---------- 8 files changed, 32 insertions(+), 50 deletions(-) diff --git a/docs/config/index.md b/docs/config/index.md index 5d2de719e8ccaa..49b7cdc9790667 100644 --- a/docs/config/index.md +++ b/docs/config/index.md @@ -169,7 +169,7 @@ export default defineConfig(async ({ command, mode }) => { - **Type:** `string` - **Default:** `"node_modules/.vite"` - Directory to save cache files. Files in this directory are pre-bundled deps or some other cache files generated by vite, which can improve the performance. You can use `--force` flag or manually delete the directory to regenerate the cache files. The value can be either an absolute file system path or a path relative to project root. + Directory to save cache files. Files in this directory are pre-bundled deps or some other cache files generated by vite, which can improve the performance. You can use `--force` flag or manually delete the directory to regenerate the cache files. The value can be either an absolute file system path or a path relative to project root. Default to `.vite` when no package.json is detected. ### resolve.alias diff --git a/packages/vite/src/node/build.ts b/packages/vite/src/node/build.ts index 83c5fe5cf27734..84ffb93b432f15 100644 --- a/packages/vite/src/node/build.ts +++ b/packages/vite/src/node/build.ts @@ -431,15 +431,13 @@ async function doBuild( if (ssr) { // see if we have cached deps data available let knownImports: string[] | undefined - if (config.cacheDir) { - const dataPath = path.join(config.cacheDir, '_metadata.json') - try { - const data = JSON.parse( - fs.readFileSync(dataPath, 'utf-8') - ) as DepOptimizationMetadata - knownImports = Object.keys(data.optimized) - } catch (e) {} - } + const dataPath = path.join(config.cacheDir, '_metadata.json') + try { + const data = JSON.parse( + fs.readFileSync(dataPath, 'utf-8') + ) as DepOptimizationMetadata + knownImports = Object.keys(data.optimized) + } catch (e) {} if (!knownImports) { // no dev deps optimization data, do a fresh scan knownImports = Object.keys((await scanImports(config)).deps) diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index 2b55f7355a6ca2..af4e26578a4779 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -92,6 +92,7 @@ export interface UserConfig { * the performance. You can use `--force` flag or manually delete the directory * to regenerate the cache files. The value can be either an absolute file * system path or a path relative to . + * Default to `.vite` when no package.json is detected. * @default 'node_modules/.vite' */ cacheDir?: string @@ -244,6 +245,7 @@ export type ResolvedConfig = Readonly< root: string base: string publicDir: string + cacheDir: string command: 'build' | 'serve' mode: string isProduction: boolean @@ -410,7 +412,9 @@ export async function resolveConfig( ) const cacheDir = config.cacheDir ? path.resolve(resolvedRoot, config.cacheDir) - : pkgPath && path.join(path.dirname(pkgPath), `node_modules/.vite`) + : pkgPath + ? path.join(path.dirname(pkgPath), `node_modules/.vite`) + : path.join(resolvedRoot, `.vite`) const assetsFilter = config.assetsInclude ? createFilter(config.assetsInclude) diff --git a/packages/vite/src/node/http.ts b/packages/vite/src/node/http.ts index becc2191efac7f..fd45907ce0b723 100644 --- a/packages/vite/src/node/http.ts +++ b/packages/vite/src/node/http.ts @@ -122,7 +122,7 @@ export async function resolveHttpServer( export async function resolveHttpsConfig( https: boolean | HttpsServerOptions | undefined, - cacheDir: string | undefined + cacheDir: string ): Promise { if (!https) return undefined @@ -152,14 +152,7 @@ function readFileIfExists(value?: string | Buffer | any[]) { return value } -async function createCertificateLazily() { - const { createCertificate } = await import('./certificate') - return createCertificate() -} - -async function getCertificate(cacheDir?: string) { - if (!cacheDir) return await createCertificateLazily() - +async function getCertificate(cacheDir: string) { const cachePath = path.join(cacheDir, '_cert.pem') try { @@ -174,7 +167,7 @@ async function getCertificate(cacheDir?: string) { return content } catch { - const content = await createCertificateLazily() + const content = (await import('./certificate')).createCertificate() fsp .mkdir(cacheDir, { recursive: true }) .then(() => fsp.writeFile(cachePath, content)) diff --git a/packages/vite/src/node/optimizer/index.ts b/packages/vite/src/node/optimizer/index.ts index 5c32cf4802ad3e..6102e832841a89 100644 --- a/packages/vite/src/node/optimizer/index.ts +++ b/packages/vite/src/node/optimizer/index.ts @@ -118,11 +118,6 @@ export async function optimizeDeps( const { root, logger, cacheDir } = config const log = asCommand ? logger.info : debug - if (!cacheDir) { - log(`No cache directory. Skipping.`) - return null - } - const dataPath = path.join(cacheDir, '_metadata.json') const mainHash = getDepHash(root, config) const data: DepOptimizationMetadata = { diff --git a/packages/vite/src/node/plugins/resolve.ts b/packages/vite/src/node/plugins/resolve.ts index 38cd5326283d3a..c98ba473aa9075 100644 --- a/packages/vite/src/node/plugins/resolve.ts +++ b/packages/vite/src/node/plugins/resolve.ts @@ -607,10 +607,9 @@ export function tryOptimizedResolve( server: ViteDevServer, importer?: string ): string | undefined { - const cacheDir = server.config.cacheDir const depData = server._optimizeDepsMetadata - if (!cacheDir || !depData) return + if (!depData) return const getOptimizedUrl = (optimizedData: typeof depData.optimized[string]) => { return ( diff --git a/packages/vite/src/node/server/index.ts b/packages/vite/src/node/server/index.ts index edd7f43f84f8b0..aeea862dbc173f 100644 --- a/packages/vite/src/node/server/index.ts +++ b/packages/vite/src/node/server/index.ts @@ -561,18 +561,16 @@ export async function createServer( middlewares.use(errorMiddleware(server, !!middlewareMode)) const runOptimize = async () => { - if (config.cacheDir) { - server._isRunningOptimizer = true - try { - server._optimizeDepsMetadata = await optimizeDeps( - config, - config.server.force || server._forceOptimizeOnRestart - ) - } finally { - server._isRunningOptimizer = false - } - server._registerMissingImport = createMissingImporterRegisterFn(server) + server._isRunningOptimizer = true + try { + server._optimizeDepsMetadata = await optimizeDeps( + config, + config.server.force || server._forceOptimizeOnRestart + ) + } finally { + server._isRunningOptimizer = false } + server._registerMissingImport = createMissingImporterRegisterFn(server) } if (!middlewareMode && httpServer) { diff --git a/packages/vite/src/node/server/middlewares/transform.ts b/packages/vite/src/node/server/middlewares/transform.ts index b84cee8e0d79c7..15f2355e0e389c 100644 --- a/packages/vite/src/node/server/middlewares/transform.ts +++ b/packages/vite/src/node/server/middlewares/transform.ts @@ -48,19 +48,14 @@ export function transformMiddleware( } = server // determine the url prefix of files inside cache directory - let cacheDirPrefix: string | undefined - if (cacheDir) { - const cacheDirRelative = normalizePath(path.relative(root, cacheDir)) - if (cacheDirRelative.startsWith('../')) { - // if the cache directory is outside root, the url prefix would be something + const cacheDirRelative = normalizePath(path.relative(root, cacheDir)) + const cacheDirPrefix = cacheDirRelative.startsWith('../') + ? // if the cache directory is outside root, the url prefix would be something // like '/@fs/absolute/path/to/node_modules/.vite' - cacheDirPrefix = `/@fs/${normalizePath(cacheDir).replace(/^\//, '')}` - } else { - // if the cache directory is inside root, the url prefix would be something + `/@fs/${normalizePath(cacheDir).replace(/^\//, '')}` + : // if the cache directory is inside root, the url prefix would be something // like '/node_modules/.vite' - cacheDirPrefix = `/${cacheDirRelative}` - } - } + `/${cacheDirRelative}` // Keep the named function. The name is visible in debug logs via `DEBUG=connect:dispatcher ...` return async function viteTransformMiddleware(req, res, next) {