傳統的前端編程方式是命令式編程,即直接操縱DOM,告訴瀏覽器該怎麼幹。這樣的問題就是,大量的代碼被用於操作DOM元素,且代碼可讀性差,可維護性低。
而React、Vue這些數據驅動的前端框架的出現,將命令式編程變爲了函數式編程,從而大幅提升代碼的可讀性、可維護性。
這些框架縱然摒棄了直接操作DOM,我們只要關心數據的變動,DOM的操作由框架完成。但是這樣做帶來了一些性能問題。
在最原始的情況下,框架一旦發現數據發生了變動就對整個頁面進行更新。這樣的做法效率低下,因爲數據的變動而導致的頁面變動很可能只是局部的,直接對整個頁面進行更新造成了不必要的性能消耗。
所以人們很自然的就會想到將因數據變動而新生成的DOM結構與已經顯示出來的DOM結構進行比較,找出兩者的不同處,再對這些不同進行重新渲染即可。有的放矢,從而提升性能。
而那個僅在內存中未顯示出來的DOM結構就是所謂的虛擬DOM,找出兩者不同的算法就是Diff算法。
不過需要注意的是,虛擬DOM和Diff算法的出現是爲了解決由命令式編程轉變爲函數式編程、數據驅動後所帶來的性能問題的。換句話說,直接操作DOM的性能並不會低於虛擬DOM和Diff算法,甚至還會優於。
這麼說的原因是因爲Diff算法的比較過程,比較是爲了找出不同從而有的放矢的更新頁面。但是比較也是要消耗性能的。而直接操作DOM就是有的放矢,我們知道該更新什麼不該更新什麼,所以不需要有比較的過程。所以直接操作DOM效率可能更高。