From 0126307da2e8d19f7a0d146ddb29f88678b86b52 Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Thu, 4 Aug 2022 15:53:23 +0800 Subject: [PATCH 1/6] fix(vite-node): improve `vite-node` HMR --- packages/vite/src/runtime/vite-node.mjs | 16 +++++++---- packages/vite/src/vite-node.ts | 38 ++++++++++++++++++++++--- 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/packages/vite/src/runtime/vite-node.mjs b/packages/vite/src/runtime/vite-node.mjs index 94f45f25b30..4dd15d6fe44 100644 --- a/packages/vite/src/runtime/vite-node.mjs +++ b/packages/vite/src/runtime/vite-node.mjs @@ -20,13 +20,17 @@ export default async (ssrContext) => { // Workaround for stub mode // https://github.com/nuxt/framework/pull/3983 process.server = true + + // Invaildate cache for files changed since last rendering + const invalidates = await $fetch('/invalidates', { + baseURL: viteNodeOptions.baseURL + }) + for (const key of invalidates) { + runner.moduleCache.delete(key) + } + + // Execute SSR bundle on-demand render = render || (await runner.executeFile(viteNodeOptions.entryPath)).default const result = await render(ssrContext) - // reset cache for non-node-modules - for (const key of runner.moduleCache.keys()) { - if (!key.includes('/node_modules/')) { - runner.moduleCache.delete(key) - } - } return result } diff --git a/packages/vite/src/vite-node.ts b/packages/vite/src/vite-node.ts index 7efb545f615..7853b981aaf 100644 --- a/packages/vite/src/vite-node.ts +++ b/packages/vite/src/vite-node.ts @@ -4,7 +4,7 @@ import { ViteNodeServer } from 'vite-node/server' import fse from 'fs-extra' import { resolve } from 'pathe' import { addServerMiddleware } from '@nuxt/kit' -import type { Plugin as VitePlugin, ViteDevServer } from 'vite' +import type { ModuleNode, Plugin as VitePlugin, ViteDevServer } from 'vite' import { resolve as resolveModule } from 'mlly' import { distDir } from './dirs' import type { ViteBuildContext } from './vite' @@ -14,11 +14,27 @@ import { createIsExternal } from './utils/external' // TODO: Remove this in favor of registerViteNodeMiddleware // after Nitropack or h3 fixed for adding middlewares after setup export function viteNodePlugin (ctx: ViteBuildContext): VitePlugin { + const invalidateIDs = new Set() return { name: 'nuxt:vite-node-server', - enforce: 'pre', + enforce: 'post', configureServer (server) { - server.middlewares.use('/__nuxt_vite_node__', createViteNodeMiddleware(ctx)) + server.middlewares.use('/__nuxt_vite_node__', createViteNodeMiddleware(ctx, invalidateIDs)) + }, + handleHotUpdate ({ file, server }) { + function markMod (mod: ModuleNode) { + if (invalidateIDs.has(mod.id)) { + return + } + invalidateIDs.add(mod.id) + for (const importer of mod.importers) { + markMod(importer) + } + } + const mods = server.moduleGraph.getModulesByFile(file) || [] + for (const mod of mods) { + markMod(mod) + } } } } @@ -49,7 +65,7 @@ function getManifest (server: ViteDevServer) { } } -function createViteNodeMiddleware (ctx: ViteBuildContext) { +function createViteNodeMiddleware (ctx: ViteBuildContext, invalidateIDs: Set = new Set()) { const app = createApp() app.use('/manifest', defineEventHandler(() => { @@ -57,6 +73,20 @@ function createViteNodeMiddleware (ctx: ViteBuildContext) { return manifest })) + app.use('/invalidates', defineEventHandler(() => { + // When a file has been invalidate, we also invalidate the entry module + if (invalidateIDs.size) { + for (const key of ctx.ssrServer.moduleGraph.fileToModulesMap.keys()) { + if (key.startsWith(ctx.nuxt.options.appDir)) { + invalidateIDs.add(key) + } + } + } + const ids = Array.from(invalidateIDs) + invalidateIDs.clear() + return ids + })) + app.use('/module', defineLazyEventHandler(() => { const viteServer = ctx.ssrServer const node: ViteNodeServer = new ViteNodeServer(viteServer, { From a5be183ef7b2116171428e32b05e37bdea370483 Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Thu, 4 Aug 2022 16:00:52 +0800 Subject: [PATCH 2/6] chore: naming --- packages/vite/src/vite-node.ts | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/packages/vite/src/vite-node.ts b/packages/vite/src/vite-node.ts index 7853b981aaf..a5e11665a4b 100644 --- a/packages/vite/src/vite-node.ts +++ b/packages/vite/src/vite-node.ts @@ -14,26 +14,27 @@ import { createIsExternal } from './utils/external' // TODO: Remove this in favor of registerViteNodeMiddleware // after Nitropack or h3 fixed for adding middlewares after setup export function viteNodePlugin (ctx: ViteBuildContext): VitePlugin { - const invalidateIDs = new Set() + // Store the invalidates for the next rendering + const invalidates = new Set() return { name: 'nuxt:vite-node-server', enforce: 'post', configureServer (server) { - server.middlewares.use('/__nuxt_vite_node__', createViteNodeMiddleware(ctx, invalidateIDs)) + server.middlewares.use('/__nuxt_vite_node__', createViteNodeMiddleware(ctx, invalidates)) }, handleHotUpdate ({ file, server }) { - function markMod (mod: ModuleNode) { - if (invalidateIDs.has(mod.id)) { + function markInvalidate (mod: ModuleNode) { + if (invalidates.has(mod.id)) { return } - invalidateIDs.add(mod.id) + invalidates.add(mod.id) for (const importer of mod.importers) { - markMod(importer) + markInvalidate(importer) } } const mods = server.moduleGraph.getModulesByFile(file) || [] for (const mod of mods) { - markMod(mod) + markInvalidate(mod) } } } @@ -65,7 +66,7 @@ function getManifest (server: ViteDevServer) { } } -function createViteNodeMiddleware (ctx: ViteBuildContext, invalidateIDs: Set = new Set()) { +function createViteNodeMiddleware (ctx: ViteBuildContext, invalidates: Set = new Set()) { const app = createApp() app.use('/manifest', defineEventHandler(() => { @@ -75,15 +76,15 @@ function createViteNodeMiddleware (ctx: ViteBuildContext, invalidateIDs: Set { // When a file has been invalidate, we also invalidate the entry module - if (invalidateIDs.size) { + if (invalidates.size) { for (const key of ctx.ssrServer.moduleGraph.fileToModulesMap.keys()) { if (key.startsWith(ctx.nuxt.options.appDir)) { - invalidateIDs.add(key) + invalidates.add(key) } } } - const ids = Array.from(invalidateIDs) - invalidateIDs.clear() + const ids = Array.from(invalidates) + invalidates.clear() return ids })) From 21df05d35d2d670efa977d8bc97b3bfaf435d4f7 Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Thu, 4 Aug 2022 16:06:40 +0800 Subject: [PATCH 3/6] Update packages/vite/src/runtime/vite-node.mjs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Damian Głowala <48835293+DamianGlowala@users.noreply.github.com> --- packages/vite/src/runtime/vite-node.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/runtime/vite-node.mjs b/packages/vite/src/runtime/vite-node.mjs index 4dd15d6fe44..98661841193 100644 --- a/packages/vite/src/runtime/vite-node.mjs +++ b/packages/vite/src/runtime/vite-node.mjs @@ -21,7 +21,7 @@ export default async (ssrContext) => { // https://github.com/nuxt/framework/pull/3983 process.server = true - // Invaildate cache for files changed since last rendering + // Invalidate cache for files changed since last rendering const invalidates = await $fetch('/invalidates', { baseURL: viteNodeOptions.baseURL }) From 9c4ebeac0a137be07a4de7912b8f952ae89d55f9 Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Thu, 4 Aug 2022 16:06:46 +0800 Subject: [PATCH 4/6] Update packages/vite/src/vite-node.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Damian Głowala <48835293+DamianGlowala@users.noreply.github.com> --- packages/vite/src/vite-node.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/vite-node.ts b/packages/vite/src/vite-node.ts index a5e11665a4b..0053e78542b 100644 --- a/packages/vite/src/vite-node.ts +++ b/packages/vite/src/vite-node.ts @@ -75,7 +75,7 @@ function createViteNodeMiddleware (ctx: ViteBuildContext, invalidates: Set { - // When a file has been invalidate, we also invalidate the entry module + // When a file has been invalidated, we also invalidate the entry module if (invalidates.size) { for (const key of ctx.ssrServer.moduleGraph.fileToModulesMap.keys()) { if (key.startsWith(ctx.nuxt.options.appDir)) { From 99e4d95f879e08656166ceda32cc4b3bb26141b2 Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Thu, 4 Aug 2022 16:06:59 +0800 Subject: [PATCH 5/6] Update packages/vite/src/runtime/vite-node.mjs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Damian Głowala <48835293+DamianGlowala@users.noreply.github.com> --- packages/vite/src/runtime/vite-node.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/runtime/vite-node.mjs b/packages/vite/src/runtime/vite-node.mjs index 98661841193..57601e1b6c2 100644 --- a/packages/vite/src/runtime/vite-node.mjs +++ b/packages/vite/src/runtime/vite-node.mjs @@ -29,7 +29,7 @@ export default async (ssrContext) => { runner.moduleCache.delete(key) } - // Execute SSR bundle on-demand + // Execute SSR bundle on demand render = render || (await runner.executeFile(viteNodeOptions.entryPath)).default const result = await render(ssrContext) return result From 69a22e529b412b93b45999eaedf86ac274ea72b6 Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Thu, 4 Aug 2022 11:45:32 +0200 Subject: [PATCH 6/6] fix: only invalidate entry --- packages/vite/src/vite-node.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/vite-node.ts b/packages/vite/src/vite-node.ts index 0053e78542b..48101a83fdf 100644 --- a/packages/vite/src/vite-node.ts +++ b/packages/vite/src/vite-node.ts @@ -78,7 +78,7 @@ function createViteNodeMiddleware (ctx: ViteBuildContext, invalidates: Set