From abd563822abafe63047f7b599bff266380ee2b64 Mon Sep 17 00:00:00 2001 From: edison Date: Wed, 24 Sep 2025 17:03:47 +0800 Subject: [PATCH] fix(compiler-sfc): ensure props bindings register before compiling template (#13922) close #13920 --- .../compileTemplate.spec.ts.snap | 21 +++++++++++++++++++ .../__tests__/compileTemplate.spec.ts | 19 +++++++++++++++++ packages/compiler-sfc/src/compileScript.ts | 3 ++- 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/packages/compiler-sfc/__tests__/__snapshots__/compileTemplate.spec.ts.snap b/packages/compiler-sfc/__tests__/__snapshots__/compileTemplate.spec.ts.snap index 784ff1bf18..3cc6c17355 100644 --- a/packages/compiler-sfc/__tests__/__snapshots__/compileTemplate.spec.ts.snap +++ b/packages/compiler-sfc/__tests__/__snapshots__/compileTemplate.spec.ts.snap @@ -12,6 +12,27 @@ export function render(_ctx, _cache) { }" `; +exports[`prefixing props edge case in inline mode 1`] = ` +"import { defineComponent as _defineComponent } from 'vue' +import { unref as _unref, openBlock as _openBlock, createBlock as _createBlock } from "vue" + + +export default /*@__PURE__*/_defineComponent({ + props: { + Foo: { type: Object, required: true } + }, + setup(__props: any) { + + + +return (_ctx: any,_cache: any) => { + return (_openBlock(), _createBlock(_unref(__props["Foo"]).Bar)) +} +} + +})" +`; + exports[`should not hoist srcset URLs in SSR mode 1`] = ` "import { resolveComponent as _resolveComponent, withCtx as _withCtx, createVNode as _createVNode } from "vue" import { ssrRenderAttr as _ssrRenderAttr, ssrRenderComponent as _ssrRenderComponent } from "vue/server-renderer" diff --git a/packages/compiler-sfc/__tests__/compileTemplate.spec.ts b/packages/compiler-sfc/__tests__/compileTemplate.spec.ts index 81cf75a912..f9d0807d51 100644 --- a/packages/compiler-sfc/__tests__/compileTemplate.spec.ts +++ b/packages/compiler-sfc/__tests__/compileTemplate.spec.ts @@ -512,3 +512,22 @@ test('non-identifier expression in legacy filter syntax', () => { babelParse(compilationResult.code, { sourceType: 'module' }) }).not.toThrow() }) + +test('prefixing props edge case in inline mode', () => { + const src = ` + + + ` + const { descriptor } = parse(src) + const { content } = compileScript(descriptor, { + id: 'xxx', + inlineTemplate: true, + }) + + expect(content).toMatchSnapshot() + expect(content).toMatch(`__props["Foo"]).Bar`) +}) diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts index cbd4abdf71..de7deded7e 100644 --- a/packages/compiler-sfc/src/compileScript.ts +++ b/packages/compiler-sfc/src/compileScript.ts @@ -833,6 +833,8 @@ export function compileScript( let templateMap // 9. generate return statement let returned + // ensure props bindings register before compile template in inline mode + const propsDecl = genRuntimeProps(ctx) if ( !options.inlineTemplate || (!sfc.template && ctx.hasDefaultExportRender) @@ -965,7 +967,6 @@ export function compileScript( runtimeOptions += `\n __ssrInlineRender: true,` } - const propsDecl = genRuntimeProps(ctx) if (propsDecl) runtimeOptions += `\n props: ${propsDecl},` const emitsDecl = genRuntimeEmits(ctx) -- 2.47.3