From: Evan You Date: Wed, 11 May 2022 09:20:32 +0000 (+0800) Subject: fix(compiler-sfc): ensure consistent behavior of export default render with script... X-Git-Tag: v3.2.34-beta.1~61 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b7025d24f1c33023d020d60292319740852d1810;p=thirdparty%2Fvuejs%2Fcore.git fix(compiler-sfc): ensure consistent behavior of export default render with script setup close #4980 --- diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts index 5ac05b31e4..9c9c7ffbf8 100644 --- a/packages/compiler-sfc/src/compileScript.ts +++ b/packages/compiler-sfc/src/compileScript.ts @@ -270,6 +270,7 @@ export function compileScript( let hasDefineEmitCall = false let hasDefineExposeCall = false let hasDefaultExportName = false + let hasDefaultExportRender = false let propsRuntimeDecl: Node | undefined let propsRuntimeDefaults: ObjectExpression | undefined let propsDestructureDecl: Node | undefined @@ -819,8 +820,11 @@ export function compileScript( // export default defaultExport = node - // check if user has manually specified `name` option in export default - // if yes, skip infer later + // check if user has manually specified `name` or 'render` option in + // export default + // if has name, skip name inference + // if has render and no template, generate return object instead of + // empty render function (#4980) let optionProperties if (defaultExport.declaration.type === 'ObjectExpression') { optionProperties = defaultExport.declaration.properties @@ -830,12 +834,25 @@ export function compileScript( ) { optionProperties = defaultExport.declaration.arguments[0].properties } - hasDefaultExportName = !!optionProperties?.some( - s => - s.type === 'ObjectProperty' && - s.key.type === 'Identifier' && - s.key.name === 'name' - ) + if (optionProperties) { + for (const s of optionProperties) { + if ( + s.type === 'ObjectProperty' && + s.key.type === 'Identifier' && + s.key.name === 'name' + ) { + hasDefaultExportName = true + } + if ( + (s.type === 'ObjectMethod' || s.type === 'ObjectProperty') && + s.key.type === 'Identifier' && + s.key.name === 'render' + ) { + // TODO warn when we provide a better way to do it? + hasDefaultExportRender = true + } + } + } // export default { ... } --> const __default__ = { ... } const start = node.start! + scriptStartOffset! @@ -1303,7 +1320,21 @@ export function compileScript( // 10. generate return statement let returned - if (options.inlineTemplate) { + if (!options.inlineTemplate || (!sfc.template && hasDefaultExportRender)) { + // non-inline mode, or has manual render in normal