1. 程式人生 > >8分鐘為你詳解React、Angular、Vue三大前端技術

8分鐘為你詳解React、Angular、Vue三大前端技術

【引言】

當前世界中,技術發展非常迅速並且變化迅速,開發者需要更多的開發工具來解決不同的問題。本文就對於當下主流的前端開發技術React、Vue、Angular這三個框架做個相對詳盡的探究,目的是為了解開這些前端技術的面紗,看看各自的廬山真面目。

【React】

React(也被稱為React.js或ReactJS)是一個用於構建使用者介面的JavaScript庫。它由Facebook和一個由個人開發者和公司組成的社群來維護。

React可以作為開發單頁或移動應用的基礎。然而,React只關注向DOM渲染資料,因此建立React應用通常需要使用額外的庫來進行狀態管理和路由,Redux和React Router分別是這類庫的例子。

基本用法

下面是一個簡單的React在HTML中使用JSX和JavaScript的例子。

Greeter函式是一個React元件,它接受一個屬性問候語。變數App是Greeter元件的一個例項,其中問候語屬性被設定為 "Hello World!"。然後,ReactDOM.render方法將我們的Greeter元件渲染在DOM元素(id為 myReactApp)中。

在web瀏覽器中顯示時,結果將是:

顯著特點

元件化

React程式碼由稱為元件的實體組成。元件可以使用React DOM庫渲染到DOM中的一個特定元素。當渲染一個元件時,可以傳入被稱為 "props "的值。

React中宣告元件的兩種主要方式是通過功能函式元件和基於類的元件。

功能函式元件

功能元件是用一個函式宣告,用來返回一些JSX。

類元件

基於類的元件是使用ES6類來宣告的。它們也被稱為 "有狀態 "元件,因為它們的狀態可以在整個元件中保持,並且可以通過props傳遞給子元件。

虛擬 DOM

另一個值得注意的特點是React使用了虛擬文件物件模型,也就是虛擬DOM。React建立了一個記憶體中的資料結構快取,計算得出變化差異,只渲染實際變化的子元件, 從而高效地更新瀏覽器顯示的DOM。

生命週期方法

生命週期方法是指在元件的生命週期內,允許在設定的點執行程式碼的hooks處理函式。

  • shouldComponentUpdate允許開發者在不需要渲染的情況下,通過返回false來防止不必要的重新渲染元件。
  • componentDidMount是在元件 "掛載 "後呼叫的(元件已經在使用者介面中建立了,通常是通過將其與DOM節點關聯起來)。這通常用於通過API從遠端資料來源觸發資料載入。
  • componentWillUnmount是在元件被拆解或 "解掛 "之前立即呼叫的。這通常用於清除元件的資源依賴關係,這些依賴關係不會隨著元件的解除安裝而簡單地被移除(例如,移除任何與元件相關的setInterval()例項,或者因為元件的存在而在 "文件 "上設定的 "eventListener")。
  • render是最重要的生命週期方法,也是任何元件中唯一必須存在的方法。它通常在每次更新元件的狀態時都會被呼叫。

JSX

JSX,即JavaScript XML,是對JavaScript語言語法的擴充套件。JSX在外觀上類似於HTML,它提供了一種開發者熟悉的語法結構化元件渲染的方法。React元件通常是使用JSX編寫的,儘管不一定非要使用JSX(元件也可以用純JavaScript編寫)。JSX類似於Facebook為PHP建立的另一種名為XHP的擴充套件語法。

JSX程式碼的一個例子:

巢狀元素

同一層次上的多個元素需要被包裹在一個容器元素中,如上圖中的<div>元素。

屬性

JSX提供了一系列的元素屬性,旨在對應HTML提供的屬性。這些自定義的屬性也可以傳遞給元件,所有的屬性都會被元件作為props接收。

JavaScript表示式

JavaScript表示式(但不是語句)可以在JSX內部通過大括號{}使用。

上面程式碼的顯示結果是:

條件語句

If-else語句不能在JSX中使用,但可以使用條件表示式來代替。下面的例子當i為1時將 { i === 1 ? 'true' : 'false' } 呈現為字串 'true'。

結果會是:

函式和JSX可以用於條件表示式中:

結果會是:

用JSX編寫的程式碼需要被Babel等工具進行轉換以後才能被Web瀏覽器所理解,這種處理一般是在軟體構建過程中進行的,然後再部署構建後的應用程式。

超越HTML的架構

React的基本架構不僅僅適用於在瀏覽器中渲染HTML。例如,Facebook有動態圖表,可以渲染到<canvas>標籤,而Netflix和PayPal使用通用載入,在伺服器和客戶端上渲染相同的HTML。

React Hooks

Hooks是讓開發者從函式元件中 "鉤入"React狀態和生命週期特性的函式。它們使程式碼具有更強的可讀性且更易理解。Hooks並不在類元件內工作,它的終極目標是在React中消除類元件的存在。

React提供了一些內建的Hooks,如useState、useContext、useReducer和useEffect等。它們都在Hooks API參考書中做了說明。使用最多的是useState和useEffect,分別在React元件中控制狀態和檢測狀態變化。

Hooks規則

Hooks也有一些規則,在使用Hooks之前必須遵循這些規則:

  • 鉤子只能在頂層呼叫(不能在迴圈或if語句中呼叫)。
  • 鉤子只能在React函式元件中呼叫,不能在普通函式或類元件中呼叫。

定製Hooks

構建自己的Hooks,也就是所謂的自定義Hooks,可以讓你把元件邏輯提取到可重用的函式中。自定義鉤子是一個名稱以 "use "開頭的JavaScript函式,它可以呼叫其他的鉤子。鉤子的規則也適用於它們。

常用術語

React並沒有試圖提供一個完整的 "應用程式庫"。它是專門為構建使用者介面而設計的,因此並不包括許多一些開發者認為構建應用程式所需的工具。這使得開發者可以選擇任何一個庫來完成諸如執行網路訪問或本地資料儲存等任務。這種情況也就決定了React技術在建立網頁應用時標準無法統一。

Flux架構的使用

為了支援React的單向資料流的概念(與AngularJS/Angular的雙向資料流形成對比),Flux架構是流行的模型-檢視-控制器(MVC)架構的具有代表性的替代方案。Flux的特點是,資料動作通過中央排程器傳送到一個儲存倉庫,而對儲存倉庫資料的變化會被傳送回檢視。當與React一起使用時,這種傳送是通過元件屬性完成的。

Flux可以被認為是觀察者模式的一個變種。

Flux架構下的React元件不應該直接修改傳遞給它的任何props,而是應該傳遞迴調函式,這些回撥函式可以建立由排程器傳送的資料動作來修改儲存倉庫。資料動作是一個物件,其職責是描述已經發生的事情:例如,一個數據動作描述的是一個使用者 "follow"另一個使用者。它可能包含如下資料:

使用者ID,

目標使用者ID,

以及USER_FOLLOWED_ANOTHER_USER列舉型別。

儲存倉庫,是一個數據模型,可以根據從排程器接收到的資料動作來改變自己。

 

這種模式有時被表述為 "屬性向下流動,資料動作向上流動"。自Flux誕生以來,Flux的許多實現被創造出來,其中最著名的是Redux,它的特點是單一的儲存倉庫,通常被稱為單一的資料真相源。

歷史

React是由Facebook的軟體工程師Jordan Walke建立的,受PHP的HTML元件庫XHP的啟發,釋出了React的早期原型,名為 "FaxJS",。它於2011年首次部署在Facebook的News Feed上,後來於2012年部署在Instagram上。2013年5月在美國JSConf大會上開源。

React Native是2015年2月在Facebook的React Conf上宣佈的,2015年3月開源的React Native,實現了原生的Android、iOS和UWP開發。

2017年4月18日,Facebook宣佈了React Fiber,這是React庫的一個新的核心演算法,用於構建使用者介面,React Fiber將成為React庫未來任何改進和功能開發的基礎。

2017年9月26日,React 16.0正式對外發布。

2019年2月16日,React 16.8正式對外發布,該版本引入了React Hooks。

常用命令

建立工程:

npx create-react-app my-app

 

開發環境執行:

npm start

 

生產環境打包:

npm run build

 

【官方網站】

http://reactjs.org/

【最新版本】

16.13.1於2020年3月19日

【授權】

MIT License

【Angular】

Angular(通常被稱為 "Angular 2+"或 "Angular v2及以上版本")是一個基於TypeScript的開源Web應用框架,由Google的Angular團隊和由個人以及企業組成的社群領導。 Angular是由構建AngularJS的同一個團隊從零開始重寫的。

Angular和AngularJS的區別

  • Angular沒有 "Scope"或控制器的概念,相反,它使用元件的層次結構作為其主要的架構特徵。
  • Angular有不同的表示式語法,重點是"[]"用於屬性繫結,"() "用於事件繫結
  • 模組化 - 許多核心功能已轉移到模組上
  • Angular推薦使用微軟的TypeScript語言,它引入了以下特性。

(1)靜態鍵入,包括Generics

(2)註解

  • TypeScript是ECMAScript 6 (ES6)的超集,向後相容ECMAScript 5(即:JavaScript)。
  • 動態載入
  • 非同步模板編譯
  • 由RxJS提供的迭代回撥。RxJS限制了狀態的可見性和除錯,但這些問題可以通過像ngReact或ngrx這樣的反應式附加元件來解決。
  • 支援Angular Universal,可以在伺服器上執行Angular應用程式。

歷史

命名

最初,AngularJS的重寫被稱為 "Angular 2",但這導致了開發人員的迷糊。為了澄清,團隊宣佈,每個框架使用不同的術語,其中 "AngularJS "指的是1.X版本, "Angular " 指的是2及以上版本。

版本2

Angular 2.0在2014年10月22-23日的ng-Europe大會上宣佈。2.0版本的劇烈變化在開發者中引起了相當大的爭議。

2015年4月30日,Angular開發者宣佈Angular 2從Alpha轉為開發者預覽版,2015年12月Angular 2轉為Beta版,2016年5月釋出了第一個釋出候選版本,2016年9月14日釋出了最終版本。

版本4

2016年12月13日Angular 4釋出,跳過了3,避免了因路由器包的版本錯位導致的混亂,當時已經發布的版本為v3.3.0。最終版本於2017年3月23日釋出,Angular 4向後相容Angular 2。

Angular 4.3版本是一個小版本,它是4.x.x版本的替換版本。

4.3版本的功能

  • 介紹了HttpClient,一個更小、更容易使用、更強大的HTTP請求庫。
  • 為守護者和解析器提供了新的路由器生命週期事件。四個新事件。GuardsCheckStart、GuardsCheckEnd、ResolveStart、ResolveEnd加入了現有的NavigationStart等生命週期事件集。
  • 有條件地禁用動畫。

版本5

Angular 5於2017年11月1日釋出,Angular 5的主要改進包括支援漸進式Web應用、構建優化器以及與Material Design相關的改進。

版本6

Angular 6於2018年5月4日釋出。這個版本,關注的重點不在於底層框架,更多的是工具鏈,以及讓Angular在未來的更新和升級更加容易,比如:ngupdate、ng add、Angular元素、Angular Material+CDK元件、Angular Material入門元件、CLI工作區、庫支援、樹形搖動提供者、動畫效能提升、RxJS v6。

版本7

Angular 7已於2018年10月18日釋出。更新內容涉及到應用效能、Angular Material & CDK、虛擬滾動、Selects的可訪問性改進、現在支援自定義元素使用Web標準的內容投影,以及關於Typescript 3.1、RxJS 6.3、Node 10(仍支援Node 8)的依賴性更新。

版本8

Angular 8已於2019年5月28日釋出。具有所有應用程式碼的差異化載入、惰性路由的動態匯入、Web工作者、TypeScript 3.4支援、以及Angular Ivy作為預覽版可配置使用。Angular

Ivy預覽包括:

  • 生成的程式碼,在執行時更容易閱讀和除錯。
  • 更快的重建時間
  • 減少有效載荷
  • 改進了模板型別檢查
  • 向後相容

版本9

Angular 9已於2020年2月6日釋出。第9版在預設情況下使用Ivy編譯器。Angular可以與TypeScript 3.6和3.7相容。除了數百個bug修復之外,Ivy編譯器和執行時還提供了許多優勢:

  • 更小的軟體包
  • 更快的測試
  • 更好的除錯
  • 改進的CSS類和樣式繫結
  • 改進的型別檢查
  • 改善了構建錯誤
  • 改善了構建時間,預設開啟AOT功能
  • 提高國際化功能

特點

元件化

一個元件例子

Html部分

Typescript部分

路由

資料管理

定義服務類

呼叫服務類

常用命令

從終端上,全域性安裝Angular CLI:

npm install -g @angular/cli

使用 ng new 命令建立一個新的 Angular CLI 工作區:

ng new my-project-name

 

開發環境執行:

ng serve

 

生產環境打包:

ng build --prod

【官方網站】

https://angular.io/

【最新版本】

9.1.2於2020年4月15日

【授權】

MIT License

【Vue】

Vue.js(通常被稱為Vue;發音為/vjuː/,類似於 "view")是一個開源的Model-view-viewmodel JavaScript框架,用於構建使用者介面和單頁面應用程式。它由Evan You建立,由他和來自Netlify和Netguru等多家公司的核心成員維護。

概述

Vue.js的特點是,它採用了一個漸進式的架構,專注於宣告式渲染和元件合成。複雜應用所需的高階功能,如路由、狀態管理和構建工具等,都是通過官方維護的支援庫和包提供的,其中Nuxt.js是最受歡迎的解決方案之一。

Vue.js可以讓你用稱為指令(directives)的HTML屬性來擴充套件HTML。

歷史

Vue是由Evan You建立的。在Google工作期間,他使用AngularJS技術參與了多個專案的開發的,之後建立了Vue。他後來總結了自己的思考過程。"我想,如果我可以把AngularJS真正優秀的部分提取出來,然後構建一些輕量級的東西,會怎麼樣呢?" 專案的第一個版本原始碼提交日期是2013年7月,Vue在2014年2月首次釋出。

特點

元件化

Vue 元件擴充套件了基本的 HTML 元素來封裝可重用的程式碼。從高層次的角度看,元件是Vue編譯器附加行為的自定義元素。在Vue中,元件本質上就是一個帶有預設選項的Vue例項。下面的程式碼片段包含了一個Vue元件的例子。該元件顯示了一個按鈕,並打印出按鈕被點選的次數。

模板

Vue使用基於HTML的模板語法,允許將渲染的DOM繫結到Vue例項的底層資料。所有 Vue 模板都是有效的 HTML,可以被符合規範的瀏覽器和 HTML 解析器解析。Vue 將模板編譯成虛擬 DOM 渲染函式。虛擬文件物件模型(或 "DOM")允許Vue在更新瀏覽器之前在其記憶體中渲染元件。結合反應式系統,Vue能夠計算出需要重新渲染的元件的最小數量,並在App狀態發生變化時,啟動最小量的DOM操作。

Vue使用者可以使用模板語法,也可以選擇使用JSX直接編寫渲染函式,渲染函式允許從軟體元件中構建應用程式。

反應式系統

Vue的特點是採用了反應式系統,它使用純JavaScript物件和優化的重渲染。每個元件在渲染過程中都會跟蹤其反應式的依賴關係,因此係統可以精確地知道什麼時候重新渲染,以及哪些元件需要重新渲染。

變換效果

當從DOM中插入、更新或刪除專案時,Vue提供了多種方法來部署變換效果。這包括了以下工具:

  • 自動應用CSS變換和動畫的類
  • 整合第三方CSS動畫庫,如Animate.css等。
  • 在變換hooks期間,使用JavaScript直接操作DOM。
  • 整合第三方JavaScript動畫庫,如Velocity.js等。

當在變換元件中的元素被插入或移除時,會出現這樣的情況:

  • Vue會自動檢測到目標元素是否應用了CSS變換或動畫。如果有,CSS變換類將在適當的時間新增/刪除。
  • 如果變換元件提供了JavaScript hooks,這些hooks將在適當的時間被呼叫。
  • 如果沒有檢測到CSS變換/動畫,並且沒有提供JavaScript hooks,那麼插入和/或移除的DOM操作將在下一幀中立即執行。

路由

單頁面應用程式(SPA)的一個傳統缺點是無法分享到特定網頁中的確切 "子 "頁面的連結。由於SPA只向用戶提供一個基於URL的伺服器響應(它通常服務於index.html或index.vue),因此通常情況下,將某些螢幕作為書籤或分享到特定部分的連結是很困難的,甚至是不可能的。為了解決這個問題,許多客戶端路由器用 "hashbang"(#!)來劃分動態URL,例如http://page.com/#!/。然而,在HTML5中,大多數現代瀏覽器都支援不使用hashbang的路由。

Vue提供了一個介面,可以根據當前的URL路徑來改變頁面上顯示的內容 – 可以有多種方式(無論是通過電子郵件連結、重新整理還是頁面內連結)。此外,當某些瀏覽器事件(如點選)發生在按鈕或連結上時,使用前端路由器可以有意識地轉換瀏覽器路徑。Vue本身並沒有自帶前端路由。但開源的 "vue-router "包提供了一個API來更新應用程式的URL,支援返回按鈕(導航歷史記錄),並支援電子郵件密碼重置或電子郵件驗證連結的認證URL引數。它支援將巢狀路由對映到巢狀元件,並提供精細化的過渡控制。添加了vue-router後,元件只需對映到它們所屬的路由,父/根路由必須指明子路由的渲染位置。

上面的程式碼:

  • 在http://websitename.com/user/<id>中設定一個前端路徑。
  • 這將在(const User...)中定義的User元件中呈現。
  • 允許使用者元件使用$route物件的params鍵輸入使用者的特定ID:$route.params.id。
  • 這個模板(根據傳遞到路由器中的引數變化)將被渲染到DOM的div#app裡面的<router-view></router-view>。
  • 最後生成的HTML將是:http://websitename.com/user/1:

生態系統

核心庫自帶的工具和庫都是由核心團隊和貢獻者開發的。

官方工具

  • Devtools - 用於除錯Vue.js應用程式的瀏覽器devtools擴充套件。
  • Vue CLI - 用於快速開發Vue.js的標準工具書
  • Vue Loader - 一個webpack載入器,允許以單檔案元件(SFCs)的格式編寫Vue元件。

官方程式庫

  • Vue Router - Vue.js的官方路由器
  • Vuex – 基於 Flux模式的 Vue.js 的集中式狀態管理。
  • Vue Server Renderer - 用於 Vue.js 的伺服器端渲染。

常用命令

安裝工具

npm install -g @vue/cli

 

建立工程:

vue create my-project

 

開發環境執行:

npm run serve

 

生產環境打包:

npm run build

【官方網站】

https://vuejs.org/

【最新版本】

2.6.1於2019年12月13日

【授權】

MIT License

【小結】

本文對於當前頂級的前端技術做了較為詳盡的探索,前端技術一個大的方向是單頁應用 (SPA,Single Page Application),我們在選取針對本業務的前端技術時需要結合如下幾個方面來考慮:

1. 成員當前技能,這是一個很現實的問題,大多數程式設計師會選擇自己比較熟悉的技術。這裡要思考一下,目前自己熟悉的技術是不是最優選項?

2. 可利用的學習時間,如果發現要使用的技術需要一些時間學習,這個時間的開銷到底會不會與開發進度有衝突?

3. 能否保證專案的複雜度最低,這個是比較關鍵的因素。先進技術之所以先進就是因為可以讓開發者把時間和精力放在真正的業務開發上面來,如果要使用的技術需要進行很多與業務不相關的配置,就需要問一個問題,有沒有更好的辦法?

 

最後,希望本文對現有或者以後的業務開發有指導或者借鑑作用。

 

點選關注,第一時間瞭解華為雲新鮮技術~