From 26861702b3794c75357416c2123fbe400710d697 Mon Sep 17 00:00:00 2001 From: KazariEX <1364035137@qq.com> Date: Sat, 8 Feb 2025 15:39:56 +0800 Subject: [PATCH 1/3] fix(compiler-ssr): process `:tag` shorthand of `TransitionGroup` correctly --- .../__tests__/ssrTransitionGroup.spec.ts | 22 +++++++++++++++++++ .../transforms/ssrTransformTransitionGroup.ts | 8 ++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/compiler-ssr/__tests__/ssrTransitionGroup.spec.ts b/packages/compiler-ssr/__tests__/ssrTransitionGroup.spec.ts index 82122e621c7..abbb5f53e6e 100644 --- a/packages/compiler-ssr/__tests__/ssrTransitionGroup.spec.ts +++ b/packages/compiler-ssr/__tests__/ssrTransitionGroup.spec.ts @@ -101,6 +101,28 @@ describe('transition-group', () => { `) }) + test('with dynamic tag shorthand', () => { + expect( + compile( + `
`, + ).code, + ).toMatchInlineSnapshot(` + "const { ssrRenderAttrs: _ssrRenderAttrs, ssrRenderList: _ssrRenderList } = require("vue/server-renderer") + + return function ssrRender(_ctx, _push, _parent, _attrs) { + _push(\`<\${ + _ctx.tag + }\${ + _ssrRenderAttrs(_attrs) + }>\`) + _ssrRenderList(_ctx.list, (i) => { + _push(\`
\`) + }) + _push(\`\`) + }" + `) + }) + test('with multi fragments children', () => { expect( compile( diff --git a/packages/compiler-ssr/src/transforms/ssrTransformTransitionGroup.ts b/packages/compiler-ssr/src/transforms/ssrTransformTransitionGroup.ts index 27ddebec103..64c00831dc0 100644 --- a/packages/compiler-ssr/src/transforms/ssrTransformTransitionGroup.ts +++ b/packages/compiler-ssr/src/transforms/ssrTransformTransitionGroup.ts @@ -7,6 +7,7 @@ import { type TransformContext, buildProps, createCallExpression, + createSimpleExpression, findProp, } from '@vue/compiler-dom' import { SSR_RENDER_ATTRS } from '../runtimeHelpers' @@ -30,7 +31,7 @@ export function ssrTransformTransitionGroup( context: TransformContext, ) { return (): void => { - const tag = findProp(node, 'tag') + const tag = findProp(node, 'tag', false, true) if (tag) { const otherProps = node.props.filter(p => p !== tag) const { props, directives } = buildProps( @@ -65,9 +66,10 @@ export function ssrProcessTransitionGroup( if (entry) { const { tag, propsExp, scopeId } = entry if (tag.type === NodeTypes.DIRECTIVE) { + const tagExp = tag.exp ?? createSimpleExpression(`_ctx.tag`) // dynamic :tag context.pushStringPart(`<`) - context.pushStringPart(tag.exp!) + context.pushStringPart(tagExp) if (propsExp) { context.pushStringPart(propsExp) } @@ -96,7 +98,7 @@ export function ssrProcessTransitionGroup( true, ) context.pushStringPart(``) } else { // static tag From 64c0ad5264ee3d64a1e2777a61ca83080af66209 Mon Sep 17 00:00:00 2001 From: KazariEX <1364035137@qq.com> Date: Sat, 8 Feb 2025 17:41:45 +0800 Subject: [PATCH 2/3] fix: transform v-bind shorthand --- packages/compiler-core/src/index.ts | 2 +- .../src/transforms/ssrTransformComponent.ts | 10 ++++++++++ .../src/transforms/ssrTransformTransitionGroup.ts | 8 +++----- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/packages/compiler-core/src/index.ts b/packages/compiler-core/src/index.ts index 29e5f681300..f38f6991c70 100644 --- a/packages/compiler-core/src/index.ts +++ b/packages/compiler-core/src/index.ts @@ -44,7 +44,7 @@ export * from './runtimeHelpers' export { getBaseTransformPreset, type TransformPreset } from './compile' export { transformModel } from './transforms/vModel' export { transformOn } from './transforms/vOn' -export { transformBind } from './transforms/vBind' +export { transformBind, transformBindShorthand } from './transforms/vBind' export { noopDirectiveTransform } from './transforms/noopDirectiveTransform' export { processIf } from './transforms/vIf' export { processFor, createForLoopParams } from './transforms/vFor' diff --git a/packages/compiler-ssr/src/transforms/ssrTransformComponent.ts b/packages/compiler-ssr/src/transforms/ssrTransformComponent.ts index cad1ee81028..be77ed30cec 100644 --- a/packages/compiler-ssr/src/transforms/ssrTransformComponent.ts +++ b/packages/compiler-ssr/src/transforms/ssrTransformComponent.ts @@ -38,6 +38,7 @@ import { locStub, resolveComponentType, stringifyExpression, + transformBindShorthand, traverseNode, } from '@vue/compiler-dom' import { SSR_RENDER_COMPONENT, SSR_RENDER_VNODE } from '../runtimeHelpers' @@ -102,6 +103,15 @@ export const ssrTransformComponent: NodeTransform = (node, context) => { componentTypeMap.set(node, component) if (isSymbol(component)) { + for (const prop of node.props) { + if ( + prop.type === NodeTypes.DIRECTIVE && + prop.name === 'bind' && + !prop.exp + ) { + transformBindShorthand(prop, context) + } + } if (component === SUSPENSE) { return ssrTransformSuspense(node, context) } else if (component === TRANSITION_GROUP) { diff --git a/packages/compiler-ssr/src/transforms/ssrTransformTransitionGroup.ts b/packages/compiler-ssr/src/transforms/ssrTransformTransitionGroup.ts index 64c00831dc0..27ddebec103 100644 --- a/packages/compiler-ssr/src/transforms/ssrTransformTransitionGroup.ts +++ b/packages/compiler-ssr/src/transforms/ssrTransformTransitionGroup.ts @@ -7,7 +7,6 @@ import { type TransformContext, buildProps, createCallExpression, - createSimpleExpression, findProp, } from '@vue/compiler-dom' import { SSR_RENDER_ATTRS } from '../runtimeHelpers' @@ -31,7 +30,7 @@ export function ssrTransformTransitionGroup( context: TransformContext, ) { return (): void => { - const tag = findProp(node, 'tag', false, true) + const tag = findProp(node, 'tag') if (tag) { const otherProps = node.props.filter(p => p !== tag) const { props, directives } = buildProps( @@ -66,10 +65,9 @@ export function ssrProcessTransitionGroup( if (entry) { const { tag, propsExp, scopeId } = entry if (tag.type === NodeTypes.DIRECTIVE) { - const tagExp = tag.exp ?? createSimpleExpression(`_ctx.tag`) // dynamic :tag context.pushStringPart(`<`) - context.pushStringPart(tagExp) + context.pushStringPart(tag.exp!) if (propsExp) { context.pushStringPart(propsExp) } @@ -98,7 +96,7 @@ export function ssrProcessTransitionGroup( true, ) context.pushStringPart(``) } else { // static tag From c44ee000756a6177381c4673b3b47acecfc72661 Mon Sep 17 00:00:00 2001 From: KazariEX <1364035137@qq.com> Date: Sat, 8 Feb 2025 17:41:57 +0800 Subject: [PATCH 3/3] test: add --- .../__tests__/ssrTeleport.spec.ts | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 packages/compiler-ssr/__tests__/ssrTeleport.spec.ts diff --git a/packages/compiler-ssr/__tests__/ssrTeleport.spec.ts b/packages/compiler-ssr/__tests__/ssrTeleport.spec.ts new file mode 100644 index 00000000000..e1807bc90ea --- /dev/null +++ b/packages/compiler-ssr/__tests__/ssrTeleport.spec.ts @@ -0,0 +1,42 @@ +import { compile } from '../src' + +describe('teleport', () => { + test('with static to', () => { + expect(compile(`
`).code) + .toMatchInlineSnapshot(` + "const { ssrRenderTeleport: _ssrRenderTeleport } = require("vue/server-renderer") + + return function ssrRender(_ctx, _push, _parent, _attrs) { + _ssrRenderTeleport(_push, (_push) => { + _push(\`
\`) + }, "body", false, _parent) + }" + `) + }) + + test('with dynamic to', () => { + expect(compile(`
`).code) + .toMatchInlineSnapshot(` + "const { ssrRenderTeleport: _ssrRenderTeleport } = require("vue/server-renderer") + + return function ssrRender(_ctx, _push, _parent, _attrs) { + _ssrRenderTeleport(_push, (_push) => { + _push(\`
\`) + }, _ctx.target, false, _parent) + }" + `) + }) + + test('with dynamic to shorthand', () => { + expect(compile(`
`).code) + .toMatchInlineSnapshot(` + "const { ssrRenderTeleport: _ssrRenderTeleport } = require("vue/server-renderer") + + return function ssrRender(_ctx, _push, _parent, _attrs) { + _ssrRenderTeleport(_push, (_push) => { + _push(\`
\`) + }, _ctx.to, false, _parent) + }" + `) + }) +})