From 02cbbb718ca226b087c42e6f132120931307c2a6 Mon Sep 17 00:00:00 2001 From: Evan You Date: Fri, 5 Mar 2021 12:12:49 -0500 Subject: [PATCH] perf: support only attaching slot scope ids when necessary This is done by adding the `slotted: false` option to: - compiler-dom - compiler-ssr - compiler-sfc (forwarded to template compiler) At runtime, only slotted component will render slot fragments with slot scope Ids. For SSR, only slotted component will add slot scope Ids to rendered slot content. This should improve both runtime performance and reduce SSR rendered markup size. Note: requires SFC tooling (e.g. `vue-loader` and `vite`) to pass on the `slotted` option from the SFC descriptoer to the `compileTemplate` call. --- .../transforms/transformSlotOutlet.spec.ts | 9 +++++ packages/compiler-core/src/options.ts | 6 ++++ packages/compiler-core/src/transform.ts | 2 ++ .../src/transforms/transformSlotOutlet.ts | 10 ++++++ packages/compiler-sfc/__tests__/parse.spec.ts | 16 +++++++++ packages/compiler-sfc/src/compileTemplate.ts | 3 ++ packages/compiler-sfc/src/parse.ts | 10 +++++- .../__tests__/ssrSlotOutlet.spec.ts | 27 ++++++++++---- .../src/transforms/ssrTransformSlotOutlet.ts | 36 +++++++++++-------- .../runtime-core/__tests__/scopeId.spec.ts | 16 +++++---- .../runtime-core/src/helpers/renderSlot.ts | 6 ++-- 11 files changed, 110 insertions(+), 31 deletions(-) diff --git a/packages/compiler-core/__tests__/transforms/transformSlotOutlet.spec.ts b/packages/compiler-core/__tests__/transforms/transformSlotOutlet.spec.ts index 82a5c8e50e1..1a4ea3da8bf 100644 --- a/packages/compiler-core/__tests__/transforms/transformSlotOutlet.spec.ts +++ b/packages/compiler-core/__tests__/transforms/transformSlotOutlet.spec.ts @@ -339,6 +339,15 @@ describe('compiler: transform outlets', () => { }) }) + test('slot with slotted: true', async () => { + const ast = parseWithSlots(``, { slotted: true }) + expect((ast.children[0] as ElementNode).codegenNode).toMatchObject({ + type: NodeTypes.JS_CALL_EXPRESSION, + callee: RENDER_SLOT, + arguments: [`$slots`, `"default"`, `{}`, `undefined`, `true`] + }) + }) + test(`error on unexpected custom directive on `, () => { const onError = jest.fn() const source = `` diff --git a/packages/compiler-core/src/options.ts b/packages/compiler-core/src/options.ts index 2850da196b1..d8d2573a6e8 100644 --- a/packages/compiler-core/src/options.ts +++ b/packages/compiler-core/src/options.ts @@ -199,6 +199,12 @@ export interface TransformOptions extends SharedTransformCodegenOptions { * SFC scoped styles ID */ scopeId?: string | null + /** + * Indicates this SFC template has used :slotted in its styles + * Defaults to `true` for backwards compatibility - SFC tooling should set it + * to `false` if no `:slotted` usage is detected in ``).descriptor + .slotted + ).toBe(false) + expect( + parse(``) + .descriptor.slotted + ).toBe(true) + expect( + parse(``) + .descriptor.slotted + ).toBe(true) + }) + test('error tolerance', () => { const { errors } = parse(`