]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compiler-ssr): disable v-memo transform in ssr vdom fallback branch (#13725)
authorequt <17521736+equt@users.noreply.github.com>
Thu, 21 Aug 2025 02:03:16 +0000 (10:03 +0800)
committerGitHub <noreply@github.com>
Thu, 21 Aug 2025 02:03:16 +0000 (10:03 +0800)
close #13724

packages/compiler-core/src/transforms/vMemo.ts
packages/compiler-ssr/__tests__/ssrComponent.spec.ts

index 83295a45c8adabe2172919a0370b53303f333590..31db1448af0fc12796b00dd605da8785c895eef9 100644 (file)
@@ -16,7 +16,7 @@ const seen = new WeakSet()
 export const transformMemo: NodeTransform = (node, context) => {
   if (node.type === NodeTypes.ELEMENT) {
     const dir = findDir(node, 'memo')
-    if (!dir || seen.has(node)) {
+    if (!dir || seen.has(node) || context.inSSR) {
       return
     }
     seen.add(node)
index 2fde4560ec43e4e81dfc0848e4ac5aa4c4d14ccb..0a71eeefeed27841e634b170c33f0b4c70dcc8f3 100644 (file)
@@ -317,6 +317,35 @@ describe('ssr: components', () => {
       `)
     })
 
+    // #13724
+    test('slot content with v-memo', () => {
+      const { code } = compile(`<foo><bar v-memo="[]" /></foo>`)
+      expect(code).not.toMatch(`_cache`)
+      expect(compile(`<foo><bar v-memo="[]" /></foo>`).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(`<transition><div/></transition>`).code)