From 1f8a929823617ad40e3ac938c9acbab0fded44ab Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Tue, 16 Aug 2022 23:49:18 +0800 Subject: [PATCH 1/7] fix(vite-node): pass down h3 errors --- 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 55bfd7c2af1..986d60e6b23 100644 --- a/packages/vite/src/vite-node.ts +++ b/packages/vite/src/vite-node.ts @@ -125,7 +125,7 @@ function createViteNodeMiddleware (ctx: ViteBuildContext, invalidates: Set Date: Tue, 16 Aug 2022 19:34:36 +0200 Subject: [PATCH 2/7] refactor: use `addDevServerHandler` --- packages/vite/src/vite-node.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vite/src/vite-node.ts b/packages/vite/src/vite-node.ts index 986d60e6b23..bd828939ec3 100644 --- a/packages/vite/src/vite-node.ts +++ b/packages/vite/src/vite-node.ts @@ -3,7 +3,7 @@ import { createApp, createError, defineEventHandler, defineLazyEventHandler } fr import { ViteNodeServer } from 'vite-node/server' import fse from 'fs-extra' import { resolve } from 'pathe' -import { addServerMiddleware } from '@nuxt/kit' +import { addDevServerHandler } from '@nuxt/kit' import type { ModuleNode, Plugin as VitePlugin } from 'vite' import { normalizeViteManifest } from 'vue-bundle-renderer' import { resolve as resolveModule } from 'mlly' @@ -41,7 +41,7 @@ export function viteNodePlugin (ctx: ViteBuildContext): VitePlugin { } export function registerViteNodeMiddleware (ctx: ViteBuildContext) { - addServerMiddleware({ + addDevServerHandler({ route: '/__nuxt_vite_node__/', handler: createViteNodeMiddleware(ctx) }) From 416f6e92967bed613104238dd088f08129a171df Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Tue, 16 Aug 2022 20:32:25 +0200 Subject: [PATCH 3/7] refactor: try to bypass error to client --- packages/vite/src/runtime/vite-node.mjs | 11 ++++++++++- packages/vite/src/vite-node.ts | 10 ++++++++-- playground/app.vue | 4 ++-- playground/nuxt.config.ts | 3 +++ 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/packages/vite/src/runtime/vite-node.mjs b/packages/vite/src/runtime/vite-node.mjs index a4c5d933507..588dda37bf0 100644 --- a/packages/vite/src/runtime/vite-node.mjs +++ b/packages/vite/src/runtime/vite-node.mjs @@ -12,6 +12,13 @@ const runner = new ViteNodeRunner({ async fetchModule (id) { return await $fetch('/module/' + encodeURI(id), { baseURL: viteNodeOptions.baseURL + }).catch((err) => { + if (!err.data || !err.data.data) { + throw err + } + // Keys: id, plugin, message, name, stack, loc, pluginCode, frame + const viteError = { ...err.data.data } + throw viteError }) } }) @@ -42,6 +49,8 @@ export default async (ssrContext) => { consola.success(`Vite server hmr ${updates.size} files`, time ? `in ${time}ms` : '') } - const result = await render(ssrContext) + const result = await render(ssrContext).catch((err) => { + throw new Error('Vite server error: ' + err.message) + }) return result } diff --git a/packages/vite/src/vite-node.ts b/packages/vite/src/vite-node.ts index bd828939ec3..3c9f8b8f617 100644 --- a/packages/vite/src/vite-node.ts +++ b/packages/vite/src/vite-node.ts @@ -120,12 +120,18 @@ function createViteNodeMiddleware (ctx: ViteBuildContext, invalidates: Set { + throw createError({ + statusCode: 500, + statusMessage: `[vite-node] Cannot fetch module ${moduleId}`, + data: err + }) + }) return module } })) - return app.handler + return app } export async function initViteNodeServer (ctx: ViteBuildContext) { diff --git a/playground/app.vue b/playground/app.vue index c93a9dcaf5f..b2624fe07b4 100644 --- a/playground/app.vue +++ b/playground/app.vue @@ -4,9 +4,9 @@ - diff --git a/playground/nuxt.config.ts b/playground/nuxt.config.ts index 8b0aa104adf..af314421050 100644 --- a/playground/nuxt.config.ts +++ b/playground/nuxt.config.ts @@ -1,4 +1,7 @@ import { defineNuxtConfig } from 'nuxt' export default defineNuxtConfig({ + vite: { + // devBundler: 'legacy' + } }) From 808fd5bf9043c0e6d713a91fe4ff9b3ede1a6252 Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Tue, 16 Aug 2022 20:44:27 +0200 Subject: [PATCH 4/7] try behavior of legacy bundler --- packages/vite/src/runtime/vite-node.mjs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/vite/src/runtime/vite-node.mjs b/packages/vite/src/runtime/vite-node.mjs index 588dda37bf0..ef02be8aaff 100644 --- a/packages/vite/src/runtime/vite-node.mjs +++ b/packages/vite/src/runtime/vite-node.mjs @@ -16,9 +16,10 @@ const runner = new ViteNodeRunner({ if (!err.data || !err.data.data) { throw err } + return { code: '' } // Keys: id, plugin, message, name, stack, loc, pluginCode, frame - const viteError = { ...err.data.data } - throw viteError + // const viteError = { ...err.data.data } + // throw viteError }) } }) From efcd89778f6c64aa4561c37e212466ff951977b5 Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Tue, 16 Aug 2022 21:18:34 +0200 Subject: [PATCH 5/7] pass down original error object --- packages/vite/src/runtime/vite-node.mjs | 18 +++++++++++------- playground/app.vue | 2 +- playground/nuxt.config.ts | 6 +----- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/vite/src/runtime/vite-node.mjs b/packages/vite/src/runtime/vite-node.mjs index ef02be8aaff..5eadabbb69b 100644 --- a/packages/vite/src/runtime/vite-node.mjs +++ b/packages/vite/src/runtime/vite-node.mjs @@ -1,4 +1,5 @@ import { performance } from 'node:perf_hooks' +import { createError } from 'h3' import { ViteNodeRunner } from 'vite-node/client' import { $fetch } from 'ohmyfetch' import consola from 'consola' @@ -13,13 +14,18 @@ const runner = new ViteNodeRunner({ return await $fetch('/module/' + encodeURI(id), { baseURL: viteNodeOptions.baseURL }).catch((err) => { - if (!err.data || !err.data.data) { + if (!err.data) { throw err } - return { code: '' } + // Legacy bundler behavior + // return { code: '' } // Keys: id, plugin, message, name, stack, loc, pluginCode, frame - // const viteError = { ...err.data.data } - // throw viteError + const viteErrorObject = err.data.data || err.data + const _error = createError({ + statusMessage: `[vite-node-runner] Cannot fetch module ${id}`, + ...viteErrorObject + }) + throw _error }) } }) @@ -50,8 +56,6 @@ export default async (ssrContext) => { consola.success(`Vite server hmr ${updates.size} files`, time ? `in ${time}ms` : '') } - const result = await render(ssrContext).catch((err) => { - throw new Error('Vite server error: ' + err.message) - }) + const result = await render(ssrContext) return result } diff --git a/playground/app.vue b/playground/app.vue index b2624fe07b4..7514ff01e2c 100644 --- a/playground/app.vue +++ b/playground/app.vue @@ -4,7 +4,7 @@ diff --git a/playground/nuxt.config.ts b/playground/nuxt.config.ts index af314421050..2221b92fc94 100644 --- a/playground/nuxt.config.ts +++ b/playground/nuxt.config.ts @@ -1,7 +1,3 @@ import { defineNuxtConfig } from 'nuxt' -export default defineNuxtConfig({ - vite: { - // devBundler: 'legacy' - } -}) +export default defineNuxtConfig({}) From f9698ff99601351598fd384ae090cf36dc15ba04 Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Sat, 3 Sep 2022 11:39:10 +0200 Subject: [PATCH 6/7] add basic error formatter --- packages/vite/src/runtime/vite-node.mjs | 79 +++++++++++++++++-------- packages/vite/src/vite-node.ts | 6 +- playground/app.vue | 2 +- 3 files changed, 57 insertions(+), 30 deletions(-) diff --git a/packages/vite/src/runtime/vite-node.mjs b/packages/vite/src/runtime/vite-node.mjs index e625dec5b61..71160a5816a 100644 --- a/packages/vite/src/runtime/vite-node.mjs +++ b/packages/vite/src/runtime/vite-node.mjs @@ -6,30 +6,7 @@ import consola from 'consola' import { getViteNodeOptions } from './vite-node-shared.mjs' const viteNodeOptions = getViteNodeOptions() - -const runner = new ViteNodeRunner({ - root: viteNodeOptions.root, // Equals to Nuxt `srcDir` - base: viteNodeOptions.base, - async fetchModule (id) { - return await $fetch('/module/' + encodeURI(id), { - baseURL: viteNodeOptions.baseURL - }).catch((err) => { - if (!err.data) { - throw err - } - // Legacy bundler behavior - // return { code: '' } - // Keys: id, plugin, message, name, stack, loc, pluginCode, frame - const viteErrorObject = err.data.data || err.data - const _error = createError({ - statusMessage: `[vite-node-runner] Cannot fetch module ${id}`, - ...viteErrorObject - }) - throw _error - }) - } -}) - +const runner = createRunner() let render export default async (ssrContext) => { @@ -54,3 +31,57 @@ export default async (ssrContext) => { const result = await render(ssrContext) return result } + +function createRunner () { + return new ViteNodeRunner({ + root: viteNodeOptions.root, // Equals to Nuxt `srcDir` + base: viteNodeOptions.base, + async fetchModule (id) { + return await $fetch('/module/' + encodeURI(id), { + baseURL: viteNodeOptions.baseURL + }).catch((err) => { + const errorData = err?.data?.data + if (!errorData) { + throw err + } + const { message, stack } = formatViteError(errorData) + throw createError({ + statusMessage: 'Vite Error', + message, + stack + }) + }) + } + }) +} + +function formatViteError (errorData) { + const errorCode = errorData.name || errorData.reasonCode || errorData.code + const frame = errorData.frame || errorData.source || errorData.pluginCode + + const getLocId = (locObj = {}) => locObj.file || locObj.id || locObj.url || '' + const getLocPos = (locObj = {}) => locObj.line ? `${locObj.line}:${locObj.column || 0}` : '' + const locId = getLocId(errorData.loc) || getLocId(errorData.location) || getLocId(errorData.input) || getLocId(errorData) + const locPos = getLocPos(errorData.loc) || getLocPos(errorData.location) || getLocPos(errorData.input) || getLocPos(errorData) + const loc = locId.replace(process.cwd(), '.') + (locPos ? `:${locPos}` : '') + + const message = [ + '[vite-node]', + errorData.plugin && `[plugin:${errorData.plugin}]`, + errorCode && `[${errorCode}]`, + loc, + errorData.reason && `: ${errorData.reason}`, + frame && `
${frame.replace(/&/g, '&').replace(//g, '>')}

` + ].filter(Boolean).join(' ') + + const stack = [ + message, + 'at ' + loc, + errorData.stack + ].filter(Boolean).join('\n') + + return { + message, + stack + } +} diff --git a/packages/vite/src/vite-node.ts b/packages/vite/src/vite-node.ts index 9d348832c2b..e28f05c1319 100644 --- a/packages/vite/src/vite-node.ts +++ b/packages/vite/src/vite-node.ts @@ -113,11 +113,7 @@ function createViteNodeMiddleware (ctx: ViteBuildContext, invalidates: Set { - throw createError({ - statusCode: 500, - statusMessage: `[vite-node] Cannot fetch module ${moduleId}`, - data: err - }) + throw createError({ data: err }) }) return module } diff --git a/playground/app.vue b/playground/app.vue index 7514ff01e2c..c93a9dcaf5f 100644 --- a/playground/app.vue +++ b/playground/app.vue @@ -8,5 +8,5 @@ - From 9cfee0c033b8cabf87b7994945ad7e67c4af9e4e Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Sat, 3 Sep 2022 11:51:29 +0200 Subject: [PATCH 7/7] add fallback (shoudln't really happen!) --- packages/vite/src/runtime/vite-node.mjs | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/vite/src/runtime/vite-node.mjs b/packages/vite/src/runtime/vite-node.mjs index 71160a5816a..a2eea980f35 100644 --- a/packages/vite/src/runtime/vite-node.mjs +++ b/packages/vite/src/runtime/vite-node.mjs @@ -44,12 +44,22 @@ function createRunner () { if (!errorData) { throw err } - const { message, stack } = formatViteError(errorData) - throw createError({ - statusMessage: 'Vite Error', - message, - stack - }) + try { + const { message, stack } = formatViteError(errorData) + throw createError({ + statusMessage: 'Vite Error', + message, + stack + }) + } catch (err) { + // This should not happen unless there is an internal error with formatViteError! + consola.error('Error while formatting vite error:', errorData) + throw createError({ + statusMessage: 'Vite Error', + message: errorData.message || 'Vite Error', + stack: 'Vite Error\nat [check console]' + }) + } }) } })