欧美精品在线一区二区三区_亚洲女同精品视频_日韩一区免费_国产欧美久久久精品免费_国产这里只有精品_僵尸再翻生在线观看_久久99精品国产一区二区三区_亚洲免费一区二区_女教师淫辱の教室蜜臀av软件_中文字幕国产一区二区

一起理解Virtual DOM

2016-11-1    藍藍設計的小編

如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

 

前言

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

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


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


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

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

如果讀了上面推薦的這篇文章,我倒是不介意你不再繼續把本文讀下去,因為有些東西你已經領會到了。當然,也不反對。

變化這件事

談論頁面的變化之前,咱們先看下數據和頁面(視覺層面的頁面)的關系。數據是隱藏在頁面底下,通過渲染展示給用戶。同樣的數據,按照不同的頁面設計和實現,會以不同形式、樣式的頁面呈現出來。有時候在一個頁面內的不同位置,也會有相同數據的不同表現。

1.png

Paste_Image.png

Web 的早期,這些頁面通常是靜態的,頁面內容不會變化。而如果數據發生了變化,通常需要重新請求頁面,得到基于新的數據渲染出的新的頁面。

2.png

Paste_Image.png

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

直到 Web 應用復雜起來,開發者們開始關注用戶體驗,開始將大量的處理向前端遷移,頁面變得動態、靈活起來。一個顯著的特征是,數據發生變化之后,不再需要刷新頁面就能看到頁面上的內容隨之更新了。

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

首先,聰明的工程師們發現既然是在前端渲染頁面,如果只是部分數據發生了變化,就要把頁面整體或一大塊區域重新渲染就有點笨了。為什么不把事情做得更些,只更新變化的數據對應的頁面的內容呢?

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

然而,頁面越來越復雜,聰明的工程師們發現數據變化之后,老是需要手動編碼去操作對應的 DOM 節點執行更新,有點煩,不夠懶啊。于是各種框架如雨后春筍般出現了,紛紛表示可以簡化這個過程。

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

3.png

 
Paste_Image.png

開發者借助框架,監聽數據的變更,在數據變更后更新對應的 DOM 節點。雖然還是要寫一些代碼,但是寫出來的代碼好像很有條理的樣子,至少更容易理解和維護了,也不錯嘛。

更進一步,MVVM 框架出現了,以 AngularJS 為代表:

4.png

 
Paste_Image.png

仍然是數據變化后更新對應 DOM 節點的方式,但是建立這種綁定關系的過程被框架所處理,開發者要寫的代碼變少了,而且代碼更易讀和維護了。

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

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

什么思路呢?

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

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

簡單來說,React 在提供給開發者簡單的開發模式的情況下,借助 Virtual DOM 實現了性能上的優化,以致于敢說自己“不慢”。

Virtual DOM

React 基于 Virtual DOM 的數據更新與UI同步機制:

5.png

 
React – 初始渲染

初始渲染時,首先將數據渲染為 Virtual DOM,然后由 Virtual DOM 生成 DOM。

6.png

 
React – 數據更新

數據更新時,渲染得到新的 Virtual DOM,與上一次得到的 Virtual DOM 進行 diff,得到所有需要在 DOM 上進行的變更,然后在 patch 過程中應用到 DOM 上實現UI的同步更新。

Virtual DOM 作為數據結構,需要能準確地轉換為真實 DOM,并且方便進行對比。除了 Virtual DOM 外,React 還實現了其他的特性,為了專注于 Virtual DOM,我另外找了兩個比較 Virtual DOM 來學習:

  • virtual-dom
  • Snabbdom

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

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

首先看數據結構。

Virtual DOM 數據結構

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

在 virtual-dom 中,給 Virtual Node 聲明了對應的類 VirtualNode,基本是用于存儲數據,包括:

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

Snabbdom 的 Virtual Node 則是純數據對象,通過 vnode 模塊來創建,對象屬性包括:

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

雖然有所差別,除去實現上的差別和庫本身的額外特性,可以看到 Virtual Node 用于創建真實節點的數據包括:

  • 元素類型
  • 元素屬性
  • 元素的子節點

有了這些其實就可以創建對應的真實節點了。

創建 Virtual DOM

嵌套 Virtual Node 就可以得到一棵樹了。virtual-dom 和 Snabbdom 都提供了函數調用的方式來創建 Virtual Tree,這個過程就是渲染了:

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

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

使用 Virtual DOM

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

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


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

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


而 Snabbdom 則簡單些,只有一個 patch 函數,內部在進行比對的同時將更新應用到了真實 DOM 上,而且初始化也是用的 patch 函數:

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

 

性能優化

關于性能優化,除了 Virtual DOM 機制本身提供的特性以外,再就是不同的 Virtual DOM 庫自身的優化方案了,這個可以看上面兩個庫的文檔,不再贅述。

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

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

小結

OK,以上就是我要講的全部所有內容了。

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

有個問題挺常見,AngularJS 和 React 哪個更好?

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

 

 藍藍設計m.ocunn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

日歷

鏈接

個人資料

藍藍設計的小編 http://m.ocunn.cn

存檔

亚洲免费观看在线| 黄页视频在线91| 嫩草成人www欧美| 国产精品亚洲综合一区在线观看| 99精品视频一区| 国产精品久久福利| 一本色道亚洲精品aⅴ| 在线不卡a资源高清| 日韩精品中文字幕有码专区| 久久久999国产| 国产成人精品免费久久久久| 国产亚洲自拍偷拍| 国产一区二区三区在线免费| 加勒比av中文字幕| 四虎地址8848| 一区二区www| 美丽的姑娘在线观看免费动漫| 黄色av电影在线观看| 国产成人77亚洲精品www| 久久资源综合| 一区二区三区高清视频在线观看| 成人妖精视频yjsp地址| 亚洲一区二区三区中文字幕| 日韩一级视频免费观看在线| 久久久精品在线观看| 91亚洲va在线va天堂va国 | 中文字幕免费高| 国产一伦一伦一伦| 欧美人与禽zoz0善交| 久久久久久无码精品大片| 中文字幕网在线| 国产区美女在线| 国产+成+人+亚洲欧洲在线| 亚洲午夜精品久久久久久app| 国产成人一级电影| 五月综合激情网| 亚洲女人天堂成人av在线| 国产成人久久久| 一区二区日本| 日本女人性视频| 精品在线视频免费| 色资源网在线观看| 神马久久资源| 一区二区电影在线观看| 成人免费av资源| 一本到三区不卡视频| 色妞欧美日韩在线| 97se国产在线视频| 国产极品粉嫩福利姬萌白酱| 国产99在线 | 亚洲| 国产肥老妇视频| 亚洲综合图区| 神马电影久久| 国产精品1区二区.| 91电影在线观看| 九九久久国产精品| 视频一区二区在线| 欧美做受高潮中文字幕| 奴色虐av一区二区三区| 国产秀色在线www免费观看| 性欧美xxxx免费岛国不卡电影| 日本va欧美va精品| 五月开心婷婷久久| 久久综合免费视频影院| 欧美一区二区影视| 黄色免费视频网站| 国产精品国产av| 岛国av在线播放| 中文无码久久精品| 国产精品毛片久久久久久久| 精品在线小视频| 国产成人一区二区三区免费看| 嫩草av久久伊人妇女超级a| 亚洲国产综合久久| 黄在线免费看| 日韩在线视屏| 国产精品理伦片| 亚洲日韩中文字幕| 欧美精品v日韩精品v国产精品| av地址在线观看| 国产激情久久久久久熟女老人av| 在线天堂新版最新版在线8| 亚洲日韩成人| 婷婷六月综合亚洲| 国内精品久久久久久久| 国产精品久久久久9999爆乳| 丰满少妇高潮久久三区| 1pondo在线播放免费| 日本在线电影一区二区三区| 国产日韩三级在线| 伊人久久综合97精品| 日韩精品一线二线三线| 黄大色黄女片18免费| 四虎在线免费看| 伊人久久大香线蕉av不卡| 99精品国产热久久91蜜凸| 精品少妇一区二区三区视频免付费 | 免费成人小视频| 欧美日韩精品久久久| 成人av.网址在线网站| 老司机午夜性大片| 国产成人精品一区二三区四区五区| 成人黄色免费网站| 狠狠色丁香婷综合久久| 日韩视频一区二区三区在线播放| 7777精品伊久久久大香线蕉语言| 天堂va欧美va亚洲va老司机| 人人妻人人玩人人澡人人爽| 精品自拍偷拍| 国产亚洲欧美一区在线观看| 自拍视频国产精品| 波多野结衣 作品| 久久久久久久久久免费视频| 美女av在线免费看| 日韩三级电影网| 免费观看久久av| 成人欧美一区二区三区黑人麻豆| 欧美精品videosex性欧美| 欧美色图色综合| ,一级淫片a看免费| 欧美日本三级| 国产日韩欧美在线播放不卡| 91黄色免费看| 51国产成人精品午夜福中文下载 | 国产精品麻豆一区二区| 亚洲性生活视频| 一区二区三区一级片| 日韩精品成人一区| 色豆豆成人网| 成人av在线资源网站| 国产午夜精品免费一区二区三区| 四虎4hu永久免费入口| 久久久久久91亚洲精品中文字幕| 波多野结衣亚洲一二三| 欧美日韩蜜桃| 91麻豆免费在线观看| 色久欧美在线视频观看| 国产免费毛卡片| 一本一道精品欧美中文字幕| 超碰成人免费| 亚洲日本在线天堂| 国产精品视频男人的天堂| 星空大象在线观看免费播放| 国产特黄在线| 亚洲一区中文| 亚洲精品国产精品乱码不99按摩| aaa免费在线观看| 亚洲大尺度在线观看| 7777精品| 亚洲国产视频一区二区| 91中文精品字幕在线视频| 成人激情五月天| av剧情在线观看| 国产成人av在线影院| 美女性感视频久久久| 亚洲综合欧美激情| 青青视频在线观| 亚洲专区一区二区三区| 亚洲国产三级网| 五月丁香综合缴情六月小说| 免费看日韩av| 午夜欧美理论片| 日韩免费一区二区| 亚洲 欧美 综合 另类 中字| www天堂在线| 亚洲不卡av不卡一区二区| 91精品综合久久久久久| 成人黄色片免费| 天堂在线观看视频| 狠狠噜噜久久| 日韩精品一区二区三区第95| 北条麻妃在线一区| 免费在线观看一级毛片| 日本亚洲三级在线| 久久精品国产欧美激情| 免费看91视频| www在线看| 久久综合久久鬼色| 国产精品久久久久久久久久久久久| 天天躁夜夜躁狠狠是什么心态| 性欧美18xxxhd| 中文字幕欧美区| 99电影网电视剧在线观看| 五月婷婷开心网| 自拍偷拍一区| 欧美精品久久99久久在免费线 | 亚洲一区中文| xvideos亚洲| 精品国产一区在线| 唐人社导航福利精品| 亚洲欧美激情在线| 精品一卡二卡三卡四卡日本乱码| 中文字幕永久在线| 久久国产成人午夜av影院宅| 亚洲福利视频网站| 日本中文字幕精品—区二区| av网址在线看| 国产精品视频在线看| 国产日韩精品久久| 国产又大又黄的视频| 一区在线视频观看| 日韩一级黄色av| v8888av| 日本欧美在线| 色哟哟亚洲精品| 男女私大尺度视频| 在线激情网站| xfplay精品久久| 成人av免费看| 99re只有精品| 久久蜜桃精品| 91成人精品网站| 麻豆91精品91久久久| 免费一区二区| 亚洲国产精品人久久电影| 中文字幕 91| 性欧美xxx69hd高清| 亚洲亚洲精品在线观看| 国产av第一区| 国产资源在线播放| 91视频免费看| 久久99国产精品| 天堂在线中文网| 国产精品一区二区久激情瑜伽 | 亚洲欧美偷拍视频| 7777久久香蕉成人影院| 中文字幕国产精品| 亚洲午夜久久久久久久国产| 国产精品久av福利在线观看| 制服丝袜在线91| 999这里有精品| 成人免费福利| 91精品办公室少妇高潮对白| 欧美日韩在线中文| av最新在线| 精品动漫一区二区| 免费在线观看亚洲视频| eeuss鲁一区二区三区| 亚洲高清视频在线| www.爱色av.com| 97人澡人人添人人爽欧美| 五月激情丁香一区二区三区| 丰满爆乳一区二区三区| sm性调教片在线观看 | 热久久免费视频| 天堂成人在线视频| 欧美美女bb生活片| 精品国产乱码久久久久久蜜柚 | 超碰在线免费看| 成年人性生活视频| 99久久亚洲国产日韩美女| 色嗨嗨av一区二区三区| 中文字幕在线导航| 另类图片综合电影| 欧美日韩电影在线播放| 韩国三级hd中文字幕有哪些| 精品国产一区二| 亚洲第一色在线| 亚洲自拍偷拍图| 欧美中文一区二区| 欧美成人免费全部| 亚洲天堂视频网站| 视频一区免费在线观看| 91丝袜美腿美女视频网站| 人妻妺妺窝人体色www聚色窝| 不卡高清视频专区| 视频一区二区三| 51xtv成人影院| 精品电影在线观看| 香蕉视频xxx| 精品久久ai| 久久精品一偷一偷国产| 日本视频在线观看免费| 三级影片在线观看欧美日韩一区二区| wwww国产精品欧美| 欧美一区二区视频免费观看| 亚洲一级片免费观看| 国产伦理久久久久久妇女| 国产亚洲美女久久| 精品午夜福利视频| 久久久精品网| 国产欧美一区二区三区另类精品| 头脑特工队2在线播放| 亚洲视频一区二区在线观看| 免费av网址在线| 国产一区二区三区亚洲综合| 亚洲午夜女主播在线直播| 日本五十熟hd丰满| 美女视频黄 久久| 欧美精品七区| 欧美aaa免费| 日韩三级免费观看| 青青操在线视频观看| 亚洲尤物影院| 久久久精彩视频| 91香蕉视频污版| 日本少妇高潮喷水xxxxxxx| 成人av国产| 欧美重口另类videos人妖| 成人午夜福利视频| 亚洲人成影院在线观看| 日韩av.com| 国内精品久久久久久久影视简单 | 日日狠狠久久偷偷四色综合免费| 久草视频一区二区| 高清不卡在线观看av| 福利视频免费在线观看| 大胆国模一区二区三区| 另类色图亚洲色图| 国产视频手机在线观看| 国产精品三级电影| 国产又黄又猛的视频| 欧美手机在线| 国产在线久久久| av影片免费在线观看| 欧美特级限制片免费在线观看| 欧美大波大乳巨大乳| 欧美资源在线| 午夜老司机精品| 国产精品高潮久久| 久久成人综合视频| 天天舔天天干天天操| 午夜激情久久久| 中国女人特级毛片| 日本伊人精品一区二区三区观看方式| 日韩亚洲一区在线播放| 免费污视频在线一区| 久久影视电视剧免费网站| 亚洲精品.www| 亚洲丶国产丶欧美一区二区三区| 性欧美丰满熟妇xxxx性久久久| 激情国产一区| 亚洲黄色成人久久久| 欧美天堂在线| 91国产美女视频| 猫咪在线永久网站| 欧美一区二区三区不卡| 国产原创视频在线| 国产精品欧美一区二区三区| 人妻少妇偷人精品久久久任期| 国产精品www994| 日韩欧美一区二区视频在线播放 | 精品人妻一区二区三区潮喷在线| 久久久久久久久久久电影| 日韩av在线中文| 中文字幕乱码亚洲无线精品一区 | www.久久久久久久久久久| 国产精品免费在线视频| 日韩中文字幕一区二区三区| 一级黄色片播放| 玖玖玖免费嫩草在线影院一区| 国产精品狠色婷| 18在线观看的| 色99之美女主播在线视频| 欧美一级淫片aaaaaa| 欧美亚洲国产bt| 69成人免费视频| 亚洲一区二区三区四区精品| av一区二区在线观看| 精品高清视频| 福利精品一区| 日韩免费在线观看视频| av官网在线播放| 宅男在线国产精品| 国产又黄又粗视频| 国产不卡视频在线播放| 日本中文字幕观看| 99精品免费视频| 久久久久99精品成人片| 日韩欧美高清| 日韩精品伦理第一区| 国偷自产视频一区二区久| 成人欧美一区二区三区在线观看| 日本一区二区三区视频在线| 日韩av成人在线观看| 色屁屁www国产馆在线观看| 日韩中文字幕在线观看| 九色视频在线播放| 亚洲欧美精品伊人久久| 久久白虎精品| 亚洲高清一区二| 922tv免费观看在线| 亚洲成人网av| 午夜视频在线播放| 精品久久久久久久久久久院品网| 朝桐光av在线一区二区三区| 欧美福利视频导航| 精品国自产拍在线观看| 欧美精选一区二区| 国产av无码专区亚洲a∨毛片| 欧美午夜精品一区二区三区| 伊人色综合久久久| 欧美色图天堂网| 国产精品毛片一区视频播| 欧美日韩视频在线一区二区| 国产精品区在线观看| 欧美久久一区二区| 亚洲第一成年人网站| 欧美岛国在线观看| 亚洲av激情无码专区在线播放|