perf: fixed-length arrays in error and templates

This commit is contained in:
tbitw2549 2024-10-20 23:58:14 +03:00
parent a7dcc6a48c
commit 38b9db2fe4
2 changed files with 24 additions and 6 deletions

View File

@ -117,20 +117,31 @@ export const componentsTypeTemplate = {
}) })
const islandType = 'type IslandComponent<T extends DefineComponent> = T & DefineComponent<{}, {refresh: () => Promise<void>}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, SlotsType<{ fallback: { error: unknown } }>>' const islandType = 'type IslandComponent<T extends DefineComponent> = T & DefineComponent<{}, {refresh: () => Promise<void>}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, SlotsType<{ fallback: { error: unknown } }>>'
const globalSyncComponents: string[] = new Array(componentTypes.length)
const globalAsyncComponents: string[] = new Array(componentTypes.length)
const globalSyncComponentsExport: string[] = new Array(componentTypes.length)
const globalAsyncComponentsExport: string[] = new Array(componentTypes.length)
for (let i = 0; i < componentTypes.length; i++) {
const [pascalName, type] = componentTypes[i]
globalSyncComponents[i] = ` '${pascalName}': ${type}`
globalAsyncComponents[i] = ` 'Lazy${pascalName}': ${type}`
globalSyncComponentsExport[i] = `export const ${pascalName}: ${type}`
globalAsyncComponentsExport[i] = `export const Lazy${pascalName}: ${type}`
}
return ` return `
import type { DefineComponent, SlotsType } from 'vue' import type { DefineComponent, SlotsType } from 'vue'
${nuxt.options.experimental.componentIslands ? islandType : ''} ${nuxt.options.experimental.componentIslands ? islandType : ''}
interface _GlobalComponents { interface _GlobalComponents {
${componentTypes.map(([pascalName, type]) => ` '${pascalName}': ${type}`).join('\n')} ${globalSyncComponents.join('\n')}
${componentTypes.map(([pascalName, type]) => ` 'Lazy${pascalName}': ${type}`).join('\n')} ${globalAsyncComponents.join('\n')}
} }
declare module 'vue' { declare module 'vue' {
export interface GlobalComponents extends _GlobalComponents { } export interface GlobalComponents extends _GlobalComponents { }
} }
${componentTypes.map(([pascalName, type]) => `export const ${pascalName}: ${type}`).join('\n')} ${globalSyncComponentsExport.join('\n')}
${componentTypes.map(([pascalName, type]) => `export const Lazy${pascalName}: ${type}`).join('\n')} ${globalAsyncComponentsExport.join('\n')}
export const componentNames: string[] export const componentNames: string[]
` `

View File

@ -9,6 +9,13 @@ export default <NitroErrorHandler> async function errorhandler (error: H3Error,
// Parse and normalize error // Parse and normalize error
const { stack, statusCode, statusMessage, message } = normalizeError(error) const { stack, statusCode, statusMessage, message } = normalizeError(error)
const errorStack: string[] = new Array(stack.length)
const consoleStack: string[] = new Array(stack.length)
for (let count = 0; count < stack.length; count++) {
const i = stack[count]!
errorStack[count] = `<span class="stack${i.internal ? ' internal' : ''}">${i.text}</span>`
consoleStack[count] = ' ' + i.text
}
// Create an error object // Create an error object
const errorObject = { const errorObject = {
url: event.path, url: event.path,
@ -16,7 +23,7 @@ export default <NitroErrorHandler> async function errorhandler (error: H3Error,
statusMessage, statusMessage,
message, message,
stack: import.meta.dev && statusCode !== 404 stack: import.meta.dev && statusCode !== 404
? `<pre>${stack.map(i => `<span class="stack${i.internal ? ' internal' : ''}">${i.text}</span>`).join('\n')}</pre>` ? `<pre>${errorStack.join('\n')}</pre>`
: '', : '',
// TODO: check and validate error.data for serialisation into query // TODO: check and validate error.data for serialisation into query
data: error.data as any, data: error.data as any,
@ -31,7 +38,7 @@ export default <NitroErrorHandler> async function errorhandler (error: H3Error,
error.fatal && '[fatal]', error.fatal && '[fatal]',
Number(errorObject.statusCode) !== 200 && `[${errorObject.statusCode}]`, Number(errorObject.statusCode) !== 200 && `[${errorObject.statusCode}]`,
].filter(Boolean).join(' ') ].filter(Boolean).join(' ')
console.error(tags, (error.message || error.toString() || 'internal server error') + '\n' + stack.map(l => ' ' + l.text).join(' \n')) console.error(tags, (error.message || error.toString() || 'internal server error') + '\n' + consoleStack.join(' \n'))
} }
if (event.handled) { return } if (event.handled) { return }