Vue3之Diff算法源码分析,阿里巴巴内部Jetpack宝典意外流出

c1[i],

nextChild,

container,

null,

parentComponent,

parentSuspense,

isSVG,

slotScopeIds,

optimized

)

}

if (oldLength > newLength) {

// remove old

unmountChildren(

c1,

parentComponent,

parentSuspense,

true,

false,

commonLength

)

} else {

// mount new

mountChildren(

c2,

container,

anchor,

parentComponent,

parentSuspense,

isSVG,

slotScopeIds,

optimized,

commonLength

)

}

}

没有使用patchUnkeyedChildren方法

如果节点相同,继续遍历、否则break、然后从尾部开始遍历、如果旧节点遍历完还有新节点、会用null去patch(就会挂载上去),如果旧的更多就移除旧节点

第五步:乱序的时候、有多余节点就移除节点、之后是移动节点和挂载节点

// can be all-keyed or mixed

const patchKeyedChildren = (

c1: VNode[],

c2: VNodeArrayChildren,

container: RendererElement,

parentAnchor: RendererNode | null,

parentComponent: ComponentInternalInstance | null,

parentSuspense: SuspenseBoundary | null,

isSVG: boolean,

slotScopeIds: string[] | null,

optimized: boolean

) => {

let i = 0

const l2 = c2.length

let e1 = c1.length - 1 // prev ending index

let e2 = l2 - 1 // next ending index

// 1. sync from start

// (a b) c

// (a b) d e

while (i <= e1 && i <= e2) {

const n1 = c1[i]

const n2 = (c2[i] = optimized

? cloneIfMounted(c2[i] as VNode)
normalizeVNode(c2[i]))

if (isSameVNodeType(n1, n2)) {

patch(

n1,

n2,

container,

null,

parentComponent,

parentSuspense,

isSVG,

slotScopeIds,

optimized

)

} else {

break

}

i++

}

// 2. sync from end

// a (b c)

// d e (b c)

while (i <= e1 && i <= e2) {

const n1 = c1[e1]

const n2 = (c2[e2] = optimized

? cloneIfMounted(c2[e2] as VNode)
normalizeVNode(c2[e2]))

if (isSameVNodeType(n1, n2)) {

patch(

n1,

n2,

container,

null,

parentComponent,

parentSuspense,

isSVG,

slotScopeIds,

optimized

)

} else {

break

}

e1–

e2–

}

// 3. common sequence + mount

// (a b)

// (a b) c

// i = 2, e1 = 1, e2 = 2

// (a b)

// c (a b)

// i = 0, e1 = -1, e2 = 0

if (i > e1) {

if (i <= e2) {

const nextPos = e2 + 1

const anchor = nextPos < l2 ? (c2[nextPos] as VNode).el : parentAnchor

while (i <= e2) {

patch(

null,

(c2[i] = optimized

? cloneIfMounted(c2[i] as VNode)
normalizeVNode(c2[i])),

container,

anchor,

parentComponent,

parentSuspense,

isSVG,

slotScopeIds,

optimized

)

i++

}

}

}

// 4. common sequence + unmount

// (a b) c

// (a b)

// i = 2, e1 = 2, e2 = 1

// a (b c)

// (b c)

// i = 0, e1 = 0, e2 = -1

else if (i > e2) {

while (i <= e1) {

unmount(c1[i], parentComponent, parentSuspense, true)

i++

}

}

// 5. unknown sequence

// [i … e1 + 1]: a b [c d e] f g

// [i … e2 + 1]: a b [e d c h] f g

// i = 2, e1 = 4, e2 = 5

else {

const s1 = i // prev starting index

const s2 = i // next starting index

// 5.1 build key:index map for newChildren

const keyToNewIndexMap: Map<string | number | symbol, number> = new Map()

for (i = s2; i <= e2; i++) {

const nextChild = (c2[i] = optimized

? cloneIfMounted(c2[i] as VNode)
normalizeVNode(c2[i]))

if (nextChild.key != null) {

if (DEV && keyToNewIndexMap.has(nextChild.key)) {

warn(

Duplicate keys found during update:,

JSON.stringify(nextChild.key),

Make sure keys are unique.

)

}

keyToNewIndexMap.set(nextChild.key, i)

}

}

// 5.2 loop through old children left to be patched and try to patch

// matching nodes & remove nodes that are no longer present

let j

let patched = 0

const toBePatched = e2 - s2 + 1

let moved = false

// used to track whether any node has moved

let maxNewIndexSoFar = 0

// works as Map<newIndex, oldIndex>

// Note that oldIndex is offset by +1

// and oldIndex = 0 is a special value indicating the new node has

// no corresponding old node.

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

结束

一次完整的面试流程就是这样啦,小编综合了腾讯的面试题做了一份前端面试题PDF文档,里面有面试题的详细解析,分享给小伙伴们,有没有需要的小伙伴们都去领取!

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

伙伴们都去领取!

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值