| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- import { ComponentInternalInstance, warn } from 'vue'
- import { compile } from '@vue/compiler-ssr'
- import { generateCodeFrame, NO } from '@vue/shared'
- import { CompilerError } from '@vue/compiler-core'
- import { PushFn } from '../render'
- type SSRRenderFunction = (
- context: any,
- push: PushFn,
- parentInstance: ComponentInternalInstance
- ) => void
- const compileCache: Record<string, SSRRenderFunction> = Object.create(null)
- export function ssrCompile(
- template: string,
- instance: ComponentInternalInstance
- ): SSRRenderFunction {
- const cached = compileCache[template]
- if (cached) {
- return cached
- }
- const { code } = compile(template, {
- isCustomElement: instance.appContext.config.isCustomElement || NO,
- isNativeTag: instance.appContext.config.isNativeTag || NO,
- onError(err: CompilerError) {
- if (__DEV__) {
- const message = `[@vue/server-renderer] Template compilation error: ${
- err.message
- }`
- const codeFrame =
- err.loc &&
- generateCodeFrame(
- template as string,
- err.loc.start.offset,
- err.loc.end.offset
- )
- warn(codeFrame ? `${message}\n${codeFrame}` : message)
- } else {
- throw err
- }
- }
- })
- return (compileCache[template] = Function('require', code)(require))
- }
|