fix(compiler-ssr): handle ssr attr fallthrough when preserve whitespace (#12304)

close #8072
This commit is contained in:
edison 2025-12-18 16:25:23 +08:00 committed by GitHub
parent 6611dda298
commit 4783118919
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 27 additions and 1 deletions

View File

@ -48,6 +48,31 @@ describe('ssr: attrs fallthrough', () => {
`)
})
//#8072
test(`fallthrough component content (with whitespace: 'preserve')`, () => {
expect(
compile(
`
<a v-if="to">Foo</a>
<a v-else>Bar</a>
`,
{
whitespace: 'preserve',
},
).code,
).toMatchInlineSnapshot(`
"const { ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
return function ssrRender(_ctx, _push, _parent, _attrs) {
if (_ctx.to) {
_push(\`<a\${_ssrRenderAttrs(_attrs)}>Foo</a>\`)
} else {
_push(\`<a\${_ssrRenderAttrs(_attrs)}>Bar</a>\`)
}
}"
`)
})
test('should not inject to fallthrough component content if not root', () => {
expect(compile(`<div/><transition><div/></transition>`).code)
.toMatchInlineSnapshot(`

View File

@ -7,11 +7,12 @@ import {
type TemplateChildNode,
createSimpleExpression,
findDir,
isCommentOrWhitespace,
locStub,
} from '@vue/compiler-dom'
const filterChild = (node: ParentNode) =>
node.children.filter(n => n.type !== NodeTypes.COMMENT)
node.children.filter(n => !isCommentOrWhitespace(n))
const hasSingleChild = (node: ParentNode): boolean =>
filterChild(node).length === 1