diff --git a/packages/compiler-core/src/transforms/vOnce.ts b/packages/compiler-core/src/transforms/vOnce.ts
index 1b58c6763b6..e1ec5e129df 100644
--- a/packages/compiler-core/src/transforms/vOnce.ts
+++ b/packages/compiler-core/src/transforms/vOnce.ts
@@ -7,7 +7,7 @@ const seen = new WeakSet()
export const transformOnce: NodeTransform = (node, context) => {
if (node.type === NodeTypes.ELEMENT && findDir(node, 'once', true)) {
- if (seen.has(node) || context.inVOnce) {
+ if (seen.has(node) || context.inVOnce || context.inSSR) {
return
}
seen.add(node)
diff --git a/packages/compiler-ssr/__tests__/ssrComponent.spec.ts b/packages/compiler-ssr/__tests__/ssrComponent.spec.ts
index 83c5bcfc3a6..9391c01e37e 100644
--- a/packages/compiler-ssr/__tests__/ssrComponent.spec.ts
+++ b/packages/compiler-ssr/__tests__/ssrComponent.spec.ts
@@ -286,6 +286,34 @@ describe('ssr: components', () => {
`)
})
+ // #7644
+ test('slot content with v-once', () => {
+ const { code } = compile(``)
+ expect(code).not.toMatch(`_cache`)
+ expect(compile(``).code).toMatchInlineSnapshot(`
+ "const { resolveComponent: _resolveComponent, withCtx: _withCtx, createVNode: _createVNode } = require(\\"vue\\")
+ const { ssrRenderComponent: _ssrRenderComponent } = require(\\"vue/server-renderer\\")
+
+ return function ssrRender(_ctx, _push, _parent, _attrs) {
+ const _component_foo = _resolveComponent(\\"foo\\")
+ const _component_bar = _resolveComponent(\\"bar\\")
+
+ _push(_ssrRenderComponent(_component_foo, _attrs, {
+ default: _withCtx((_, _push, _parent, _scopeId) => {
+ if (_push) {
+ _push(_ssrRenderComponent(_component_bar, null, null, _parent, _scopeId))
+ } else {
+ return [
+ _createVNode(_component_bar)
+ ]
+ }
+ }),
+ _: 1 /* STABLE */
+ }, _parent))
+ }"
+ `)
+ })
+
describe('built-in fallthroughs', () => {
test('transition', () => {
expect(compile(``).code)