是什么
創(chuàng)新互聯(lián)建站的客戶來自各行各業(yè),為了共同目標(biāo),我們在工作上密切配合,從創(chuàng)業(yè)型小企業(yè)到企事業(yè)單位,感謝他們對我們的要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。專業(yè)領(lǐng)域包括成都做網(wǎng)站、網(wǎng)站制作、電商網(wǎng)站開發(fā)、微信營銷、系統(tǒng)平臺開發(fā)。
Cycle.js 是一個極簡的JavaScript框架(核心部分加上注釋125行),提供了一種函數(shù)式,響應(yīng)式的人機(jī)交互接口(以下簡稱HCI):
函數(shù)式
Cycle.js 把應(yīng)用程序抽象成一個純函數(shù) main(),從外部世界讀取副作用(sources),然后產(chǎn)生輸出(sinks) 傳遞到外部世界,在那形成副作用。這些外部世界的副作用,做為Cycle.js的插件存在(drivers),它們負(fù)責(zé):處理DOM、提供HTTP訪問等。
響應(yīng)式
Cycle.js 使用 rx.js 來實(shí)現(xiàn)關(guān)注分離,這意味著應(yīng)用程序是基于事件流的,數(shù)據(jù)流是Observable 的:
HCI
HCI 是雙向的對話,人機(jī)互為觀察者
在這個交互模型中,人機(jī)之間的信息流互為輸出輸出,構(gòu)成一個循環(huán),也即 Cycle這一命名所指,框架的Logo更是以莫比烏斯環(huán)貼切的描述了這個循環(huán)。cycle_log
唯一的疑惑會是:循環(huán)無頭無尾,信息流從何處發(fā)起?好問題,答案是:
However, we need a .startWith() to give a default value. Without this, nothing would be shown! Why? Because our sinks is reacting to sources, but sources is reacting to sinks. If no one triggers the first event, nothing will happen. —— via examples
有了.startWith() 提供的這個初始值,整個流程得以啟動,自此形成一個閉環(huán),一個事件驅(qū)動的永動機(jī) :)
Drivers
driver 是 Cycle.js 主函數(shù) main()和外部世界打交道的接口,比如HTTP請求,比如DOM操作,這些是由具體的driver 負(fù)責(zé)的,它的存在確保了 main()的純函數(shù)特性,所有副作用和繁瑣的細(xì)節(jié)皆由 driver來實(shí)施——所以 @cycle/core 才125 行,而@cycle/dom 卻有 4052 行之巨。
driver也是一個函數(shù),從流程上來說,driver 監(jiān)聽sinks(main()的輸出)做為輸入,執(zhí)行一些命令式的副作用,并產(chǎn)生出sources做為main()的輸入。
DOM Driver
即 @cycle/dom,是使用最為頻繁的driver。實(shí)際應(yīng)用中,我們的main()會與DOM進(jìn)行交互:
組件化
每個Cycle.js應(yīng)用程序不管多復(fù)雜,都遵循一套輸入輸出的基本法,因此,組件化是很容易實(shí)現(xiàn),無非就是函數(shù)對函數(shù)的組合調(diào)用
實(shí)戰(zhàn)
準(zhǔn)備工作
安裝全局模塊
依賴模塊一覽
"devDependencies": { "babel-plugin-transform-react-jsx": "^6.8.0", "babel-preset-es2015": "^6.9.0", "babelify": "^7.3.0", "browserify": "^13.0.1", "uglifyify": "^3.0.1", "watchify": "^3.7.0" }, "dependencies": { "@cycle/core": "^6.0.3", "@cycle/dom": "^9.4.0", "@cycle/http": "^8.2.2" }
.babelrc (插件支持JSX語法)
{ "plugins": [ ["transform-react-jsx", { "pragma": "hJSX" }] ], "presets": ["es2015"] }
Scripts(熱生成和運(yùn)行服務(wù)器)
"scripts": { "start": "http-server", "build": "../node_modules/.bin/watchify index.js -v -g uglifyify -t babelify -o bundle.js" }
以下實(shí)例需要運(yùn)行時,可以開兩個shell,一個跑熱編譯,一個起http-server(愛用currently亦可
交互實(shí)例1
功能:兩個button,一加一減, 從0起步,回顯計(jì)數(shù)
demo地址: http://output.jsbin.com/lamexacaku
HTML代碼
components
index.js
import Cycle from '@cycle/core' import { makeDOMDriver, hJSX } from '@cycle/dom' function main({ DOM }) { const decrement$ = DOM.select('.decrement').events('click').map(_ => -1) const increment$ = DOM.select('.increment').events('click').map(_ => +1) const count$ = increment$.merge(decrement$) .scan((x, y) => x + y) .startWith(0) return { DOM: count$.map(count =>) } } Cycle.run(main, { DOM: makeDOMDriver('#container'), })Clicked {count} times~
不難看出:
交互實(shí)例2
功能: 一個button一個框,輸入并點(diǎn)button后,通過Github api搜索相關(guān)的Repo,回顯總數(shù)并展示第一頁Repo列表
index.js
import Cycle from '@cycle/core' import { makeDOMDriver, hJSX } from '@cycle/dom' import { makeHTTPDriver } from '@cycle/http' const GITHUB_SEARCH_URL = 'https://api.github.com/search/repositories?q=' function main(responses$) { const search$ = responses$.DOM.select('input[type="button"]') .events('click') .map(_ => { return { url: GITHUB_SEARCH_URL } }) const text$ = responses$.DOM.select('input[type="text"]') .events('input') .map(e => { return { keyword: e.target.value } }) const http$ = search$.withLatestFrom(text$, (search, text)=> search.url + text.keyword) .map(state => { return { url: state, method: 'GET' } }) const dom$ = responses$.HTTP .filter(res$ => res$.request.url && res$.request.url.startsWith(GITHUB_SEARCH_URL)) .mergeAll() .map(res => JSON.parse(res.text)) .startWith({ loading: true }) .map(JSON => { return} ) return { DOM: dom$, HTTP: http$, } } const driver = { DOM: makeDOMDriver('#container'), HTTP: makeHTTPDriver(), } Cycle.run(main, driver)
{JSON.loading ? 'Loading...' : `total: ${JSON.total_count}`}{ JSON.items && JSON.items.map(repo =>
repo.full_name { repo.html_url }) }
有了實(shí)例1做鋪墊,這段代碼也就通俗易懂了,需要提示的是:
小結(jié)
寥寥數(shù)語,并不足以概括Cycle.js,比如 MVI設(shè)計(jì)模式,Driver的編寫,awesome-cycle 這些進(jìn)階項(xiàng),還是留給看官們自行探索吧。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。