Skip to content

Commit 5dce316

Browse files
committed
wip: inject useVaporTransition call for treeshaking
1 parent 3fcba1d commit 5dce316

File tree

9 files changed

+50
-38
lines changed

9 files changed

+50
-38
lines changed

packages/compiler-vapor/src/generate.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,11 @@ export function generate(
129129
`const ${setTemplateRefIdent} = ${context.helper('createTemplateRefSetter')}()`,
130130
)
131131
}
132+
133+
if (ir.hasTransition) {
134+
push(NEWLINE, `${context.helper('useVaporTransition')}()`)
135+
}
136+
132137
push(...genBlockContent(ir.block, context, true))
133138
push(INDENT_END, NEWLINE)
134139

packages/compiler-vapor/src/ir/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ export interface RootIRNode {
6868
directive: Set<string>
6969
block: BlockIRNode
7070
hasTemplateRef: boolean
71+
hasTransition: boolean
7172
}
7273

7374
export interface IfIRNode extends BaseIRNode {

packages/compiler-vapor/src/transform.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ export function transform(
230230
directive: new Set(),
231231
block: newBlock(node),
232232
hasTemplateRef: false,
233+
hasTransition: false,
233234
}
234235

235236
const context = new TransformContext(ir, node, options)

packages/compiler-vapor/src/transforms/vIf.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,12 +134,20 @@ export function isInTransition(
134134
context: TransformContext<ElementNode>,
135135
): boolean {
136136
const parentNode = context.parent && context.parent.node
137-
return !!(parentNode && isTransitionNode(parentNode as ElementNode))
137+
return !!(parentNode && isTransitionNode(parentNode as ElementNode, context))
138138
}
139139

140-
export function isTransitionNode(node: ElementNode): boolean {
141-
return (
140+
export function isTransitionNode(
141+
node: ElementNode,
142+
context: TransformContext<ElementNode>,
143+
): boolean {
144+
const inTransition =
142145
node.type === NodeTypes.ELEMENT &&
143146
(node.tag === 'transition' || node.tag === 'Transition')
144-
)
147+
148+
if (inTransition) {
149+
context.ir.hasTransition = true
150+
}
151+
152+
return inTransition
145153
}

packages/compiler-vapor/src/transforms/vSlot.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ function transformComponentSlot(
7474
)
7575

7676
let slotKey
77-
if (isTransitionNode(node)) {
77+
if (isTransitionNode(node, context)) {
7878
const keyProp = findProp(
7979
nonSlotTemplateChildren[0] as ElementNode,
8080
'key',

packages/runtime-vapor/src/apiCreateApp.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,11 @@ import {
2020
import type { RawProps } from './componentProps'
2121
import { getGlobalThis } from '@vue/shared'
2222
import { optimizePropertyLookup } from './dom/prop'
23-
import { ensureVaporTransition } from './components/Transition'
2423

2524
let _createApp: CreateAppFunction<ParentNode, VaporComponent>
2625

2726
const mountApp: AppMountFn<ParentNode> = (app, container) => {
2827
optimizePropertyLookup()
29-
ensureVaporTransition()
3028

3129
// clear content before mounting
3230
if (container.nodeType === 1 /* Node.ELEMENT_NODE */) {

packages/runtime-vapor/src/components/Transition.ts

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
} from '../block'
2222
import { isVaporComponent } from '../component'
2323

24+
/*#__NO_SIDE_EFFECTS__*/
2425
export const vaporTransitionImpl: VaporTransitionInterface = {
2526
applyTransition: (
2627
props: TransitionProps,
@@ -118,31 +119,29 @@ function setTransitionHooks(
118119
block: TransitionBlock,
119120
hooks: VaporTransitionHooks,
120121
) {
121-
if (!isFragment(block)) {
122-
block.$transition = hooks
123-
}
122+
block.$transition = hooks
124123
}
125124

126125
export function applyTransitionEnterHooks(
127126
block: Block,
128127
hooks: VaporTransitionHooks,
129-
): VaporTransitionHooks | undefined {
130-
const child = findElementChild(block)
131-
let enterHooks
132-
if (child) {
133-
const { props, state, delayedLeave } = hooks
134-
enterHooks = resolveTransitionHooks(
135-
child,
136-
props,
137-
state,
138-
currentInstance!,
139-
hooks => (enterHooks = hooks as VaporTransitionHooks),
140-
)
141-
enterHooks.delayedLeave = delayedLeave
142-
setTransitionHooks(child, enterHooks)
143-
if (isFragment(block)) {
144-
block.$transition = enterHooks
145-
}
128+
): VaporTransitionHooks {
129+
const child = findTransitionBlock(block)
130+
if (!child) return hooks
131+
132+
const { props, state, delayedLeave } = hooks
133+
let enterHooks = resolveTransitionHooks(
134+
child,
135+
props,
136+
state,
137+
currentInstance!,
138+
hooks => (enterHooks = hooks as VaporTransitionHooks),
139+
)
140+
enterHooks.delayedLeave = delayedLeave
141+
setTransitionHooks(child, enterHooks)
142+
if (isFragment(block)) {
143+
// also set transition hooks on fragment for reusing during it's updating
144+
setTransitionHooks(block, enterHooks)
146145
}
147146
return enterHooks
148147
}
@@ -152,7 +151,7 @@ export function applyTransitionLeaveHooks(
152151
enterHooks: VaporTransitionHooks,
153152
afterLeaveCb: () => void,
154153
): void {
155-
const leavingBlock = findElementChild(block)
154+
const leavingBlock = findTransitionBlock(block)
156155
if (!leavingBlock) return undefined
157156

158157
const { props, state } = enterHooks
@@ -196,23 +195,23 @@ export function applyTransitionLeaveHooks(
196195
}
197196
}
198197

199-
const transitionChildCache = new WeakMap<Block, TransitionBlock>()
200-
export function findElementChild(block: Block): TransitionBlock | undefined {
201-
if (transitionChildCache.has(block)) {
202-
return transitionChildCache.get(block)
198+
const transitionBlockCache = new WeakMap<Block, TransitionBlock>()
199+
export function findTransitionBlock(block: Block): TransitionBlock | undefined {
200+
if (transitionBlockCache.has(block)) {
201+
return transitionBlockCache.get(block)
203202
}
204203

205204
let child: TransitionBlock | undefined
206205
if (block instanceof Node) {
207206
// transition can only be applied on Element child
208207
if (block instanceof Element) child = block
209208
} else if (isVaporComponent(block)) {
210-
child = findElementChild(block.block)
209+
child = findTransitionBlock(block.block)
211210
} else if (Array.isArray(block)) {
212211
child = block[0] as TransitionBlock
213212
let hasFound = false
214213
for (const c of block) {
215-
const item = findElementChild(c)
214+
const item = findTransitionBlock(c)
216215
if (item instanceof Element) {
217216
if (__DEV__ && hasFound) {
218217
// warn more than one non-comment child
@@ -228,7 +227,7 @@ export function findElementChild(block: Block): TransitionBlock | undefined {
228227
}
229228
}
230229
} else if (isFragment(block)) {
231-
child = findElementChild(block.nodes)
230+
child = findTransitionBlock(block.nodes)
232231
}
233232

234233
if (__DEV__ && !child) {
@@ -239,7 +238,8 @@ export function findElementChild(block: Block): TransitionBlock | undefined {
239238
}
240239

241240
let registered = false
242-
export function ensureVaporTransition(): void {
241+
/*#__NO_SIDE_EFFECTS__*/
242+
export function useVaporTransition(): void {
243243
if (!registered) {
244244
registerVaporTransition(vaporTransitionImpl)
245245
registered = true

packages/runtime-vapor/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,4 @@ export {
4242
applyDynamicModel,
4343
} from './directives/vModel'
4444
export { withVaporDirectives } from './directives/custom'
45+
export { useVaporTransition } from './components/Transition'

packages/runtime-vapor/src/vdomInterop.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ import type { RawSlots, VaporSlot } from './componentSlots'
3333
import { renderEffect } from './renderEffect'
3434
import { createTextNode } from './dom/node'
3535
import { optimizePropertyLookup } from './dom/prop'
36-
import { ensureVaporTransition } from './components/Transition'
3736

3837
// mounting vapor components and slots in vdom
3938
const vaporInteropImpl: Omit<
@@ -289,7 +288,6 @@ export const vaporInteropPlugin: Plugin = app => {
289288
const mount = app.mount
290289
app.mount = ((...args) => {
291290
optimizePropertyLookup()
292-
ensureVaporTransition()
293291
return mount(...args)
294292
}) satisfies App['mount']
295293
}

0 commit comments

Comments
 (0)