2015年3月23日 星期一

React.js - react/flux 範例

本篇教學範例的完整原始碼在 >>這裡<<

如果對 Flux 的架構和細節有不清楚的,網路資源很多可以查,建議看英文比較好

我之前有寫一篇關於 Flux 的架構分想也可以參考 >>Facebook/Flux 架構分享<<

這邊在用最簡單的方式介紹一下 Flux 的架構

原則上 Flux 是一個資料流只有單一方向的設計原則,並且把原件區分為 View, Action, Store, Dispatcher

以下用一張簡單的圖來說明
























第一張圖是 Flux 的架構圖,我有簡化過,因為我是認為 Flux 的原圖會讓人誤會

第二張圖是實際的運行中的資料流



接下來用一個很簡單的範例來實作 react 與 flux 的範例程式來介紹 flux

首先在專案目錄(react-flux-demo)下建立 package.json,內容如下即可

接著執行以下指令
上面我們透過 npm 安裝了 react, flux 以及 object-assign

其中 object-assign 是類似用來拷貝物件的一個 node module

接下來我們就從下面的 HTML 開始撰寫 react/flux 的程式

這次的範例很簡單,頁面上只有兩個 button ,分別代表遞增與遞減的功能,下方則會顯示目前的數值

先從程式入口點開始 js/app.js

接下來是 js/components/DemoApp.react.js,這個是主頁面的 View

再來則是剩下的兩個 View:js/components/Header.react.js 以及 js/components/Content.react.js

Header 負責呈現兩個 button 並負責 click 的事件以及與 Action 溝通

Content 單純透過 React 的 State 來呈現目前的數值是多少


接下來就是 Action 的部分,這是相對簡單的地方,主要就是負責提供 View 處理 user 行為的 function

並且透過 Dispatcher 來發送這個事件出去,而只有有興趣的 Store 會聆聽這些事件

所以先來看一下 js/actions/DemoAction.js

再來是 Dispatcher,dispatcher 在 flux 的架構中被定義為一個 singleton 的元件,只負責做事件的派送

由於大部分 dispatcher 的處理邏輯 flux 已經 cover 掉了,所以你的 dispatcher 會相當精簡

以下是 js/dispatcher/DemoDispatcher.js 的程式

最後就是最複雜的部分了:js/stores/DemoStore.js (我把一些解釋寫在註解內了)

完成之後,我們就要利用 Browserify 來做簡單的 build 動作

為什麼要用 Browserify?其實在前面的所有範例程式中,前面幾行都是用 require 這個函式來引入其他的 JS 檔

或是引入 react 以及 flux 等等, require 這個函式不是憑空出現的

畢竟我們又沒有額外引入 RequireJS 或 CommonJS 之類的,這是因為有 Browserify 的幫忙

有空可以看看 >>Browserify<< ,以下是他最簡短也最明瞭的解釋

Browserify lets you require('modules') in the browser by bundling up all of your dependencies.

簡單說你要透過 Browserify 來 build 你目前的所有程式,否則瀏覽器會看不懂 require ~

另外你還需要 Reactify,這是一個 Browserify 的 transform

能夠讓 build 的過程中也能夠轉換 react 的 JSX 語法,否則你會 build 不成功的

所以要透過以下指令來安裝 Browserify 以及 Reactify

並且修改 package.json,加入Browserify 的 transform

最後就可以執行以下的指令來進行 building 的動作

browserify -t reactify js/*.js -o ./build/bundle.js

這個指令的結果會在專案目錄下的 build 目錄內產生一個 bundle.js

最後一步我們就可以將這個 bundle.js 加到原先的 index.html 內了

==================================================

最後補充,如果想用 gulp 執行 build 的動作的話

可以參考 github 上的 Gulpfile.js 以及 package.json 的配置

再次附上此次範例的連結 >>點我<<

沒有留言:

張貼留言