走進(jìn)美團(tuán)前端(2)MVI

4_l.jpg
  • 美團(tuán)的前端架構(gòu)技術(shù)葉俊星的分享
  • Andre staltz 的 cyle.js and functional reactive user interface 的分享
    直入主題美團(tuán)前端架構(gòu)是基于 cyclejsrxjs 構(gòu)建的,目標(biāo)適合復(fù)雜業(yè)務(wù)奴曙。首先我們了解一下這兩項(xiàng)技術(shù)都是什么掌腰,以及其優(yōu)勢乖阵。
bandicam 2019-03-13 05-31-11-532.jpg

最近在我的 Android 項(xiàng)目中也準(zhǔn)備應(yīng)用 MVI 來替換原有的 MVP 。 MVI 和 MVP 的不同之處就是官辽,在 MVP 中 V 也就是視圖層即負(fù)責(zé)渲染界面呈現(xiàn)給用戶线脚,又負(fù)責(zé)和用戶的交互,而在 MVI 將 V 的進(jìn)行拆分為 view 為展現(xiàn)視圖和 intent 為用戶交互塑荒。而且引入了用戶。


bandicam 2019-03-13 05-31-44-612.jpg

而且在 MVI 中也引入用戶猾普,這樣一層套一層形成循環(huán)袜炕。


bandicam 2019-03-13 05-32-56-828.jpg

我們可以將每一個環(huán)節(jié)理解為一個函數(shù)本谜,輸入是上一個環(huán)節(jié)的輸出初家,輸出是他的下一個環(huán)節(jié)的輸入。

MVI是單向流(unidirectional flow)乌助,不可變的(immutability)溜在,響應(yīng)式的,接收用戶輸入他托,通過函數(shù)轉(zhuǎn)換為特定Model(狀態(tài))掖肋,將其結(jié)果反饋給用戶(渲染界面)。我們把MVI抽象為model(), view(), intent()三個方法赏参,描述如下:


mvi.png

cycle.js

th.jpg

MVI 設(shè)計(jì)模式

06.png

如果我們把用戶和計(jì)算機(jī)看做函數(shù)志笼,
我們通過(mvi_001)


mvi_001.JPG

這張圖來分析人是如何機(jī)器進(jìn)行交互的呢。
首先我們將計(jì)算機(jī)和人類抽象為一樣事物把篓,也就是在交互過程中我們具有同樣功能纫溃,輸入輸出

mvi_003.JPG

  • 人類:輸入是顯示器上給我們信息韧掩,輸出是鼠標(biāo)和鍵盤
  • 計(jì)算機(jī):輸入是鼠標(biāo)和鍵盤轉(zhuǎn)換的指令紊浩,輸出是顯示器上像素

交互過程中是用戶和計(jì)算機(jī)形成的閉環(huán)。
進(jìn)一步抽象疗锐,我們可以將計(jì)算機(jī)和人抽象為 函數(shù)(系統(tǒng))

mvi_005.JPG

擴(kuò)展一下坊谁,我們?nèi)祟惪偸且詾樽约翰倏v著計(jì)算機(jī),其實(shí)我們何嘗不是被計(jì)算機(jī)所操縱呢滑臊,屏幕的信息讓我們做出相應(yīng)行為口芍。


15-The-Undoing-of-the-Machine-World-Julius-Horsthuis-3.jpg
mvi_006.JPG

mvp_006 輸入一個地址獲取頁面,通過需求描述

  • 人 輸出地址雇卷,輸入頁面圖像
  • 計(jì)算器 輸入地址字符串 輸出頁面圖像
    mvp_007 我們可以輸入多個地址鬓椭,計(jì)算機(jī)會根據(jù)輸入地址返回多個頁面虹钮,這樣就形成了流,我們輸入地址時間不確定膘融,頁面返回的時間也是不確定的芙粱。都是異步所以是一個異步流
function computer(url:EventStream<String>):EventStream<screen>{
    //...
}
let screenStream = computer(interactionStream)
screenStream.listen(function(ev){...})
mvi_008.JPG

然后我們回到用戶這邊,站在用戶角度看這件事情氧映。
我們接受電腦頁面輸入春畔,可能會根據(jù)自己需要和興趣進(jìn)行一些操作,將用戶操作看成一個交互流岛都。
我們給用戶顯示流(screenStream)就會觸發(fā)用戶一些交互流(interactionStream)

function user(screenStream:EventStream):EventStream{
    //
}
mvi_009.JPG
  • 首先會將頁面生成dom 結(jié)構(gòu)律姨,然后將Dom 渲染到物理顯示器,然后映入我們的眼里臼疫,傳遞到大腦择份,進(jìn)行語言返回到手進(jìn)行操作。
mvi_010.JPG

我們寫的程序主要專注 dom 和 domevent dispatcher 這兩部分內(nèi)容烫堤。

function user(screenStream:EventStream):EventStream{
    screenStream.listen(function(screen)){
      renderToDOM(screen)
    })

    document.addEventListener('*',(ev)=>{
      interactionEvents.emit(ev)
    })

    let interactionEvents = new EventStream()

    return interactionEvents
}

這里有一個交互流荣赶,就是將 DOM 上所有的事件都轉(zhuǎn)發(fā)到他身上。

let interactionStream= user(screenStream.listen) interactionStream.listen((ev)=>{...})
let screenStream= computer(interactionStream)
let interactionStream = user(screenStream)
  let a = f(b)
let b = g(a)
let b = g(f(b))
let interactionStream = makeEmptyEventStream()
mvi_011.JPG
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸽斟,一起剝皮案震驚了整個濱河市拔创,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌富蓄,老刑警劉巖剩燥,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異立倍,居然都是意外死亡灭红,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門口注,熙熙樓的掌柜王于貴愁眉苦臉地迎上來变擒,“玉大人,你說我怎么就攤上這事疆导×尴睿” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵澈段,是天一觀的道長悠菜。 經(jīng)常有香客問我,道長败富,這世上最難降的妖魔是什么悔醋? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮兽叮,結(jié)果婚禮上芬骄,老公的妹妹穿的比我還像新娘猾愿。我一直安慰自己,他們只是感情好账阻,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布蒂秘。 她就那樣靜靜地躺著,像睡著了一般淘太。 火紅的嫁衣襯著肌膚如雪姻僧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天蒲牧,我揣著相機(jī)與錄音撇贺,去河邊找鬼。 笑死冰抢,一個胖子當(dāng)著我的面吹牛松嘶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挎扰,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼翠订,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鼓鲁?” 一聲冷哼從身側(cè)響起蕴轨,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤港谊,失蹤者是張志新(化名)和其女友劉穎骇吭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歧寺,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡燥狰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了斜筐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片龙致。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖顷链,靈堂內(nèi)的尸體忽然破棺而出目代,到底是詐尸還是另有隱情,我是刑警寧澤嗤练,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布榛了,位于F島的核電站,受9級特大地震影響煞抬,放射性物質(zhì)發(fā)生泄漏霜大。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一革答、第九天 我趴在偏房一處隱蔽的房頂上張望战坤。 院中可真熱鬧曙强,春花似錦、人聲如沸途茫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽囊卜。三九已至臀防,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間边败,已是汗流浹背袱衷。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留笑窜,地道東北人致燥。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像排截,于是被迫代替她去往敵國和親嫌蚤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容