fix(server-renderer): respect compilerOptions during runtime template compilation (#4631)
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
import { ComponentInternalInstance, warn } from 'vue'
|
||||
import { ComponentInternalInstance, ComponentOptions, warn } from 'vue'
|
||||
import { compile } from '@vue/compiler-ssr'
|
||||
import { generateCodeFrame, NO } from '@vue/shared'
|
||||
import { CompilerError } from '@vue/compiler-core'
|
||||
import { extend, generateCodeFrame, isFunction, NO } from '@vue/shared'
|
||||
import { CompilerError, CompilerOptions } from '@vue/compiler-core'
|
||||
import { PushFn } from '../render'
|
||||
|
||||
type SSRRenderFunction = (
|
||||
@@ -24,29 +24,57 @@ export function ssrCompile(
|
||||
)
|
||||
}
|
||||
|
||||
const cached = compileCache[template]
|
||||
// TODO: This is copied from runtime-core/src/component.ts and should probably be refactored
|
||||
const Component = instance.type as ComponentOptions
|
||||
const { isCustomElement, compilerOptions } = instance.appContext.config
|
||||
const { delimiters, compilerOptions: componentCompilerOptions } = Component
|
||||
|
||||
const finalCompilerOptions: CompilerOptions = extend(
|
||||
extend(
|
||||
{
|
||||
isCustomElement,
|
||||
delimiters
|
||||
},
|
||||
compilerOptions
|
||||
),
|
||||
componentCompilerOptions
|
||||
)
|
||||
|
||||
finalCompilerOptions.isCustomElement =
|
||||
finalCompilerOptions.isCustomElement || NO
|
||||
finalCompilerOptions.isNativeTag = finalCompilerOptions.isNativeTag || NO
|
||||
|
||||
const cacheKey = JSON.stringify(
|
||||
{
|
||||
template,
|
||||
compilerOptions: finalCompilerOptions
|
||||
},
|
||||
(key, value) => {
|
||||
return isFunction(value) ? value.toString() : value
|
||||
}
|
||||
)
|
||||
|
||||
const cached = compileCache[cacheKey]
|
||||
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
|
||||
}
|
||||
finalCompilerOptions.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))
|
||||
}
|
||||
|
||||
const { code } = compile(template, finalCompilerOptions)
|
||||
return (compileCache[cacheKey] = Function('require', code)(require))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user