feat(compiler-sfc): compileScript inline render function mode
This commit is contained in:
@@ -60,12 +60,16 @@ type CodegenNode = TemplateChildNode | JSChildNode | SSRCodegenNode
|
||||
|
||||
export interface CodegenResult {
|
||||
code: string
|
||||
preamble: string
|
||||
ast: RootNode
|
||||
map?: RawSourceMap
|
||||
}
|
||||
|
||||
export interface CodegenContext
|
||||
extends Omit<Required<CodegenOptions>, 'bindingMetadata'> {
|
||||
extends Omit<
|
||||
Required<CodegenOptions>,
|
||||
'bindingMetadata' | 'inline' | 'inlinePropsIdentifier'
|
||||
> {
|
||||
source: string
|
||||
code: string
|
||||
line: number
|
||||
@@ -199,12 +203,18 @@ export function generate(
|
||||
const hasHelpers = ast.helpers.length > 0
|
||||
const useWithBlock = !prefixIdentifiers && mode !== 'module'
|
||||
const genScopeId = !__BROWSER__ && scopeId != null && mode === 'module'
|
||||
const isSetupInlined = !!options.inline
|
||||
|
||||
// preambles
|
||||
// in setup() inline mode, the preamble is generated in a sub context
|
||||
// and returned separately.
|
||||
const preambleContext = isSetupInlined
|
||||
? createCodegenContext(ast, options)
|
||||
: context
|
||||
if (!__BROWSER__ && mode === 'module') {
|
||||
genModulePreamble(ast, context, genScopeId)
|
||||
genModulePreamble(ast, preambleContext, genScopeId, isSetupInlined)
|
||||
} else {
|
||||
genFunctionPreamble(ast, context)
|
||||
genFunctionPreamble(ast, preambleContext)
|
||||
}
|
||||
|
||||
// binding optimizations
|
||||
@@ -213,10 +223,17 @@ export function generate(
|
||||
: ``
|
||||
// enter render function
|
||||
if (!ssr) {
|
||||
if (genScopeId) {
|
||||
push(`const render = ${PURE_ANNOTATION}_withId(`)
|
||||
if (isSetupInlined) {
|
||||
if (genScopeId) {
|
||||
push(`${PURE_ANNOTATION}_withId(`)
|
||||
}
|
||||
push(`() => {`)
|
||||
} else {
|
||||
if (genScopeId) {
|
||||
push(`const render = ${PURE_ANNOTATION}_withId(`)
|
||||
}
|
||||
push(`function render(_ctx, _cache${optimizeSources}) {`)
|
||||
}
|
||||
push(`function render(_ctx, _cache${optimizeSources}) {`)
|
||||
} else {
|
||||
if (genScopeId) {
|
||||
push(`const ssrRender = ${PURE_ANNOTATION}_withId(`)
|
||||
@@ -290,6 +307,7 @@ export function generate(
|
||||
return {
|
||||
ast,
|
||||
code: context.code,
|
||||
preamble: isSetupInlined ? preambleContext.code : ``,
|
||||
// SourceMapGenerator does have toJSON() method but it's not in the types
|
||||
map: context.map ? (context.map as any).toJSON() : undefined
|
||||
}
|
||||
@@ -356,7 +374,8 @@ function genFunctionPreamble(ast: RootNode, context: CodegenContext) {
|
||||
function genModulePreamble(
|
||||
ast: RootNode,
|
||||
context: CodegenContext,
|
||||
genScopeId: boolean
|
||||
genScopeId: boolean,
|
||||
inline?: boolean
|
||||
) {
|
||||
const {
|
||||
push,
|
||||
@@ -423,7 +442,10 @@ function genModulePreamble(
|
||||
|
||||
genHoists(ast.hoists, context)
|
||||
newline()
|
||||
push(`export `)
|
||||
|
||||
if (!inline) {
|
||||
push(`export `)
|
||||
}
|
||||
}
|
||||
|
||||
function genAssets(
|
||||
|
||||
Reference in New Issue
Block a user