]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compiler-ssr): disable v-once transform in ssr vdom fallback branch
authorEvan You <yyx990803@gmail.com>
Wed, 5 Apr 2023 03:10:21 +0000 (11:10 +0800)
committerEvan You <yyx990803@gmail.com>
Wed, 5 Apr 2023 03:10:21 +0000 (11:10 +0800)
fix #7644

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

index 1b58c6763b64f5dd16a42e1ff3b3ce46e004cb4b..e1ec5e129dfbd4d690fd98a4041282ca4ce7b1d7 100644 (file)
@@ -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)
index 83c5bcfc3a630f3506bc0a91862658fc838d857c..9391c01e37ee511ab3942892ba7cc7fb01d51f56 100644 (file)
@@ -286,6 +286,34 @@ describe('ssr: components', () => {
       `)
     })
 
+    // #7644
+    test('slot content with v-once', () => {
+      const { code } = compile(`<foo><bar v-once /></foo>`)
+      expect(code).not.toMatch(`_cache`)
+      expect(compile(`<foo><bar v-once /></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)