soulJF999 / dailyRecord

1 stars 0 forks source link

杂七杂八 #24

Open soulJF999 opened 3 years ago

soulJF999 commented 3 years ago

关于react native 1.无痛升级不存在 2.第三方库不一定兼容

关于webpack 1.webpack-bundle-analyzer 进行分析

关于withCredentials 如果在发送来自其他域的XMLHttpRequest请求之前,未设置withCredentials为true,那么就不能为它自己的域设置cookie值。而通过设置withCredentials为true获得的第三方cookies,将会依旧享受同源策略

关于vue diff diff的过程就是调用名为patch的函数,比较新旧节点,一边比较一边给真实的dom打补丁 在采取diff算法比较新旧节点的时候,比较只会在同层进行,不会跨层级比较

patch函数接受两个参数oldVnode和Vnode分别代表新的节点和之前的旧节点。判断两节点是否值得比较,值得比较则执行patchVnode。不值得比较则用Vnode替换oldVnode。diff是逐层比较的,如果第一层不一样那么就不会深入比较第二层了。 patchVnode(oldVnode, vnode) { const el = vnode.el = oldVnode.el let i, oldCh = oldVnode.children, ch = vnode.children if(oldVnode === vnode) return if(oldVnode.text !== node && vnode.text !== node && oldVnode.text !== vnode.text) { api.setTextContent(el, vnode.text) } else { updateele(el, vnode, oldVnode) if(oldCh && ch && oldCh !== ch){ updateChildren(el, oldCh, ch) } else if (ch) { createEle(vnode) } else if (oldCh){ api.removeChildren(el) } } }

找到对应的真实dom,称为el 判断Vnode和oldVnode是否指向同一个对象,如果是,则直接return 如果他们都有文本节点并且不相等,则将el的文本节点设置为Vnode的文本节点 如果oldVnode有子节点而vnode没有,则删除el的子节点 如果oldVnode没有子节点而vnode有,则将Vnode的子节点真实化之后添加到el 如果两者都有子节点,则执行updateChildren函数比较子节点

updatechildren 将Vnode的子节点vCh和oldVnode的子节点oldCh提取出来 oldCh和vCh各有两个头尾的变量StartIdx和EndIdx,它们的2个变量相互比较,一共有4种比较方式。如果4种比较都没匹配,如果设置了key,就会用key比较,变量会往中间靠,一旦startIdx > endIdx表明oldCh和vCh至少有一个已经遍历完了,就会结束比较。

将oldVnode的子节点oldCh和Vnode的子节点vCh取出来并分别用s和e指针指向它们的头child和尾child 现在分别对oldS、oldE、S、E两两做sameNode比较,有4种比较方式 1.如果是oldS和E匹配上了,那么真实Dom中的第一个节点会移到最后 2.如果是S和oldE匹配上了,那么真实Dom中的最后一个节点会移到最前,匹配上的两个指针向中间移动

如果四种匹配没有一种成功的,分为两种情况 1.含有key,则根据oldChild的key生成一个hash表,用S的key与hash作匹配,匹配成功则判断S和匹配节点是否为sameNode,如果是,就在真实DOM中将成功的节点移到最前面,否则,将S生成对应的节点插入到dom中对应的oldS位置,S指针向中间移动,被匹配old中的节点置为null 2.没有key,则直接将S生成的新的节点直接插入DOM中

react diff会进行tree diff、component diff和element diff(这就是差别吗) react首先对新集合进行遍历,通过唯一key来判断老集合中是否存在相同的节点,如果没有的话则创建,如果有的话,则进行移动操作