国产黄色免费网站_久久天天做天天爱综合色_精品国产一区久久久_成人黄色激情网站_久久成人在线视频_美女一区二区在线观看_亚洲精品免费一区亚洲精品免费精品一区 _91精品国产综合久久精品麻豆

一起理解Virtual DOM

如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中, 請點(diǎn)這里

 

前言

React 好像已經(jīng)火了很久很久,以致于我們對于 Virtual DOM 這個(gè)詞都已經(jīng)很熟悉了,網(wǎng)上也有非常多的介紹 React、Virtual DOM 的文章。但是直到前不久我專門花時(shí)間去學(xué)習(xí) Virtual DOM,才讓我對 Virtual DOM 有了一定的理解,以致于要懷疑起很久之前看過的那些文章來。倒不是這些文章講得不對,而是現(xiàn)在在我看來角度不太好,說得越多,越說不清。

讓我能夠有所開竅(自認(rèn)為)的,是這篇文章:


Change And Its Detection In JavaScript Frameworks
Monday Mar 2, 2015 by Tero Parviainen


作者看問題的角度很棒,從數(shù)據(jù)變更與UI同步的角度來介紹各個(gè)典型框架,特別是對于 React 的 Virtual DOM,從這個(gè)角度理解起來更容易些。

感興趣的同學(xué),如果沒有讀過這篇文章,推薦去看一看,不感興趣就算了。不過接下來我要講的東西,部分整理自這篇文章,特別是從這篇文章中引用的圖片,非常棒。當(dāng)然還有我自己的一些思考,以及一些對于目前 Virtual DOM 實(shí)現(xiàn)的開源庫的分析。

如果讀了上面推薦的這篇文章,我倒是不介意你不再繼續(xù)把本文讀下去,因?yàn)橛行〇|西你已經(jīng)領(lǐng)會(huì)到了。當(dāng)然,也不反對。

變化這件事

談?wù)擁撁娴淖兓埃蹅兿瓤聪聰?shù)據(jù)和頁面(視覺層面的頁面)的關(guān)系。數(shù)據(jù)是隱藏在頁面底下,通過渲染展示給用戶。同樣的數(shù)據(jù),按照不同的頁面設(shè)計(jì)和實(shí)現(xiàn),會(huì)以不同形式、樣式的頁面呈現(xiàn)出來。有時(shí)候在一個(gè)頁面內(nèi)的不同位置,也會(huì)有相同數(shù)據(jù)的不同表現(xiàn)。

1.png

Paste_Image.png

Web 的早期,這些頁面通常是靜態(tài)的,頁面內(nèi)容不會(huì)變化。而如果數(shù)據(jù)發(fā)生了變化,通常需要重新請求頁面,得到基于新的數(shù)據(jù)渲染出的新的頁面。

2.png

Paste_Image.png

至少,這個(gè)模式理解起來挺簡單不是嗎。

直到 Web 應(yīng)用復(fù)雜起來,開發(fā)者們開始關(guān)注用戶體驗(yàn),開始將大量的處理向前端遷移,頁面變得動(dòng)態(tài)、靈活起來。一個(gè)顯著的特征是,數(shù)據(jù)發(fā)生變化之后,不再需要刷新頁面就能看到頁面上的內(nèi)容隨之更新了。

前端需要做的事情變得多了起來,前端工程師們也就修煉了起來,各種前端技術(shù)也就出現(xiàn)了。

首先,聰明的工程師們發(fā)現(xiàn)既然是在前端渲染頁面,如果只是部分?jǐn)?shù)據(jù)發(fā)生了變化,就要把頁面整體或一大塊區(qū)域重新渲染就有點(diǎn)笨了。為什么不把事情做得更些,只更新變化的數(shù)據(jù)對應(yīng)的頁面的內(nèi)容呢?

怎么做呢?操作 DOM 唄。DOM 就是瀏覽器提供給開發(fā)者用于操作頁面的模型嘛,直接通過腳本來調(diào)用 DOM 的各種接口就 OK 了。而且我們還有了像 jQuery 這樣的棒棒的工具,操作 DOM 變得 so easy。

然而,頁面越來越復(fù)雜,聰明的工程師們發(fā)現(xiàn)數(shù)據(jù)變化之后,老是需要手動(dòng)編碼去操作對應(yīng)的 DOM 節(jié)點(diǎn)執(zhí)行更新,有點(diǎn)煩,不夠懶啊。于是各種框架如雨后春筍般出現(xiàn)了,紛紛表示可以簡化這個(gè)過程。

稍微早期的框架有這樣的:

3.png

 
Paste_Image.png

開發(fā)者借助框架,監(jiān)聽數(shù)據(jù)的變更,在數(shù)據(jù)變更后更新對應(yīng)的 DOM 節(jié)點(diǎn)。雖然還是要寫一些代碼,但是寫出來的代碼好像很有條理的樣子,至少更容易理解和維護(hù)了,也不錯(cuò)嘛。

更進(jìn)一步,MVVM 框架出現(xiàn)了,以 AngularJS 為代表:

4.png

 
Paste_Image.png

仍然是數(shù)據(jù)變化后更新對應(yīng) DOM 節(jié)點(diǎn)的方式,但是建立這種綁定關(guān)系的過程被框架所處理,開發(fā)者要寫的代碼變少了,而且代碼更易讀和維護(hù)了。

再然后呢,大家就在這個(gè)棒棒的模式上繼續(xù)深耕,紛紛表示還可以在性能上做得更好,前端領(lǐng)域一片繁榮。

再后來 React 出現(xiàn)了,它不僅不是 MVVM 框架,甚至連 MV 框架都不是。這年頭,不是個(gè) MV 框架還好意思出門?可 React 還真的帶來了新的思路!

什么思路呢?

就是回到過去,回到那個(gè)簡單而美好的時(shí)候。具體而言,就是每次數(shù)據(jù)發(fā)生變化,就重新執(zhí)行一次整體渲染。的確這樣更簡單,不用去琢磨到底是數(shù)據(jù)的哪一部分變化了,需要更新頁面的哪一部分。但是壞處太明顯,體驗(yàn)不好啊。而 React 給出了解決方案,就是 Virtual DOM。

Virtual DOM 概況來講,就是在數(shù)據(jù)和真實(shí) DOM 之間建立了一層緩沖。對于開發(fā)者而言,數(shù)據(jù)變化了就調(diào)用 React 的渲染方法,而 React 并不是直接得到新的 DOM 進(jìn)行替換,而是先生成 Virtual DOM,與上一次渲染得到的 Virtual DOM 進(jìn)行比對,在渲染得到的 Virtual DOM 上發(fā)現(xiàn)變化,然后將變化的地方更新到真實(shí) DOM 上。

簡單來說,React 在提供給開發(fā)者簡單的開發(fā)模式的情況下,借助 Virtual DOM 實(shí)現(xiàn)了性能上的優(yōu)化,以致于敢說自己“不慢”。

Virtual DOM

React 基于 Virtual DOM 的數(shù)據(jù)更新與UI同步機(jī)制:

5.png

 
React – 初始渲染

初始渲染時(shí),首先將數(shù)據(jù)渲染為 Virtual DOM,然后由 Virtual DOM 生成 DOM。

6.png

 
React – 數(shù)據(jù)更新

數(shù)據(jù)更新時(shí),渲染得到新的 Virtual DOM,與上一次得到的 Virtual DOM 進(jìn)行 diff,得到所有需要在 DOM 上進(jìn)行的變更,然后在 patch 過程中應(yīng)用到 DOM 上實(shí)現(xiàn)UI的同步更新。

Virtual DOM 作為數(shù)據(jù)結(jié)構(gòu),需要能準(zhǔn)確地轉(zhuǎn)換為真實(shí) DOM,并且方便進(jìn)行對比。除了 Virtual DOM 外,React 還實(shí)現(xiàn)了其他的特性,為了專注于 Virtual DOM,我另外找了兩個(gè)比較 Virtual DOM 來學(xué)習(xí):

  • virtual-dom
  • Snabbdom

這里也推薦給感興趣且還沒有讀過兩個(gè)庫源碼的同學(xué)。

由于只關(guān)注 Virtual DOM,通過閱讀兩個(gè)庫的源碼,對于 Virtual DOM 的定位有了更深一步的理解。

首先看數(shù)據(jù)結(jié)構(gòu)。

Virtual DOM 數(shù)據(jù)結(jié)構(gòu)

DOM 通常被視為一棵樹,元素則是這棵樹上的節(jié)點(diǎn)(node),而 Virtual DOM 的基礎(chǔ),就是 Virtual Node 了。

在 virtual-dom 中,給 Virtual Node 聲明了對應(yīng)的類 VirtualNode,基本是用于存儲數(shù)據(jù),包括:

  • tagName
  • properties
  • children
  • key
  • namespace
  • count
  • hasWidgets
  • hasThunks
  • hooks
  • descendantHooks

Snabbdom 的 Virtual Node 則是純數(shù)據(jù)對象,通過 vnode 模塊來創(chuàng)建,對象屬性包括:

  • sel
  • data
  • children
  • text
  • elm
  • key

雖然有所差別,除去實(shí)現(xiàn)上的差別和庫本身的額外特性,可以看到 Virtual Node 用于創(chuàng)建真實(shí)節(jié)點(diǎn)的數(shù)據(jù)包括:

  • 元素類型
  • 元素屬性
  • 元素的子節(jié)點(diǎn)

有了這些其實(shí)就可以創(chuàng)建對應(yīng)的真實(shí)節(jié)點(diǎn)了。

創(chuàng)建 Virtual DOM

嵌套 Virtual Node 就可以得到一棵樹了。virtual-dom 和 Snabbdom 都提供了函數(shù)調(diào)用的方式來創(chuàng)建 Virtual Tree,這個(gè)過程就是渲染了:

var vTree = h('div', [
  h('span', 'hello'),
  h('span', 'world')
])
 

React 提供 JSX 這顆糖,使得我們可以用類似 HTML 的語法來編寫,不過編譯后實(shí)質(zhì)還是通過函數(shù)調(diào)用來得到一棵嵌套的 Virtual Tree。而且這對于理解 Virtual DOM 機(jī)制來說不是特別重要,先不管這個(gè)。

使用 Virtual DOM

首先來看初始化,virtual-dom 提供了 createElement 函數(shù):

 
var rootNode = createElement(tree)
document.body.appendChild(rootNode)
 
根據(jù) Virtual Node 創(chuàng)建真實(shí) DOM 元素,然后再追加到頁面上。


再來看更新。virtual-dom 有明確的兩步操作,首先 diff,然后 patch:

var newTree = render(count)
var patches = diff(tree, newTree)
rootNode = patch(rootNode, patches)


而 Snabbdom 則簡單些,只有一個(gè) patch 函數(shù),內(nèi)部在進(jìn)行比對的同時(shí)將更新應(yīng)用到了真實(shí) DOM 上,而且初始化也是用的 patch 函數(shù):

var vnode = render(data)
var container = document.getElementById('container')
patch(container, vnode)
 
// after data changed
var newVnode = render(data)
patch(vnode, newVnode)

 

性能優(yōu)化

關(guān)于性能優(yōu)化,除了 Virtual DOM 機(jī)制本身提供的特性以外,再就是不同的 Virtual DOM 庫自身的優(yōu)化方案了,這個(gè)可以看上面兩個(gè)庫的文檔,不再贅述。

其實(shí)提到 Virtual DOM 的差異比對,有人會(huì)對其內(nèi)部如何處理數(shù)組感興趣。的確,如果數(shù)組元素的位置發(fā)生了改變,這個(gè)要識別起來是有點(diǎn)麻煩。為此,上面兩個(gè)庫和 React 其實(shí)都在 Virtual Node 上額外記錄了一個(gè)屬性“key”,就是用來輔助進(jìn)行 Virtual Node 的比對的。

簡單來說,如果兩個(gè) Virtual Node 的位置不同,但是 key 屬性相同,那么會(huì)將這兩個(gè)節(jié)點(diǎn)視為由相同數(shù)據(jù)渲染得到的,然后進(jìn)一步進(jìn)行差異分析。所以,并不是僅僅按照位置進(jìn)行比對,具體的實(shí)現(xiàn)可以查看各個(gè)庫的源碼。

小結(jié)

OK,以上就是我要講的全部所有內(nèi)容了。

相信很多同學(xué)之前對 Virtual DOM 已經(jīng)很熟悉了,比我理解得更深入的同學(xué)相信也不會(huì)少。不過從“數(shù)據(jù)變化與UI同步更新”這個(gè)角度來理解 Virtual DOM,在我看來是比較好的,所以整理在這里了。

有個(gè)問題挺常見,AngularJS 和 React 哪個(gè)更好?

如果說各有千秋的話,估計(jì)大家就“呵呵”了。但是這兩個(gè)框架/庫從“數(shù)據(jù)變化與UI同步更新”的角度來看,的確都解決了問題,而且解決問題的方式大家都挺認(rèn)可(至少在喜歡它們的同學(xué)眼里是這樣的)。

 

 藍(lán)藍(lán)設(shè)計(jì)www.newchinaweekly.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 平面設(shè)計(jì)服務(wù)

日歷

鏈接

個(gè)人資料

藍(lán)藍(lán)設(shè)計(jì)的小編 http://www.newchinaweekly.com

存檔

动漫精品视频| 成人黄色毛片| 日韩在线短视频| 三级小说欧洲区亚洲区| 影音先锋久久久| www.亚洲精品| 在线亚洲欧美专区二区| 一区二区福利视频| 久久久最新网址| 久久99久久99精品蜜柚传媒| 五十路熟女丰满大屁股| 人妻体体内射精一区二区| 久热这里有精品| 日韩在线观看视频一区二区三区| 免费在线观看h| 你懂的在线视频| 只有精品亚洲| 亚洲精品色图| 国产精品不卡在线| 亚洲精品在线网站| 欧美日韩专区| 成人少妇影院yyyy| 亚洲成人免费在线| 国产一区二区三区精品久久久| 日韩欧美区一区二| 4k岛国日韩精品**专区| 亚洲精品一品区二品区三品区 | 一区二区国产精品视频| 91精品视频免费看| 日韩欧美xxxx| 日韩视频第二页| 免费成人深夜夜行网站| 成人午夜无人区一区二区| 领导边摸边吃奶边做爽在线观看| 激情视频免费| 桃色一区二区| 久久久久亚洲精品中文字幕| 亚洲久久视频| 亚洲国产精品久久不卡毛片 | 亚洲成人激情av| 日韩视频在线一区| 日韩在线观看电影完整版高清免费| 自拍视频第一页| 国产成人精品免费看视频| 亚洲精品一区二区| 99riav在线| 久久99国内| 国产日韩欧美一区二区三区乱码| 亚洲国内精品在线| 久久av红桃一区二区小说| 欧美日韩精品一区| 黄色片网站免费| 欧洲vodafonewi精品| 午夜av在线播放| 自拍偷拍亚洲视频| 国产日韩欧美三区| 色天天综合色天天久久| 国产精品久久久久久久久久久新郎 | 日韩高清不卡| 久久se精品一区二区| 91精品国产高清一区二区三区蜜臀 | 91精品国产日韩91久久久久久| 91在线播放视频| 国精产品一区一区三区免费视频| 男人用机机桶女人| 看黄在线观看| 九九热在线视频观看这里只有精品| 日韩手机在线导航| 精品91免费| 女同久久另类69精品国产| 夜夜嗨yeyeh| 国产区一区二| 亚洲三级电影在线观看| 欧美视频不卡中文| 亚洲自拍偷拍网址| 精品无人区无码乱码毛片国产| 欧美x0x0| 成人短视频软件网站大全app| 成人av第一页| 中文字幕亚洲一区二区三区五十路 | 日韩xxx视频| 97电影在线| 久久黄色影院| 亚洲欧美日韩系列| 国产精品久久激情| 精品国产av色一区二区深夜久久| 国产成人亚洲欧美电影| 日韩在线网址| 亚洲人成在线播放网站岛国| 国产精品欧美一区二区| 一级二级黄色片| www.4438全国最大| 欧美日韩免费观看一区=区三区| 欧美日韩国产在线播放网站| 日韩资源av在线| 国产乡下妇女三片| 在线视频中文字幕第一页| 国产一区欧美日韩| 欧美激情xxxx性bbbb| 亚洲v在线观看| 黄色网址免费在线| 日韩欧美一区二区三区免费看| 欧洲国内综合视频| 在线电影看在线一区二区三区| 在线观看黄色网| 国产精选在线| 国产精品国产三级国产aⅴ入口 | 亚洲一区二区国产| 男女视频在线看| 色在线视频免费| 色琪琪久久se色| 精品国产一二三区| 一路向西2在线观看| 涩涩视频网站| 欧美fxxxxxx另类| 日韩精品中文字幕久久臀| 91n.com在线观看| 奇米网人体黄视频| 亚洲成人一区| 一本色道久久88精品综合| 韩国三级hd中文字幕有哪些| 黄网免费视频| 亚洲成人18| 国产av 一区二区三区| 韩国三级av在线免费观看| 精品无码三级在线观看视频| 国内久久久精品| 久热这里有精品| 538在线精品| 好看的日韩av电影| 亚洲老司机av| 日本69式三人交| 亚洲尤物在线视频| 成人午夜激情影院| 99久久综合狠狠综合久久止| 亚洲一区二区激情| 日韩欧美中文字幕一区二区三区 | 久久av一区二区三区漫画| 国产偷人妻精品一区二区在线| 天堂久久一区| 欧美日韩国产美| 激情黄色小视频| 中文字幕免费在线视频| 成人av综合在线| 国产成人精品一区二区三区福利| www.天堂在线| 欧美日韩xxxx| 深夜精品寂寞黄网站在线观看| 日本美女xxx| 国产自产自拍视频在线观看| 婷婷丁香激情综合| 日日摸日日碰夜夜爽av| 国产国产国产国产国产国产| 国内久久精品视频| 超碰97人人在线| 成人免费观看在线视频| 成人婷婷网色偷偷亚洲男人的天堂| 国产一区二区久久精品| 国产精品1区2区3区4区| 蜜桃av.网站在线观看| 欧美综合一区二区| 下面一进一出好爽视频| 色开心亚洲综合| 久久99久国产精品黄毛片色诱| 92国产精品久久久久首页| 天天射,天天干| 很黄很黄激情成人| 国产精品aaaa| 男人的天堂a在线| 欧美精品18| 国产精品一区二区久久精品| 国产91免费在线观看| 国产精品久久久久无码av| 亚洲2020天天堂在线观看| 97成人在线观看| 99精品视频在线观看播放| 奇米四色中文综合久久| 欧美一区二区黄片| 在线一区免费观看| 成人免费在线一区二区三区| 久久精品最新免费国产成人| 精品一区二区在线免费观看| 日本午夜精品一区二区| 中文精品久久久久人妻不卡| 女同久久另类99精品国产| www.国产精品一二区| 69视频免费看| 午夜精品999| 国产精品一区二区免费| 深夜免费福利视频| 99精品视频在线观看免费| 国产日韩在线视频| 四虎激情影院| 久久91精品久久久久久秒播| 亚洲一区二区三区在线观看视频 | 国产专区精品视频| 国产一级免费看| 91小视频免费观看| 香港日本韩国三级网站| 欧美aa免费在线|