virtual-dom

編程中永恒不變的兩大主題:效率和質(zhì)量

歷史背景:web開發(fā)幾個階段

  1. 石器時代
    web頁面展示簡單的靜態(tài)圖文信息膜楷,那個時候還沒有FE(前端)柴底,通常是一個叫美工的妹子兼職陋守。javascript腳本做的做多的事情可能就是表單提交。

  2. 青銅時代
    大概2005年的時候捅膘,AJAX 大火翘地,你的網(wǎng)站沒有局部更新太low了申尤。
    也是這個時候,前端這個職業(yè)開始萌芽衙耕。

  3. 白銀時代
    后續(xù)的幾年了昧穿,javascript如火如荼。AJAX大規(guī)模的普及橙喘,網(wǎng)站上各種炫酷的輪播时鸵,跑馬燈等特效開始出現(xiàn)。2006年jquery誕生厅瞎,開始了它將近10年的光輝之路饰潜。
    2008年nodejs發(fā)布,它將在不久的將來將前端推進(jìn)全新的時代和簸。
    同時彭雾,移動智能手機和桌面軟件開始流行,也為前端后面的方向快速發(fā)展埋下時代伏筆比搭。

  4. 黃金時代
    2012年左右 Bankbone.js 冠跷、Angularjs 開始展露頭角,把其他軟件編程領(lǐng)域中編程模式帶到前端領(lǐng)域中身诺。前端已經(jīng)開始承擔(dān)越來越多的開發(fā)任務(wù),代碼量和業(yè)務(wù)復(fù)雜度不斷增加抄囚。

  5. 鉑金時代
    2014年左右霉赡,伴隨著互聯(lián)網(wǎng)+的概念大行其道。React幔托、Vue等前端UI框架迅速爆紅穴亏,數(shù)據(jù)驅(qū)動蜂挪、前后端分離等理念得到越來越多青睞。

以上總結(jié)屬于個人的看法嗓化,肯定有失偏頗棠涮,但對于前端的職業(yè)化、規(guī)拇谈玻化严肪、工程化理解 影響不大。

前端開發(fā)越來越復(fù)雜谦屑。

什么是Virtual DOM

使用普通的javascript對象映射原生DOM Tree驳糯。

解決什么問題?

  1. 大型前端應(yīng)用中氢橙,大量的DOM操作變的難以維護(hù):結(jié)合數(shù)據(jù)驅(qū)動UI 的思想酝枢,能夠很好的解耦數(shù)據(jù)和DOM 操作。
  2. 效率:能夠兼顧開發(fā)效率和維護(hù)成本(數(shù)據(jù)驅(qū)動視圖變化悍手,省去了手動的操作dom 的繁雜過程)的同時 保證一定的高效性(不一定比原生手寫dom更新操作 高效)
  3. 有Virtual DOM 這個脫離了DOM 接口的限制帘睦,使得跨平臺有了新的解決方案。理論上只要能夠?qū)崿F(xiàn)了Virtual DOM 標(biāo)準(zhǔn)的任何平臺(包含js解析引擎)都能運行javascript應(yīng)用坦康。

內(nèi)部技術(shù)原理

  1. 創(chuàng)建virtual dom
  2. 比較兩樹官脓,找出更新點
    • 經(jīng)常進(jìn)行的DOM操作
      ① 替換節(jié)點
      ② 節(jié)點刪除
      ③ 新增節(jié)點
      ④ 屬性增刪改
      ⑤ 改變文本節(jié)點的內(nèi)容

    • diff 算法過程
      ① 如果新節(jié)點 為空, 則 刪除節(jié)點
      ② 如果新老節(jié)點 都是文本節(jié)點涝焙, 替換文本內(nèi)容
      ③ 如果老節(jié)點為空卑笨,新節(jié)點不為空,則插入新節(jié)點
      ④ 如果新節(jié)點和老節(jié)點 類型不同仑撞,則替換
      ⑤ 如果新節(jié)點和老節(jié)點類型相同赤兴,就更新屬性,并且對齊子節(jié)點進(jìn)行對比隧哮。
      ⑥ 針對子節(jié)點比較的話桶良,使用key來進(jìn)行優(yōu)化, 參考:https://github.com/livoras/list-diff

      參考https://github.com/livoras/blog/issues/13

  1. 更新操作
    根據(jù) diff算法搜集的patchs,進(jìn)行對應(yīng)的更新操作沮翔。

源碼解讀

https://github.com/livoras/simple-virtual-dom/

JSX 語法

如果直接使用js來使用virtual dom 庫陨帆,效率和后期維護(hù)將非常困難。
前端開發(fā)人員書寫UI 界面 最熟悉的還是使用 html語法結(jié)構(gòu)采蚀,JSX 就非常棒了疲牵。
它允許我們像使用html那樣來實現(xiàn)UI界面,最終通過運行前編譯預(yù)處理成js代碼榆鼠,或者提供運行時解析器動態(tài)解析JSX 來達(dá)到正確運行的目的纲爸。
具體參考:https://facebook.github.io/jsx/

使用babel將jsx編譯成javascript virtual dom
https://babeljs.io/docs/en/babel-plugin-transform-react-jsx/

參考

  1. https://www.w3cplus.com/javascript/understand-the-Virtual-DOM.html
  2. https://github.com/snabbdom/snabbdom
  3. Understanding the Virtual DOM
  4. Matt-Esch/virtual-dom
  5. https://github.com/livoras/simple-virtual-dom/
  6. https://facebook.github.io/jsx/
  7. https://babeljs.io/docs/en/babel-plugin-transform-react-jsx/
  8. 50行代碼實現(xiàn)Virtual DOM
  9. 如何實現(xiàn)一個 Virtual DOM 算法
  10. 網(wǎng)上都說操作真實 DOM 慢,但測試結(jié)果卻比 React 更快妆够,為什么
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末识啦,一起剝皮案震驚了整個濱河市负蚊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌颓哮,老刑警劉巖家妆,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異冕茅,居然都是意外死亡伤极,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進(jìn)店門嵌赠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來塑荒,“玉大人,你說我怎么就攤上這事姜挺〕菟埃” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵炊豪,是天一觀的道長凌箕。 經(jīng)常有香客問我,道長词渤,這世上最難降的妖魔是什么牵舱? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮缺虐,結(jié)果婚禮上芜壁,老公的妹妹穿的比我還像新娘。我一直安慰自己高氮,他們只是感情好慧妄,可當(dāng)我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剪芍,像睡著了一般塞淹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上罪裹,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天饱普,我揣著相機與錄音,去河邊找鬼状共。 笑死套耕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的口芍。 我是一名探鬼主播箍铲,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鬓椭!你這毒婦竟也來了颠猴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤小染,失蹤者是張志新(化名)和其女友劉穎翘瓮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裤翩,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡资盅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了踊赠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呵扛。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖筐带,靈堂內(nèi)的尸體忽然破棺而出今穿,到底是詐尸還是另有隱情,我是刑警寧澤伦籍,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布蓝晒,位于F島的核電站,受9級特大地震影響帖鸦,放射性物質(zhì)發(fā)生泄漏芝薇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一作儿、第九天 我趴在偏房一處隱蔽的房頂上張望洛二。 院中可真熱鬧,春花似錦攻锰、人聲如沸晾嘶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽变擒。三九已至,卻和暖如春寝志,著一層夾襖步出監(jiān)牢的瞬間娇斑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工材部, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毫缆,地道東北人。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓乐导,卻偏偏與公主長得像苦丁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子物臂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,747評論 2 361