From: daiwei Date: Sun, 26 Jan 2025 03:11:19 +0000 (+0800) Subject: wip: add more ssr test X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7031b59df504c1101b9c27ec3921975dd4b154a7;p=thirdparty%2Fvuejs%2Fcore.git wip: add more ssr test --- diff --git a/packages/compiler-core/__tests__/transforms/__snapshots__/vSkip.spec.ts.snap b/packages/compiler-core/__tests__/transforms/__snapshots__/vSkip.spec.ts.snap index 5b8456bda9..b848eb37d4 100644 --- a/packages/compiler-core/__tests__/transforms/__snapshots__/vSkip.spec.ts.snap +++ b/packages/compiler-core/__tests__/transforms/__snapshots__/vSkip.spec.ts.snap @@ -134,7 +134,7 @@ return function render(_ctx, _cache) { }" `; -exports[`compiler: v-skip > transform > on component with multiple implicit slot 1`] = ` +exports[`compiler: v-skip > transform > on component with multiple implicit default slot 1`] = ` "const _Vue = Vue return function render(_ctx, _cache) { diff --git a/packages/compiler-core/__tests__/transforms/vSkip.spec.ts b/packages/compiler-core/__tests__/transforms/vSkip.spec.ts index a9760b9855..27a681630e 100644 --- a/packages/compiler-core/__tests__/transforms/vSkip.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vSkip.spec.ts @@ -315,7 +315,7 @@ describe('compiler: v-skip', () => { expect(generate(root).code).toMatchSnapshot() }) - test('on component with multiple implicit slot', () => { + test('on component with multiple implicit default slot', () => { const { root, node } = parseWithSkipTransform( ` diff --git a/packages/compiler-ssr/__tests__/ssrVSkip.spec.ts b/packages/compiler-ssr/__tests__/ssrVSkip.spec.ts index 0f290ed9a6..23ba0c7f04 100644 --- a/packages/compiler-ssr/__tests__/ssrVSkip.spec.ts +++ b/packages/compiler-ssr/__tests__/ssrVSkip.spec.ts @@ -193,7 +193,8 @@ describe('ssr: v-skip', () => { `) }) - test('on component', () => { + test('on component without slot', () => { + // equivalent to expect(compile(``).code).toMatchInlineSnapshot(` "const { withCtx: _withCtx, createCommentVNode: _createCommentVNode, resolveComponent: _resolveComponent } = require("vue") const { ssrRenderComponent: _ssrRenderComponent } = require("vue/server-renderer") @@ -210,31 +211,35 @@ describe('ssr: v-skip', () => { `) }) - test.todo('on component with default slot', () => { + test('on component with default slot', () => { expect(compile(`foo`).code).toMatchInlineSnapshot(` - "const { resolveComponent: _resolveComponent, withCtx: _withCtx, createTextVNode: _createTextVNode } = require("vue") - const { ssrRenderComponent: _ssrRenderComponent, ssrRenderSkipComponent: _ssrRenderSkipComponent } = require("vue/server-renderer") + "const { withCtx: _withCtx, resolveComponent: _resolveComponent, createTextVNode: _createTextVNode } = require("vue") + const { ssrRenderComponent: _ssrRenderComponent } = require("vue/server-renderer") return function ssrRender(_ctx, _push, _parent, _attrs) { const _component_Comp = _resolveComponent("Comp") - _push(_ssrRenderSkipComponent(_push, _ctx.ok, _component_Comp, _attrs, { - default: _withCtx((_, _push, _parent, _scopeId) => { - if (_push) { - _push(\`foo\`) - } else { - return [ - _createTextVNode("foo") - ] - } - }), - _: 1 /* STABLE */ - }, _parent)) + if (_ctx.ok) { + _push(\`foo\`) + } else { + _push(_ssrRenderComponent(_component_Comp, _attrs, { + default: _withCtx((_, _push, _parent, _scopeId) => { + if (_push) { + _push(\`foo\`) + } else { + return [ + _createTextVNode("foo") + ] + } + }), + _: 1 /* STABLE */ + }, _parent)) + } }" `) }) - test.todo('on component with multiple named slot', () => { + test('on component with multiple named slot', () => { expect( compile( ` @@ -243,23 +248,153 @@ describe('ssr: v-skip', () => { `, ).code, ).toMatchInlineSnapshot(` - "const { resolveComponent: _resolveComponent, withCtx: _withCtx, createTextVNode: _createTextVNode } = require("vue") + "const { withCtx: _withCtx, resolveComponent: _resolveComponent, createTextVNode: _createTextVNode } = require("vue") + const { ssrRenderComponent: _ssrRenderComponent } = require("vue/server-renderer") + + return function ssrRender(_ctx, _push, _parent, _attrs) { + const _component_Comp = _resolveComponent("Comp") + + if (_ctx.ok) { + _push(\`default\`) + } else { + _push(_ssrRenderComponent(_component_Comp, _attrs, { + default: _withCtx((_, _push, _parent, _scopeId) => { + if (_push) { + _push(\`default\`) + } else { + return [ + _createTextVNode("default") + ] + } + }), + foo: _withCtx((_, _push, _parent, _scopeId) => { + if (_push) { + _push(\`foo\`) + } else { + return [ + _createTextVNode("foo") + ] + } + }), + _: 1 /* STABLE */ + }, _parent)) + } + }" + `) + }) + + test('on component with multiple implicit default slot', () => { + expect( + compile( + ` + + +
+ `, + ).code, + ).toMatchInlineSnapshot(` + "const { withCtx: _withCtx, resolveComponent: _resolveComponent, createTextVNode: _createTextVNode, createVNode: _createVNode } = require("vue") + const { ssrRenderComponent: _ssrRenderComponent } = require("vue/server-renderer") + + return function ssrRender(_ctx, _push, _parent, _attrs) { + const _component_Comp = _resolveComponent("Comp") + + if (_ctx.ok) { + _push(\`
\`) + } else { + _push(_ssrRenderComponent(_component_Comp, _attrs, { + foo: _withCtx((_, _push, _parent, _scopeId) => { + if (_push) { + _push(\`foo\`) + } else { + return [ + _createTextVNode("foo") + ] + } + }), + default: _withCtx((_, _push, _parent, _scopeId) => { + if (_push) { + _push(\`
\`) + } else { + return [ + _createVNode("span"), + _createVNode("div") + ] + } + }), + _: 1 /* STABLE */ + }, _parent)) + } + }" + `) + }) + + test('on component with name default slot + v-if', () => { + expect( + compile( + ` + + `, + ).code, + ).toMatchInlineSnapshot(` + "const { withCtx: _withCtx, createSlots: _createSlots, resolveComponent: _resolveComponent, createTextVNode: _createTextVNode } = require("vue") + const { ssrRenderComponent: _ssrRenderComponent, ssrRenderSkipComponent: _ssrRenderSkipComponent } = require("vue/server-renderer") + + return function ssrRender(_ctx, _push, _parent, _attrs) { + const _component_Comp = _resolveComponent("Comp") + + _push(_ssrRenderSkipComponent(_push, _ctx.ok, _component_Comp, _attrs, _createSlots({ _: 2 /* DYNAMIC */ }, [ + (_ctx.yes) + ? { + name: "default", + fn: _withCtx((_, _push, _parent, _scopeId) => { + if (_push) { + _push(\`default\`) + } else { + return [ + _createTextVNode("default") + ] + } + }), + key: "0" + } + : undefined + ]), _parent)) + }" + `) + }) + + test.todo('on component with implicit default slot + v-if', () => { + expect( + compile( + ` + default + `, + ).code, + ).toMatchInlineSnapshot(` + `) + }) + + test('on component with dynamic slot', () => { + expect( + compile( + ` + + `, + ).code, + ).toMatchInlineSnapshot(` + "const { withCtx: _withCtx, resolveComponent: _resolveComponent, createTextVNode: _createTextVNode } = require("vue") const { ssrRenderComponent: _ssrRenderComponent, ssrRenderSkipComponent: _ssrRenderSkipComponent } = require("vue/server-renderer") return function ssrRender(_ctx, _push, _parent, _attrs) { const _component_Comp = _resolveComponent("Comp") _push(_ssrRenderSkipComponent(_push, _ctx.ok, _component_Comp, _attrs, { - default: _withCtx((_, _push, _parent, _scopeId) => { - if (_push) { - _push(\`default\`) - } else { - return [ - _createTextVNode("default") - ] - } - }), - foo: _withCtx((_, _push, _parent, _scopeId) => { + [_ctx.foo]: _withCtx((_, _push, _parent, _scopeId) => { if (_push) { _push(\`foo\`) } else { @@ -268,30 +403,29 @@ describe('ssr: v-skip', () => { ] } }), - _: 1 /* STABLE */ + _: 2 /* DYNAMIC */ }, _parent)) }" `) }) - test.todo('on component with multiple implicit slot', () => { + test('on component with dynamic slot + default slot', () => { expect( compile( ` - - -
+ + `, ).code, ).toMatchInlineSnapshot(` - "const { resolveComponent: _resolveComponent, withCtx: _withCtx, createTextVNode: _createTextVNode, createVNode: _createVNode } = require("vue") + "const { withCtx: _withCtx, resolveComponent: _resolveComponent, createTextVNode: _createTextVNode } = require("vue") const { ssrRenderComponent: _ssrRenderComponent, ssrRenderSkipComponent: _ssrRenderSkipComponent } = require("vue/server-renderer") return function ssrRender(_ctx, _push, _parent, _attrs) { const _component_Comp = _resolveComponent("Comp") _push(_ssrRenderSkipComponent(_push, _ctx.ok, _component_Comp, _attrs, { - foo: _withCtx((_, _push, _parent, _scopeId) => { + [_ctx.foo]: _withCtx((_, _push, _parent, _scopeId) => { if (_push) { _push(\`foo\`) } else { @@ -302,57 +436,98 @@ describe('ssr: v-skip', () => { }), default: _withCtx((_, _push, _parent, _scopeId) => { if (_push) { - _push(\`
\`) + _push(\`default\`) } else { return [ - _createVNode("span"), - _createVNode("div") + _createTextVNode("default") ] } }), - _: 1 /* STABLE */ + _: 2 /* DYNAMIC */ }, _parent)) }" `) }) - test('on dynamic component', () => { + test('on dynamic component with default slot', () => { + expect(compile(`foo`).code) + .toMatchInlineSnapshot(` + "const { withCtx: _withCtx, resolveDynamicComponent: _resolveDynamicComponent, createTextVNode: _createTextVNode, createVNode: _createVNode } = require("vue") + const { ssrRenderVNode: _ssrRenderVNode } = require("vue/server-renderer") + + return function ssrRender(_ctx, _push, _parent, _attrs) { + if (_ctx.ok) { + _push(\`foo\`) + } else { + _ssrRenderVNode(_push, _createVNode(_resolveDynamicComponent(_ctx.Comp), _attrs, { + default: _withCtx((_, _push, _parent, _scopeId) => { + if (_push) { + _push(\`foo\`) + } else { + return [ + _createTextVNode("foo") + ] + } + }), + _: 1 /* STABLE */ + }), _parent) + } + }" + `) + }) + + test('on dynamic component with dynamic slot', () => { expect( - compile( - ` - - `, - ).code, + compile(` + + + + `).code, + ).toMatchInlineSnapshot(` + "const { withCtx: _withCtx, resolveDynamicComponent: _resolveDynamicComponent, createTextVNode: _createTextVNode, createVNode: _createVNode } = require("vue") + const { ssrRenderVNode: _ssrRenderVNode, ssrRenderSkipVNode: _ssrRenderSkipVNode } = require("vue/server-renderer") + + return function ssrRender(_ctx, _push, _parent, _attrs) { + _ssrRenderSkipVNode(_ctx.ok, _push, _createVNode(_resolveDynamicComponent(_ctx.Comp), _attrs, { + [_ctx.foo]: _withCtx((_, _push, _parent, _scopeId) => { + if (_push) { + _push(\`foo\`) + } else { + return [ + _createTextVNode("foo") + ] + } + }), + _: 2 /* DYNAMIC */ + }), _parent) + }" + `) + }) + + test('on Teleport', () => { + expect( + compile(` +
foo
+
`).code, ).toMatchInlineSnapshot(` - "const { withCtx: _withCtx, resolveDynamicComponent: _resolveDynamicComponent, renderSlot: _renderSlot, createVNode: _createVNode } = require("vue") - const { ssrRenderSlot: _ssrRenderSlot, ssrRenderVNode: _ssrRenderVNode } = require("vue/server-renderer") + "const { withCtx: _withCtx } = require("vue") + const { ssrRenderTeleport: _ssrRenderTeleport } = require("vue/server-renderer") return function ssrRender(_ctx, _push, _parent, _attrs) { if (_ctx.ok) { - _ssrRenderSlot(_ctx.$slots, "default", {}, null, _push, _parent, _scopeId) + _push(\`
foo
\`) } else { - _ssrRenderVNode(_push, _createVNode(_resolveDynamicComponent(_ctx.Comp), _attrs, { - default: _withCtx((_, _push, _parent, _scopeId) => { - if (_push) { - _ssrRenderSlot(_ctx.$slots, "default", {}, null, _push, _parent, _scopeId) - } else { - return [ - _renderSlot(_ctx.$slots, "default") - ] - } - }), - _: 3 /* FORWARDED */ - }), _parent) + _ssrRenderTeleport(_push, (_push) => { + _push(\`
foo
\`) + }, "target", false, _parent) } }" `) }) test('fragment with component v-skip', () => { + // here is verified that when root is a fragment, `_attrs` won't be injected + // into skip node's alternate branch expect( compile(`