首頁 web前端 js教程 聊對現代前端框架的認知

聊對現代前端框架的認知

Sep 10, 2018 pm 04:14 PM
js 前端 框架

本章聊聊對現代前端框架的認知,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

那為什麼現在人們需要選擇各種框架了呢?

其實之所以現在我們需要選擇框架,本質上是因為我們面臨的需求改變了。大家一定都明白如果我們只寫一個純粹展示資訊的頁面,沒有任何互動功能的頁面,其實即便是現在,我們也是不需要選擇框架的,我們只需要寫幾行CSS和HTML就可以完成任務。所以是因為我們面臨的需求變得複雜了,我們的應用程式經常需要在運行時做一些互動。

這裡面有三個很重要的字我標了粗體,叫做運行時(Runtime)。現代的前端開發,我們開發的應用經常需要在運行時來做一些交互,這些交互在早期只是個幻燈片或者Tab切換下拉菜單等一些簡單的交互,這些交互用jQuery實現完全沒什麼問題。但現代的前端我們的目標是用Web去PK原生應用,去和Native進行PK。

那這個時候我們會發現用jQuery來開發應用,我們的程式碼變得很難以維護,那為什麼使用現代框架例如Vue,React等就變得容易維護了呢?

Vue和jQuery之間的差異只有一點,宣告式與命令式。

我們可以想一下,我們用jQuery去操作DOM的目的是什麼?是為了局部更新視圖,換句話說是為了局部重新渲染。

jQuery是命令式的操作DOM,命令式的局部更新視圖,而現代主流框架Vue,React,Angular等都是聲明式的,聲明式的局部更新視圖。

為什麼宣告式的操作DOM就可以讓應用程式變得好維護了呢?

弄清楚這個問題首先我們先簡單介紹下什麼是命令式,什麼是宣告式。

命令式

命令式,像jQuery,我們都是想幹什麼然後就去乾就完了,例如下面的程式碼:

$('.box')
  .append(&#39;<p>Test</p>&#39;)
  .xxx()
  .yyy()
  .jjj()
  ...
登入後複製

命令式就是想幹什麼就直接去呼叫方法直接乾就完了,簡單直接粗暴。

試想一個很簡單的場景,例如toggle效果,點選一個按鈕,切換顏色。

用命令式寫,我們肯定是這樣寫,如果目前是什麼顏色就讓它變成另一個顏色。

如果你仔細思考,其實這裡面可以細分成兩個行為,一個是對狀態判斷,一個是操作DOM。

那什麼是宣告式? ?

聲明式

聲明式是透過描述狀態與檢視之間的對應關係,然後透過這樣的一個映射關係來操作DOM ,或者說具體點是用這樣的映射關係來產生一個DOM節點插入到頁面去。例如Vue中的模板。模板的作用就用來描述狀態與DOM的映射關係。

同樣的場景,我們用Vue中的模板來實現,當我們用模板描述了映射關係之後,我們在點擊按鈕時,我們只需要對顏色這個變數進行修改就可以完成需求。

看到差別了麼?

仔細思考下,用Vue來實現同樣的需求,如果細分來看,我們在邏輯上只有一個行為,只有狀態。而jQuery是兩個行為,狀態 DOM操作。

所以宣告式為什麼可以簡化維護應用程式程式碼的複雜度?

因為它讓我們可以把關注點只放在狀態的維護上。這樣一來當應用複雜後,其實我們的思維,我們管理程式碼的方式只在狀態上,所有的DOM操作都不用關心了,可以說大大降低程式碼維護的複雜度。

我們不再需要關注怎麼操作DOM,因為框架會幫我們自動去做,我們只專注在狀態就好了。

但是如果應用程式特別特別複雜,我們會發現即便是我們只關注狀態的維護,依然很難,即便只維護狀態也很難,所以才出現了Vuex,Redux等技術解決方案。

什麼是渲染?

經過前面的介紹,你會發現其實現代主流框架要解決的最本質的問題依然是渲染,只是不同框架之間的解決方案有差異,那麼什麼是渲染?

現在開發前端,我們的應用在運行時需要不斷的進行各種交互,現代主流框架讓我們把關注點放在了狀態的維護上,也就是說應用在運行時,應用內部的狀態會不斷的改變。

而將狀態產生DOM插入到頁面展示在使用者介面上,這套流程叫做渲染。

現代前端框架對渲染的處理

當應用程式在運行時,內部狀態會不斷的變化,這時用戶頁面的某個局部區域需要不停的重新渲染。

如何重新渲染?

最簡單粗暴的解決方式,也是我平常在沒有使用任何框架的專案裡寫的一些簡單的功能時最常用的方式是用狀態生成一份新的DOM,然後用innerHTML把舊DOM替換了。

我寫的小功能塊用這種方式沒問題,因為功能涉及到的DOM標籤少,狀態變的時候,幾乎就是我這個功能塊的所有標籤都需要變,所以即使是用innerHTML也不會有太大的效能浪費,是在可接受範圍內的。

但是框架不行,框架如果用innerHTML這樣去替換,那就不是局部重新渲染了,而是整個頁面整體刷新,這性質就變了,那麼框架如何做到局部重新渲染?

解決這個問題,需要一些技術方案來解決,可以是VirtualDOM,但不一定必須是VirtualDOM,也可以是Angular中的髒檢測的流程,也可以是細粒度的綁定,像Vue1.0就是使用細粒度的綁定來實現的。

什麼是細粒度綁定?

細粒度的綁定意思是說,當某個狀態,與之綁定的是頁面中的某個特定的標籤。就是說,如果模板中有十個標籤使用了某個變量,那麼與這個變數所綁定的就是10個具體的標籤。

相對比較React和Angular粒度都比較粗,他們的變化偵測其實不知道具體哪個狀態變量,所以需要一個暴力的比對,比對後才知道需要對視圖中的哪個部分進行更新。

而Vue這種細粒度的綁定其實在狀態改變的那一個瞬間,立刻就知道哪個狀態改變了,而且還知道有哪些具體的標籤使用了這個狀態,那麼事情就變的簡單的多了,直接把與這個狀態所綁定的這些具體的標籤進行更新就能達到局部更新的目的。

但這樣做其實也有一定的代價,因為粒度太細,會有一定的依賴追蹤的開銷。所以Vue2.0開始採取了一個折衷的方案,就是把綁定調整為中等粒度。

一個狀態對應某個元件,而不再是具體標籤,這樣做有一個好處是可以大幅降低依賴的數量,畢竟元件的數量與DOM中的特定標籤比,數量要少的多。但這樣就需要多一個操作,當狀態改變只通知到元件,那麼元件內部如何知道具體更新哪個DOM標籤? ?

答案是VirtualDOM。

也就是說,當粒度調整為中等之後,需要多一個操作就是在元件內部使用VirtualDOM去重新渲染。

Vue很聰明地透過變化來偵測 VirtualDOM這兩種技術方案,提升了框架運作的效能問題。

所以說,Vue2.0引入VirtualDOM並不是因為VirtualDOM有多好,而是恰好VirtualDOM結合變化偵測可以將綁定調整成中等粒度來解決依賴追蹤的開銷問題。

關於變化偵測我專門寫過文章來介紹Vue是如何實現變化偵測的。傳送門。

所以變化偵測的方式,在某種程度上就已經決定了框架如何進行渲染。

關於VirtualDOM的實作原理我寫過一個PPT,有興趣的可以看看,傳送門。

還有一個是模板編譯,其實前面對於模板編譯這個問題並沒有說太多,模板的作用是描述狀態與DOM之間的映射關係,透過模板可以編譯出一個渲染函數,執行這個渲染函數可以得到VirtualDOM中所提供的VNode,事實上你看過我前面介紹VirtualDOM原理的PPT你就會知道VirtualDOM對節點進行diff其實是對VNode進行diff。關於模板編譯的實作原理我特別寫過一篇文章介紹過,傳送門。

總結

現在的前端我個人感覺有點浮躁,很多人都在追新,每天關註一些今天出了一個新特性,明天出了一個新框架什麼的,對於這些我是贊成的,但是我更希望在追新的同時,要看到它的本質。所有技術解決方案的終極目標都是在解決問題,都是先有問題,然後在有解決方案,解決方案可能並不完美,可能解決方案有很多種,那麼他們之間都有哪些優缺點?解決問題的同時各自做了哪些權衡和取捨?我們要透過現像看本質才不至於被表面所迷惑。




以上是聊對現代前端框架的認知的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何評估Java框架商業支援的性價比 如何評估Java框架商業支援的性價比 Jun 05, 2024 pm 05:25 PM

評估Java框架商業支援的性價比涉及以下步驟:確定所需的保障等級和服務等級協定(SLA)保證。研究支持團隊的經驗和專業知識。考慮附加服務,如昇級、故障排除和效能最佳化。權衡商業支援成本與風險緩解和提高效率。

PHP 框架的學習曲線與其他語言框架相比如何? PHP 框架的學習曲線與其他語言框架相比如何? Jun 06, 2024 pm 12:41 PM

PHP框架的學習曲線取決於語言熟練度、框架複雜性、文件品質和社群支援。與Python框架相比,PHP框架的學習曲線較高,而與Ruby框架相比,則較低。與Java框架相比,PHP框架的學習曲線中等,但入門時間較短。

PHP 框架的輕量級選項如何影響應用程式效能? PHP 框架的輕量級選項如何影響應用程式效能? Jun 06, 2024 am 10:53 AM

輕量級PHP框架透過小體積和低資源消耗提升應用程式效能。其特點包括:體積小,啟動快,記憶體佔用低提升響應速度和吞吐量,降低資源消耗實戰案例:SlimFramework創建RESTAPI,僅500KB,高響應性、高吞吐量

golang框架文件最佳實踐 golang框架文件最佳實踐 Jun 04, 2024 pm 05:00 PM

編寫清晰全面的文件對於Golang框架至關重要。最佳實踐包括:遵循既定文件風格,例如Google的Go程式設計風格指南。使用清晰的組織結構,包括標題、子標題和列表,並提供導覽。提供全面且準確的信息,包括入門指南、API參考和概念。使用程式碼範例說明概念和使用方法。保持文件更新,追蹤變更並記錄新功能。提供支援和社群資源,例如GitHub問題和論壇。建立實際案例,如API文件。

如何為不同的應用場景選擇最佳的golang框架 如何為不同的應用場景選擇最佳的golang框架 Jun 05, 2024 pm 04:05 PM

根據應用場景選擇最佳Go框架:考慮應用類型、語言特性、效能需求、生態系統。常見Go框架:Gin(Web應用)、Echo(Web服務)、Fiber(高吞吐量)、gorm(ORM)、fasthttp(速度)。實戰案例:建構RESTAPI(Fiber),與資料庫互動(gorm)。選擇框架:效能關鍵選fasthttp,靈活Web應用選Gin/Echo,資料庫互動選gorm。

Java框架學習路線圖:不同領域中的最佳實踐 Java框架學習路線圖:不同領域中的最佳實踐 Jun 05, 2024 pm 08:53 PM

針對不同領域的Java框架學習路線圖:Web開發:SpringBoot和PlayFramework。持久層:Hibernate和JPA。服務端響應式程式設計:ReactorCore和SpringWebFlux。即時計算:ApacheStorm和ApacheSpark。雲端運算:AWSSDKforJava和GoogleCloudJava。

Golang框架學習過程中常見的迷思有哪些? Golang框架學習過程中常見的迷思有哪些? Jun 05, 2024 pm 09:59 PM

Go框架學習的迷思有以下5種:過度依賴框架,限制彈性。不遵循框架約定,程式碼難以維護。使用過時庫,帶來安全和相容性問題。過度使用包,混淆程式碼結構。忽視錯誤處理,導致意外行為和崩潰。

了解React的主要功能:前端視角 了解React的主要功能:前端視角 Apr 18, 2025 am 12:15 AM

React的主要功能包括組件化思想、狀態管理和虛擬DOM。 1)組件化思想允許將UI拆分成可複用的部分,提高代碼可讀性和可維護性。 2)狀態管理通過state和props管理動態數據,變化觸發UI更新。 3)虛擬DOM優化性能,通過內存中的DOM副本計算最小操作更新UI。

See all articles