From 3855f184a644929ef3de400d69f6e36f9c6514f9 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Fri, 17 Jan 2025 17:25:17 +0000 Subject: [PATCH 1/3] perf(dev): avoid writing/creating manifest before clearing directory --- packages/nuxi/src/utils/dev.ts | 21 +++++++++++++-------- packages/nuxi/src/utils/fs.ts | 2 +- packages/nuxi/src/utils/nuxt.ts | 11 +++-------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/nuxi/src/utils/dev.ts b/packages/nuxi/src/utils/dev.ts index bdc09b141..8dc7f1863 100644 --- a/packages/nuxi/src/utils/dev.ts +++ b/packages/nuxi/src/utils/dev.ts @@ -19,7 +19,7 @@ import { joinURL } from 'ufo' import { clearBuildDir } from '../utils/fs' import { loadKit } from '../utils/kit' import { logger } from '../utils/logger' -import { loadNuxtManifest, writeNuxtManifest } from '../utils/nuxt' +import { loadNuxtManifest, resolveNuxtManifest, writeNuxtManifest } from '../utils/nuxt' export type NuxtDevIPCMessage = | { type: 'nuxt:internal:dev:ready', port: number } @@ -130,9 +130,9 @@ class NuxtDevServer extends EventEmitter { res.setHeader('Content-Type', 'text/html') const loadingTemplate = this.options.loadingTemplate - || this._currentNuxt?.options.devServer.loadingTemplate - || await this._jiti.import<{ loading: () => string }>('@nuxt/ui-templates').then(r => r.loading).catch(() => {}) - || ((params: { loading: string }) => `

${params.loading}

`) + || this._currentNuxt?.options.devServer.loadingTemplate + || await this._jiti.import<{ loading: () => string }>('@nuxt/ui-templates').then(r => r.loading).catch(() => {}) + || ((params: { loading: string }) => `

${params.loading}

`) res.end( loadingTemplate({ loading: _error?.toString() || this._loadingMessage || 'Loading...', @@ -216,10 +216,15 @@ class NuxtDevServer extends EventEmitter { // Write manifest and also check if we need cache invalidation if (!reload) { - const previousManifest = await loadNuxtManifest( - this._currentNuxt.options.buildDir, - ) - const newManifest = await writeNuxtManifest(this._currentNuxt) + const previousManifest = await loadNuxtManifest(this._currentNuxt.options.buildDir) + const newManifest = resolveNuxtManifest(this._currentNuxt) + + // we deliberately do not block initialising Nuxt on creation of the manifest + const promise = writeNuxtManifest(this._currentNuxt, newManifest) + this._currentNuxt.hooks.hookOnce('ready', async () => { + await promise + }) + if ( previousManifest && newManifest diff --git a/packages/nuxi/src/utils/fs.ts b/packages/nuxi/src/utils/fs.ts index bc7c2273c..13258f08b 100644 --- a/packages/nuxi/src/utils/fs.ts +++ b/packages/nuxi/src/utils/fs.ts @@ -32,7 +32,7 @@ export async function clearDir(path: string, exclude?: string[]) { } export function clearBuildDir(path: string) { - return clearDir(path, ['cache', 'analyze']) + return clearDir(path, ['cache', 'analyze', 'nuxt.json']) } export async function rmRecursive(paths: string[]) { diff --git a/packages/nuxi/src/utils/nuxt.ts b/packages/nuxi/src/utils/nuxt.ts index c0b5e29a6..d8863f0ee 100644 --- a/packages/nuxi/src/utils/nuxt.ts +++ b/packages/nuxi/src/utils/nuxt.ts @@ -42,7 +42,7 @@ export function nuxtVersionToGitIdentifier(version: string) { return `v${version}` } -function resolveNuxtManifest(nuxt: Nuxt): NuxtProjectManifest { +export function resolveNuxtManifest(nuxt: Nuxt): NuxtProjectManifest { const manifest: NuxtProjectManifest = { _hash: null, project: { @@ -56,19 +56,14 @@ function resolveNuxtManifest(nuxt: Nuxt): NuxtProjectManifest { return manifest } -export async function writeNuxtManifest( - nuxt: Nuxt, -): Promise { - const manifest = resolveNuxtManifest(nuxt) +export async function writeNuxtManifest(nuxt: Nuxt, manifest = resolveNuxtManifest(nuxt)): Promise { const manifestPath = resolve(nuxt.options.buildDir, 'nuxt.json') await fsp.mkdir(dirname(manifestPath), { recursive: true }) await fsp.writeFile(manifestPath, JSON.stringify(manifest, null, 2), 'utf-8') return manifest } -export async function loadNuxtManifest( - buildDir: string, -): Promise { +export async function loadNuxtManifest(buildDir: string): Promise { const manifestPath = resolve(buildDir, 'nuxt.json') const manifest: NuxtProjectManifest | null = await fsp .readFile(manifestPath, 'utf-8') From f803971c8ec5e303ab00ba660e6936cec7c42b35 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Fri, 17 Jan 2025 21:26:14 +0000 Subject: [PATCH 2/3] chore: remove space --- packages/nuxi/src/utils/dev.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/nuxi/src/utils/dev.ts b/packages/nuxi/src/utils/dev.ts index 8dc7f1863..b536d86d5 100644 --- a/packages/nuxi/src/utils/dev.ts +++ b/packages/nuxi/src/utils/dev.ts @@ -289,7 +289,6 @@ class NuxtDevServer extends EventEmitter { } await Promise.all([ - kit.writeTypes(this._currentNuxt).catch(console.error), kit.buildNuxt(this._currentNuxt), ]) From ed8ecf2182c5e26a788f28e987a269770d3f107d Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Fri, 17 Jan 2025 21:27:33 +0000 Subject: [PATCH 3/3] chore: lint --- packages/nuxi/src/utils/dev.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/nuxi/src/utils/dev.ts b/packages/nuxi/src/utils/dev.ts index b536d86d5..b25f26f77 100644 --- a/packages/nuxi/src/utils/dev.ts +++ b/packages/nuxi/src/utils/dev.ts @@ -130,9 +130,9 @@ class NuxtDevServer extends EventEmitter { res.setHeader('Content-Type', 'text/html') const loadingTemplate = this.options.loadingTemplate - || this._currentNuxt?.options.devServer.loadingTemplate - || await this._jiti.import<{ loading: () => string }>('@nuxt/ui-templates').then(r => r.loading).catch(() => {}) - || ((params: { loading: string }) => `

${params.loading}

`) + || this._currentNuxt?.options.devServer.loadingTemplate + || await this._jiti.import<{ loading: () => string }>('@nuxt/ui-templates').then(r => r.loading).catch(() => {}) + || ((params: { loading: string }) => `

${params.loading}

`) res.end( loadingTemplate({ loading: _error?.toString() || this._loadingMessage || 'Loading...',