跳到主要內容

React, React Native 和 React VR

React

自2013 React面世以來,React 的使用人數不斷增加, 而且它的使用範圍也越來越廣,從Web Page,Web App, Cross Platform Mobile 到現在新推出的React VR。因此, 我相信React是現在大多數開發者必學的Library 之一。 這篇文章會談及React 的基本概念,和React Native,React 和React VR 之間的應用和分別。 在開始講解React 之前,我會先向大家展示我在互聯網找到關於React  的統計數據。

React 在Javascript framework 中的排名

以下圖片是從 https://hotframeworks.com/languages/javascript 中獲得
上圖展示出,React 在2016 開始便一直有90 的評分,證明用家對React 的評價也不錯,它只是屈居Angular JS之後,但Angular  JS 是一個早於React 面世的 JS Framework , 它於2009 年便推出。 所以仍然有很多用者。 但從上圖可見,Angular JS的分數已有開始下降的趨勢。 主要原因可能是因為其他Framework 的出現和Angular 2 的推出令原本的用戶感到沮喪吧。 再來下圖是React 在Website 中的使用率。

資料來源於 https://www.similartech.com/technologies/react-js和 https://trends.builtwith.com/javascript/React/Market-Share

而大部分React 的增長率是原於JQuery  的使用者。


在眾多國家中, 美國為使用React 最多的國家,日本和 中國 緊隨其後。

最後,下圖為2017 年NPM (Node package manager) 中各Javascript Framework 的下載增長率。 資料來自於 https://www.npmjs.com/npm/state-of-javascript-frameworks-2017-part-1 
Laurie Voss 的The State of  Javascript Frameworks 2017 報告中。

各項的統計數據均顯示React 這幾年來有不錯的增長率。 我在2016 年的時候開始接觸React, 在這2年間 React 的使用人數越來越多, 特別是在Mobile 市場中,越來越多人使用React Native 來研發誇平台手機應用程式。我個人認為React 之所以越來越多人的使用是因為它有在不同平台上也能使用React 進行開發的延伸性。 因為基本上,無論是 React,React Native 或React VR。 它們之間也是使用JSX 語句來編程的。 當然, 不同Library 之間的使用組件也有不同。   在接下來的部分,我將逐一介紹React,React Native 和React VR。 

React 


React 是由Facebook 團隊開發的一個Library。 它並不是一個MVC framework. 但對於熟悉MVC Framework 的用家 要上手React 也是有一定的優勢的, 因為它會使用變量 Binding View 的形式 來解決 頁面和邏輯的耦合。  而它的另一個特點是Virtual DOM 的引入

Virtual DOM

在日常的網頁中,會因應用戶不同的操作而對頁面進行不同的呈現。 而這些呈現的實現方式一般是通過對DOM 的操作而實現的。 而對DOM 進行頻繁的操作會對網頁的性能帶來損害。 因此,React 團隊引入一個名為Virtual DOM 的機制,所有基於React 所造的Reandering  也只是對Virtual DOM 進行構建。 而React 則會把新生成的Virtual DOM 與原來的Dom 進行差異比較, 比較後把不同的部分交給瀏覽器進行處理。 這樣,開發者便不需要關心Dom 的結構,開發者只需關心數據變化後介面是甚麼樣子便可。 

組件化 

React 另一個特點是組件化,組件化可以令到程式碼更加獨立, 實作出來的東西也可以達到重用的效果。 React 非常之推荐使用組件化的形式來設計介面, 把介面中的每個區域劃分成有獨位功能的組件,並且把相對復雜的組件再劃分成更細的組件。 最終以嵌套或組合的形式來生成介面。Facebook 和Instragram  的Web 版就是以這種形式設計的。 使用組件化形式設計可達成以下優點
1 可組合 能以不同的組件不斷組合成更多功能的組件
2 可重用 可在不同的介面中重覆使用
3 可維護 邏輯獨立封裝,更易維護和更改
4 可測試 有利於引入單元測試,因為邏輯已獨立封裝

學習方式  

若要學習React 的話,建議先閱讀官方的React 文件。 然後可使用Code Pen 實現一些簡單的測試。 我在Code Pen 中之前有寫過一些簡單的練習 
https://codepen.io/Isaac1024/pen/QKOrzR
https://codepen.io/Isaac1024/pen/pEyWxA
最後可嘗試使用Node.js, 配合其他React 的Library 例如 Redux, React Router,GraphQL 等 開發一些簡單的小程式試試看呀。

學習資源


React Native

React Native 是由React 團隊開發出來,用作編寫跨平台手機應用程式的Library, 它和React 一樣, 也是以JSX 語句來編寫程式。 相比起React, React Native 平身已提供一定的組件供開發者使用。 組件的詳細使用方法可參考官方的文件。  

使用React Native 開發手機程式有以下的優點
1 能把編寫網頁的概念應用在手機開發中, 語句和React 基本上是一樣,開發者不必重新學習
2 能使用原生IOS 或Android 支援的Native Javascript  元件,使程式效能更接近原生程式
3 容易放到手機上運行, 使用Expo 開發框架的話,只要你不使用Navite 的元件,就很容易放到手機上進行測試。
4 支援使用Code Push 進行更新,不必再經AppStore 提交更新。 

以上通通是使用React Native 進行手機開發享有的好處理,的確,能夠編寫跨平台手機應用程式的框架有很多,但React Native是眾多之中效能最接近原生的 而且還能把React 的開發概念應用在其中,所以我是非常推荐大家學習React Native 的 以下我將會對Expo  進行簡單的介紹,並提供React Native 的學習資源。

React Expo

React Expo 是一個React Native 的開發工具集。 它提一系列的原生API,使開發變得更為簡單。 而且它最大的特點是提供一個Cloud Store 讓開發者可以把開發的程式放到它的Cloud 上供其他使用者使用。 用家只需下載Expo Client 在手機上Scan QR Code 便可在手機中開啓。 當然,你若不想用戶要經Expo Client 開啓的話, 也可以把App 放上Store 上。 經Expo 工具開發的App 並不限制一定要使用Expo Client 開啓的。 使用方法可參考Expo 的官方文件。 下圖的QR Code 是我在Expo Cloud 上放置的一個手機應用程式,對React Native 開發有興趣的讀者可下載Expo Client 在手機中並Scan QR Code 試試看呀。 




學習資源

支援多國語言教學
List View Header Section Header 教學
React Native Navigation 教學



ReactVR

React VR 是React 團隊新開發的一個框架,用戶可使用它建立支援VR 的Web Application. 
React VR 原理是在底層使用一個名為Three.js 的Library 來支援WebVR 和WebGL的開發。 
近年來,VR 技術都受到世界各地開發者的熱烈討論, 如果覺得 錯過了之前React 和 React Native 的開發熱潮的話, 學習React VR 是一個不錯的選擇。 特別是VR 在Web 中的應用會在不久將來普及。  所以React VR 會是一個不錯的學習投資。 
以下是React VR 的一些學習資源
https://blog.pusher.com/building-a-realtime-react-vr-app/ 一個使用React VR開發的Web VR 項目


總結

本文列出了React 在各方面的應用, 我認為它最吸引人之處是它可以在Web,Mobile 甚至 WebVR 進行開發。 應用層面非常之廣。 以往最令人感到咀喪的事是在不同的平台開發,要學習不同的語言,掌握不同的開發風格。 但現在,React 的出現,為感到咀喪的開發者提供了不錯的選擇。 

留言

這個網誌中的熱門文章

如何使用Macbook 進行W-Fi 竊聽及信號分析

OS X 中的Wi-Fi Analyzer 工具 要對無線網絡進行分析及診斷, 首先要在PC中安裝Wi-Fi Analyzer 應用程式。 Wi-Fi Analyzer是一種可以檢察Wi-Fi 信號強弱,找出適合架設Wi-Fi 的Channel , 搜尋附近Wi-Fi 接點及竊聽經Wi-Fi 傳送的網絡封包(這功能要視乎你的網卡是否支援監控模式)的工具。  在網絡上有不同的Wi-Fi Analyzer 供大家下載。 而在OS X 系統中, 其實已預設安裝了Wireless Diagnostics 程式。   在本文中, 會假定讀者對Wi-Fi 的專業名詞(如noise, ssid bssid 等)有基本的認識。 因此, 只會展示Wireless Diagnostics 的操作方法 。  Wireless Diagnostics  Wireless Diagnostics  是一個預設安裝在 OS X 系統的Wi-Fi 分析工具。 用戶可透過它的GUI 介面操作。  在主畫面中,按下option 鍵並點擊在上角的Wi-fi標記會出現Open Wireless Diagnostics。 然後點選它。 點擊工具列中的Window。 並會出現以下選項 如圖 1. Info     點取Info, 會顯示你現在所使用的Wi-fi資訊。 包括它的BSSID,Mac Address,Channel, Network Interface  等等資訊。 如下圖 2. Logs 點選Logs的話, 你可以選取想要收集的網絡介面日誌資訊。 要注意這設定需要重啓電腦才能生效。 並且它是會把收集到的資訊紀錄在電腦中。 因此當你不需要使用時,請記得把它關閉, 以免造成資源浪費。 3.Scan    點選Scan 的話,系統會立即掃描附近的AccessPoint  並列出它們的資料,包括SSID,Mac Address, Noise,RSSI,Channel 等等 資訊。另外系統也會對系統的現時環境作出評估, 列出最合適架設Wi-Fi 的 Channel。 以下圖 圖中的Summary, 就是系統對現在環境的評估。 Total 是系統偵擦到的AccessPoint 數目。 而Best 2.4GHz和Be

C# XML(輸出教學)

C# XML 輸出教學 XML 是其中一種主流的數據儲存格式之一, 在C# 中, 大概有3種不同的寫法把數據輸出成XML 文件。 在本文中, 我會利用一個簡單的Window form 程式介紹這3種不同的寫法。  以下是範例的XML 格式 <Im>    <Number>xx</Number>    <Name> xxx</Name>    <Type> xxx <Type>    <Data> xxx </Data> </Im> 從以上的結構可輕易看得出, 這個範例是把一張圖片輸出成XML 格式。 這是範例中使用的圖片 成功輸出的XML 文件 在Chrome 中顯示 Window form 程式 XML 輸出方法 方法一 首先要介紹的寫法是利用XMLElement 的操作, 在XmlDocument 中構建XML 節點。 上述程式碼先構建一個全新的XmlDocument, 然後逐一構建節點。 最後把構建的節點放到對應的節點或XML Root 節點下。 成功構建後便使用XmlDocument 中的save 方法輸出XML 文件。 以上要注意的事是使用這種方法生成XML 的話, 如遇到要處理圖片的情況。 請先把圖片轉換成base64 字串後, 再放到節點的inner Text 中。 方法二 第二種方法是利用XmlTextWriter 把xml node 按順序寫入Filestream 中。 最後輸出成XML 文件。 程序碼如下, 和方法1相比, 如遇到要處理圖片的情況下, 則只需把圖片的binary data  放到byte 類型的數組中, 再利用XmlTextWriter中的WriteBase64 方法便可。 不用自行轉換成base64字串。 但要留意的事是 由於是使用XmlTextWriter 是把text 以串流的型式輸出。 所以寫入資料流 時最好要按Xml結構的順序寫入。 因為在串流中append 結構是比較困難的事。 方法三 最後一種方法是使用XML.Serialization 空間下的方法, 個人比

C# 的Dynamic Object

C# 的Dynamic Object  介紹 在 .Net 4.0 版本 , C# 引入了動態編程。 實則上它並不是C# 語言的一部分 , 因為它是通過引入Dynamic Language Runtime(DLR library) 來實現的 。 對DLR Library 有興趣的話 可瀏覽( https://docs.microsoft.com/en-us/dotnet/framework/reflection-and-codedom/dynamic-language-runtime-overview )  但對於編譯語言(Compiled Language) 來說 ,  引入Dynamic 特性在當時(.Net 4.0 是在2010 發佈的)是一種大躍進 。 雖然 C# 中已有支援動態特性 , 但C# 始終是一種編譯語言 。所以我還是建議如非必要的話,還是不要使用動態編程 。 如果靜態編譯是可以做到這個效果的話就用靜態編譯實現 。 因為使用動態編程的話 , 在編譯時是不會提示你的程式碼會不會有錯誤 , 因此大大增加了執行時出現錯誤的風險 。 而且由於動態編程是late-binding. 所以物件的類別在執行時才會決定 。這種做法相對於靜態編譯是會有執行效率低的問題。 因此 編寫C# 程式應該以靜態編程的方式為主 。 但在以下情況 ,  用動態編程來編寫會較為合適 需要興COM Object 互動 Duck typing 需要與dynamic script language 如IronPython 或Ironruby 等互動 。 以上的情況, 有興趣的讀者可從互聯網中參考,  本文的以下部分會集中 說明C# 中 動態編程的基本語法, 介紹ExpandObject, DynamicObject 和 IDynamicMetaObject 及ExpandoObject 和DynamicObject 的用法。 Dynamic Keyword 若要在C# 中使用dynamic object, dynamic 這個keyword 你是絕對需要知道的 。 當一個變量以dynamic 作為它的型態 。 便代表它是late-binding. 編譯器在執行編譯時不會判斷它的型態 。 因此