前端搞搭建|沐童-如何設(shè)計(jì)實(shí)現(xiàn) H5 頁面搭建系統(tǒng) - 數(shù)據(jù)模型
時(shí)間:2023-09-25 16:54:01 | 來源:網(wǎng)站運(yùn)營
時(shí)間:2023-09-25 16:54:01 來源:網(wǎng)站運(yùn)營
前端搞搭建|沐童-如何設(shè)計(jì)實(shí)現(xiàn) H5 頁面搭建系統(tǒng) - 數(shù)據(jù)模型:
下期預(yù)告
6-20,是第十期 - 跨端跨棧
https://www.huodongxing.com/go/tl106-27,是第十一期 - 女生專場
https://www.huodongxing.com/go/tl11另外,每一期都提供了全年的聯(lián)票,可以看所有場次的錄播視頻,包括下半年到年底的所有直播視頻
前端早早聊大會目標(biāo)成為用得上、聽得懂、抄得走的技術(shù)大會,計(jì)劃 2020 年辦 >= 15 期,由前端早早聊與掘金聯(lián)合舉辦,前端早早聊大會行程動態(tài)、錄播視頻/PPT/講稿資料下載請關(guān)注 「前端早早聊」 公眾號跟進(jìn)。
你的支持,是早早聊辦下去的唯一動力!
還想聽哪方面的分享,直接加 Scott 微信: codingdreamer 提需求吧!
正文
本篇為第三屆 - 前端頁面搭建專場沐童講師的分享:
1.我是誰?
Hello 大家好,很高興今天有機(jī)會能在這里跟大家分享自己關(guān)于
頁面可視化搭建的一些開發(fā)思路。
先簡單自我介紹一下,我是
沐童,18 年畢業(yè)后加入京東,目前就職于
京東京喜業(yè)務(wù)部,也是 WecTeam 的核心成員,在團(tuán)隊(duì)里主要負(fù)責(zé)了內(nèi)部使用的一個(gè)
H5 賣場可視化搭建系統(tǒng) —— MPM 的建設(shè)工作。
2.我們的團(tuán)隊(duì)
京東京喜是京東致力于打造下沉電商的戰(zhàn)略核心部門,包括京喜小程序(微信購物入口)、京東購物小程序及其他微信手 Q 渠道的業(yè)務(wù),都是由我們團(tuán)隊(duì)負(fù)責(zé)維護(hù)。在去年,我們自發(fā)成立了對外的前端技術(shù)團(tuán)隊(duì)
WecTeam,希望通過技術(shù)分享和項(xiàng)目開源等方式,參與和推動前端技術(shù)發(fā)展,為行業(yè)帶來更大價(jià)值。
WecTeam 公眾號,歡迎關(guān)注二、分享主題
今天想要跟大家分享的主題是《
如何設(shè)計(jì)實(shí)現(xiàn) H5 頁面搭建中的數(shù)據(jù)模型設(shè)計(jì)》。
1.數(shù)據(jù)模型指的是什么?
- 簡單地說,我們平時(shí)獨(dú)立開發(fā)一個(gè)頁面時(shí),經(jīng)常會創(chuàng)建一個(gè) model 層 來作為數(shù)據(jù)請求出入口,承擔(dān)、統(tǒng)管整個(gè)頁面所有的數(shù)據(jù)請求,這就是頁面數(shù)據(jù)模型的一個(gè)簡單形態(tài)。
2.為什么要討論數(shù)據(jù)模型?
- 不重視數(shù)據(jù)模型產(chǎn)生的問題:在 MPM(H5 賣場可視化搭建系統(tǒng)) 的早期,我們并沒有怎么重視數(shù)據(jù)模型,相反,為了契合自搭建頁面的樓層獨(dú)立性,我們允許各個(gè)樓層自行發(fā)起請求、處理請求,把請求的邏輯完全交給各個(gè)組件獨(dú)自完成。但是漸漸地,這種放養(yǎng)式的做法開始導(dǎo)致了維護(hù)上和頁面性能優(yōu)化上的種種問題。
- 因此。在 MPM 之后的多次系統(tǒng)迭代中,數(shù)據(jù)模型設(shè)計(jì)都是一個(gè)重頭戲,也正是因?yàn)榻?jīng)驗(yàn)教訓(xùn)積累,才有了今天這樣一個(gè)議題。
3.主題目錄
- 首先,我們會對 MPM 做一個(gè)整體的介紹,確保大家對 MPM 有一定的了解。
- 其次,我們會舉證一些實(shí)際例子,讓大家深刻體會到數(shù)據(jù)層面臨的一些痛點(diǎn),明白數(shù)據(jù)模型設(shè)計(jì)為何非做不可。
- 再者,就是數(shù)據(jù)模型設(shè)計(jì)中的兩個(gè)重要內(nèi)容,頁面模型設(shè)計(jì)和請求模型設(shè)計(jì),這也是今天分享的重點(diǎn)。
- 最后,是對本次分享一個(gè)小小總結(jié)。
三、MPM 整體介紹
1.系統(tǒng)簡介
- MPM 是京東內(nèi)部運(yùn)營使用的一個(gè) H5 賣場可視化搭建系統(tǒng)。
- 從 2016 年誕生至今,已經(jīng)上線服務(wù) 4 年,系統(tǒng)迭代超過 3 個(gè)大版本。
- 截止目前,MPM 累計(jì)使用人數(shù) 1400+,搭建頁面數(shù)量也超過了 1.9 萬張。除了平時(shí)一些日?;顒樱ū热绱荷闲拢┲?,歷年來京東微 Q 業(yè)務(wù)的大促會場,有 80% 以上是由 MPM 搭建出來的。
2.能力概覽
- MPM 已擁有特別龐大的物料倉庫,其中包括 30 多個(gè)組件、500 多個(gè)模板,業(yè)務(wù)能力覆蓋了商品、導(dǎo)購、營銷等多個(gè)場景。
- MPM 支持頁面的三端渲染能力,同時(shí)提供了強(qiáng)大的頁面配置功能,包括頁面樓層 BI 排序、自動化埋點(diǎn)、自動化測試、頁面測速等。
- MPM 十分重視系統(tǒng)使用體驗(yàn),不但配置了流暢的拖拽編輯器、實(shí)時(shí)預(yù)覽和頁面健康診斷能力,還對系統(tǒng)和頁面做了全方面的監(jiān)控和容災(zāi)降級方案。
3.效果展示
MPM編輯界面- 市面上大多數(shù)頁面搭建系統(tǒng)以控件為最小粒度(比如按鈕、輸入框)進(jìn)行搭建,但 MPM 的目標(biāo)頁面是賣場,相對更加復(fù)雜,使用控件搭建并不實(shí)際,因此我們采用了“組件-模板-屬性”的三層配置結(jié)構(gòu),其中模板類似于組件的皮膚。
- 從圖中可以看出,MPM 正常作業(yè) 4 步驟
- 從左側(cè)組件列表拖一個(gè)組件添加到預(yù)覽區(qū)
- 在右側(cè)模板列表選擇期望的模板
- 在屬性配置區(qū)配置樓層屬性
- 發(fā)布頁面
配置發(fā)布頁面最終效果圖4.系統(tǒng)架構(gòu)
- MPM 系統(tǒng)基于四大核心要素:組件、模板、屬性和我們今天重點(diǎn)講解的數(shù)據(jù)模型,打造了四個(gè)解析引擎,引擎能夠?qū)撁娴呐渲脭?shù)據(jù) PageData 進(jìn)行解析,生成實(shí)際頁面。
- 最上層是 MPM 面向用戶的應(yīng)用層,包括了編輯后臺、管理統(tǒng)計(jì)后臺和三大渲染平臺。
5.工作流程
- 在搭建頁面時(shí),運(yùn)營通過拖放樓層、配置樓層數(shù)據(jù)、保存頁面等多個(gè)步驟,生成了一份 PageData,而后將這份 PageData 發(fā)布到 CDN / Redis。
- 在用戶打開頁面時(shí),各端的 MPM 引擎會先請求這份 PageData 并對其進(jìn)行解析,而后根據(jù)配置數(shù)據(jù)請求接口,渲染樓層,最終展示完整頁面。
四、數(shù)據(jù)層面臨的痛點(diǎn)
了解完 MPM 的大致情況后,我們再把目光聚焦到 MPM 的數(shù)據(jù)模型。數(shù)據(jù)層面臨的痛點(diǎn)究竟是什么?為什么 MPM 會對數(shù)據(jù)模型尤其重視?我們可以從以下幾個(gè)例子感受到。
1.請求散亂無章
第一種場景:頁面請求茫茫多,有時(shí)候想定位頁面中某個(gè)請求來自哪個(gè)組件,可能得定位半天。
- MPM 負(fù)責(zé)搭建的是賣場,賣場往往是流量入口,承載了各線業(yè)務(wù),因此接口場景特別復(fù)雜。如果我們簡單地將請求完全交給組件自身,各自發(fā)起和處理,其結(jié)果就是頁面請求散亂無章,維護(hù)困難不止,甚至可能互相影響。
2.多余的重復(fù)請求
第二種場景:某個(gè)頁面中,有多個(gè)組件都配置了同一個(gè)預(yù)約 ID,導(dǎo)致頁面發(fā)出了 N 個(gè)一模一樣的預(yù)約態(tài)查詢請求。
- 在自搭建場景,這種請求重復(fù)的問題再常見不過,假如我們沒有對數(shù)據(jù)請求進(jìn)行統(tǒng)一管理的話,那么很有可能這些無效的重復(fù)請求將嚴(yán)重拖垮你的頁面性能。
3.接口壓力大
第三種場景:商品接口支持批量請求,但由于頁面的各個(gè)商品組件是獨(dú)立請求的,導(dǎo)致多個(gè)商品請求并沒有聚合,走批量調(diào)用。
- 一些常用的業(yè)務(wù)接口往往會支持批量調(diào)用,目的就是為了減輕服務(wù)調(diào)用壓力。但是由于我們沒有對請求進(jìn)行統(tǒng)管,無法聚合,使得頁面多次請求同個(gè)業(yè)務(wù)接口,給服務(wù)造成了不少壓力。
4.數(shù)據(jù)模型多變
第四種場景:商品組件下的各個(gè)模板,除請求商品之外,有些模板會拉取新人價(jià),有些模板會拉取補(bǔ)貼價(jià)。
- 這是頁面搭建經(jīng)常面臨的問題 —— 數(shù)據(jù)模型多變。每個(gè)組件都對應(yīng)了多個(gè)模板,每個(gè)模板又可能對應(yīng)了不同的數(shù)據(jù)模型,那么如何進(jìn)行數(shù)據(jù)模型的組合,這么多數(shù)據(jù)模型又該如何有效維護(hù)和管理,也是一個(gè)大問題。
5.三端同構(gòu)訴求
第五種場景:以 Vue 為例,我們習(xí)慣在組件創(chuàng)建時(shí),也就是
created
鉤子函數(shù)中請求數(shù)據(jù),這在客戶端渲染時(shí)表現(xiàn)很完美,但在直出場景下卻完全行不通。
- 歸根結(jié)底,這其實(shí)是因?yàn)?Vue 雖然支持了 SSR,但對異步數(shù)據(jù)獲取的同構(gòu)支持卻很不完善。為了適配 MPM 的三端同構(gòu),數(shù)據(jù)層設(shè)計(jì)必須考慮這個(gè)問題。
五、數(shù)據(jù)請求解決方案
基于以上種種問題,我們?yōu)樽源罱ㄙu場打造了一套高效通用的數(shù)據(jù)請求解決方案,它包括了以下三個(gè)解決目標(biāo):
- 統(tǒng)一管理 :將自搭建頁面中所有數(shù)據(jù)請求進(jìn)行統(tǒng)一管理,維護(hù)頁面請求秩序,優(yōu)化請求性能。
- 自由組合 :允許調(diào)用層(組件/模板)基于現(xiàn)有能力對數(shù)據(jù)模型進(jìn)行自由組合,即插即用。
- 適配三端 :為三端同構(gòu)提供統(tǒng)一的數(shù)據(jù)請求方案。
六、頁面模型設(shè)計(jì)
- MPM 的頁面模型,也就是我們前邊提到的 PageData,是 MPM 頁面的一層抽象描述。
- PageData 是一個(gè)普通的 JSON 對象,其中包含了頁面的配置數(shù)據(jù),經(jīng)過解析引擎處理后,能夠生成真實(shí)頁面。
- PageData 主要包含兩類配置:頁面級配置和組件級配置。
- 頁面級配置包括一些頁面基礎(chǔ)配置,它決定了一些頁面級別的請求,比如樓層 BI 排序查詢就是在這里發(fā)起的,此外還有頁面對用戶身份的要求配置,比如“是否需要查詢新人”,所以用戶身份查詢會在這里發(fā)起。
- 組件級配置就是組件樓層的配置,決定了各個(gè)組件樓層的業(yè)務(wù)數(shù)據(jù)獲取,這是 PageData 的重要組成部分。
組件樓層配置的結(jié)構(gòu)和內(nèi)容,它包括:
- 樓層的模板配置,即指定了什么模板進(jìn)行渲染;
- 數(shù)據(jù)配置,包含了樓層請求接口所需的參數(shù)配置;
- 組件關(guān)系,描述了組件的父子級對應(yīng)關(guān)系。
七、請求模型設(shè)計(jì)
1.數(shù)據(jù)源
我們認(rèn)為,請求模型的復(fù)雜性在于請求組合的復(fù)雜性,請求可以串聯(lián)、并聯(lián)及串并聯(lián)混合,請求還有
主次之分。
要應(yīng)對請求模型復(fù)雜靈活的組合,首先我們需要對請求進(jìn)行量化,也就是說,我們需要一個(gè)最小單元來描述請求,請求模型則基于這些基本單元進(jìn)行自由組合,這個(gè)最小單元就是數(shù)據(jù)源。
數(shù)據(jù)源是請求模型的基本組成單位,描述了一類請求動作,它包括以下幾個(gè)基本屬性:
- 接口地址:數(shù)據(jù)源和接口是一一對應(yīng)的
- 請求前置處理:發(fā)起請求前的參數(shù)組裝處理
- 請求后置處理:請求響應(yīng)后的一些通用的數(shù)據(jù)處理
- 入?yún)⑿r?yàn):發(fā)起請求前引擎會先對入?yún)⑦M(jìn)行合法校驗(yàn),非法入?yún)⒉粫l(fā)起請求
- 聚合分發(fā)策略:描述了如何對該接口的多個(gè)同類請求進(jìn)行請求聚合和響應(yīng)分發(fā)
- 監(jiān)控統(tǒng)計(jì)配置:接口監(jiān)控、統(tǒng)計(jì)相關(guān)的配置
我們用一個(gè)類來實(shí)現(xiàn)數(shù)據(jù)源,一旦想要請求這個(gè)接口,調(diào)用層只需要以配置參數(shù)為入?yún)⑦M(jìn)行實(shí)例化,就可以得到一個(gè)請求對象,引擎可以理解請求對象,并發(fā)起一個(gè)真正的請求。
數(shù)據(jù)源有很多個(gè),每個(gè)數(shù)據(jù)源都有自己的名稱標(biāo)識,在調(diào)用層,我們只需要通過數(shù)據(jù)中心提供的
fetch
方法,指定數(shù)據(jù)源標(biāo)識并傳入配置數(shù)據(jù),就可以建立起和數(shù)據(jù)源的綁定關(guān)系,來選擇調(diào)用某個(gè)數(shù)據(jù)源。
基于這樣的設(shè)計(jì),我們可以很方便地實(shí)現(xiàn)請求模型的自由組合。
首先我們要求數(shù)據(jù)源應(yīng)該是純粹且專一的,它應(yīng)該只做一件簡單的事,比如跟這個(gè)接口密切相關(guān)的一些通用處理邏輯,而像一些跟特定部分組件/模板業(yè)務(wù)邏輯相關(guān)的處理,則不應(yīng)該出現(xiàn)在這里,這是自由組合的前提。
其次,我們允許由數(shù)據(jù)源以各種形式自由組合成更高級、更復(fù)雜的請求模型,或者叫高級數(shù)據(jù)源。對于調(diào)用層來說,既可以直接調(diào)用數(shù)據(jù)源,也可以調(diào)用封裝好的高級數(shù)據(jù)模型。
數(shù)據(jù)源如何組合成高級請求模型呢?這里我們采用了最簡單靈活的函數(shù)調(diào)用,而不再是以類的形式來組織。函數(shù)天然擁有的作用域機(jī)制,對實(shí)現(xiàn)靈活多變的請求模型十分有利。上圖就是這樣一個(gè)例子,我們在函數(shù)內(nèi)串聯(lián)調(diào)用了商品、優(yōu)惠券兩個(gè)數(shù)據(jù)源,簡單地實(shí)現(xiàn)了一個(gè)“帶券商品”的請求模型。
高級請求模型是個(gè)函數(shù),同樣也就擁有唯一的名稱標(biāo)識。所以向上,我們將調(diào)用方式對齊,因此對于調(diào)用層來說,究竟是直接調(diào)用數(shù)據(jù)源,還是調(diào)用高級請求模型,其實(shí)沒什么區(qū)別。
另一方面,依靠數(shù)據(jù)源,我們也有效地實(shí)現(xiàn)了統(tǒng)一管理。上圖是數(shù)據(jù)源請求的整體工作流程,其中有兩個(gè)核心模塊 —— 數(shù)據(jù)中心和請求中心:
- 數(shù)據(jù)中心:是頁面請求的代理層,頁面所有請求都將經(jīng)過數(shù)據(jù)中心,請求聚合分發(fā)在這里進(jìn)行;
- 請求中心:解析來自數(shù)據(jù)中心的請求對象,發(fā)起請求并返回響應(yīng),請求的去重在這里進(jìn)行。
借助這兩個(gè)核心模塊,整個(gè)頁面請求的流程大致是這樣的:
- ①.頁面或樓層向數(shù)據(jù)中心申請一次數(shù)據(jù)請求,申請內(nèi)容攜帶了數(shù)據(jù)源標(biāo)識
source
和配置數(shù)據(jù); - ②.數(shù)據(jù)中心根據(jù)數(shù)據(jù)源標(biāo)識
source
,選取相應(yīng)數(shù)據(jù)源,并實(shí)例化一個(gè)請求對象,發(fā)給請求中心; - ③.請求中心解析請求對象,發(fā)起請求,并處理響應(yīng),返回處理結(jié)果到數(shù)據(jù)中心;
- ④.數(shù)據(jù)中心再透傳給調(diào)用層,觸發(fā)響應(yīng)渲染。
2.請求優(yōu)化策略
當(dāng)對頁面請求做了統(tǒng)一管理之后,我們就可以對請求做一些合理的優(yōu)化了。
請求中心的內(nèi)部機(jī)制2.1 如何避免頁面發(fā)起重復(fù)請求呢?
首先,我們將請求分為了未發(fā)起、等待中、已完成三個(gè)生命階段。當(dāng)請求中心接收請求對象后,會先對請求對象做 MD5 判斷:
- 如果是未發(fā)起,則直接發(fā)起請求,等待響應(yīng)后會將響應(yīng)結(jié)果寫入緩存,并調(diào)用回調(diào);
- 如果是等待中(即該請求對象來之前,已經(jīng)有相同請求對象被處理過了,但還在等待響應(yīng)),則不發(fā)起,僅推入回調(diào)等待隊(duì)列;
- 如果是已完成(即該請求對象來之前,已經(jīng)有相同請求對象被處理過了,且響應(yīng)已返回),則直接使用緩存結(jié)果。
依靠這樣一個(gè)簡單的請求隊(duì)列和請求緩存,我們有效避免了頁面內(nèi)發(fā)起重復(fù)請求。
2.2 如何實(shí)現(xiàn)頁面內(nèi)同類接口請求的有效聚合?
前邊我們提到,數(shù)據(jù)源中的
batch
屬性可以制定聚合分發(fā)策略,上圖就是
batch
的內(nèi)部結(jié)構(gòu)。它包含了三個(gè)屬性:
pack
:接收多個(gè)請求對象,返回合并后的請求對象;unpack
:接收聚合的響應(yīng)數(shù)據(jù)和多個(gè)請求對象,返回拆包的映射結(jié)果;limit
:允許聚合的請求對象數(shù)量上限。
每當(dāng)數(shù)據(jù)中心創(chuàng)建出一個(gè)請求對象的時(shí)候,并不會立刻發(fā)給請求中心處理,而是先推入一個(gè)緩沖隊(duì)列。等到下一個(gè) Tick 時(shí),數(shù)據(jù)中心會將上個(gè) Tick 收集到的這一批請求對象,經(jīng)
pack
函數(shù)處理,聚合成一個(gè)請求對象,再發(fā)給請求中心。等到響應(yīng)后,再經(jīng)
unpack
函數(shù)拆包,根據(jù)拆包映射分發(fā)到對應(yīng)的各個(gè)調(diào)用層。
當(dāng)然,假設(shè)在當(dāng)前 Tick 中,緩沖隊(duì)列內(nèi)的請求對象達(dá)到了規(guī)定的上限,那么聚合就會提前執(zhí)行。
聚合分發(fā)的流程上圖可以很明顯看出,對于調(diào)用層來說,感知上依然是發(fā)出了 5 個(gè)請求,接收了 5 個(gè)響應(yīng)結(jié)果,但對于請求中心來說,只接受并處理了 2 個(gè)請求對象,也就是只發(fā)出了 2 個(gè)請求。所以在這里,聚合分發(fā)層其實(shí)起到了一個(gè)隔離的作用,對于隔離層的兩端來說,對方都是黑盒。因此,利用這樣一套機(jī)制,我們可以很方便地讓同類請求合多為一。
3.初態(tài)函數(shù)
為了實(shí)現(xiàn) MPM 的三端同構(gòu),我們設(shè)計(jì)了初態(tài)函數(shù)。
可能很多人有疑問:前后端渲染到底有什么區(qū)別?假如我把客戶端渲染那一套,照搬到直出端,為什么不行?那么這里就跟大家稍微解釋下。
在客戶端渲染中,我們經(jīng)常喜歡在
created
鉤子函數(shù)中編寫數(shù)據(jù)請求,同時(shí)以骨架屏或局部 loading 作為占位,等到數(shù)據(jù)就位后再渲染出有效內(nèi)容。這是客戶端渲染的慣用手段,這也就說明了一個(gè)問題:客戶端允許存在多趟渲染,大可以邊渲染邊請求,渲染和請求之間沒有嚴(yán)格的先后順序。
但是在直出端,渲染完成的下一步是向客戶端作頁面流式輸出,有且只有一趟渲染。所以,直出渲染前,用于渲染的數(shù)據(jù)必須全部到位,也就是說,請求必須在渲染之前完成。
如果你把客戶端渲染直接搬到直出端,很遺憾,你可能就只能直出一份骨架屏。
因此,我們可以得出以下幾個(gè)結(jié)論:
- ①.三端同構(gòu)的問題在這里被簡化成前后端同構(gòu)的問題,而前后端同構(gòu)的關(guān)鍵就是初態(tài)渲染,所謂初態(tài),就是頁面的初始化階段。
- ②.Vue 現(xiàn)有生命周期沒有任何一個(gè)能夠滿足直出端的異步數(shù)據(jù)獲取,要實(shí)現(xiàn)直出,數(shù)據(jù)模型就必須補(bǔ)充適配直出渲染的生命周期。
- ③.支持直出還不夠,我們要實(shí)現(xiàn)三端同構(gòu),還需要規(guī)范解析流程,讓三端解析流程保持高度統(tǒng)一。
基于這些,我們參考現(xiàn)有優(yōu)秀的前后端同構(gòu)框架 Next,設(shè)計(jì)了初態(tài)函數(shù)。Next 中也有初態(tài)函數(shù),只不過 Next 的初態(tài)函數(shù)只能存在于頁面級別,組件中是不允許有初態(tài)函數(shù)的。而 MPM 是組件搭建場景,我們不可能在頁面級別去獲取各個(gè)組件樓層的數(shù)據(jù),因此我們對初態(tài)函數(shù)做了一些改造。
我們讓每個(gè) MPM 組件樓層都擁有一個(gè)初態(tài)函數(shù),它是位于組件生命周期最開始的一個(gè)異步函數(shù)。初態(tài)函數(shù)以組件配置數(shù)據(jù)為入?yún)?,異步返回用于組件初始化渲染需要的初態(tài)數(shù)據(jù)。
三端引擎在創(chuàng)建組件實(shí)例之前,會先收集各組件的初態(tài)函數(shù),執(zhí)行,并將函數(shù)的異步返回結(jié)果作為組件初始化渲染的數(shù)據(jù)。
基于初態(tài)函數(shù),我們對客戶端,也就是靜態(tài) H5 和小程序端的渲染流程做了一些調(diào)整。我們不再允許客戶端隨意在
created
鉤子函數(shù)中編寫初態(tài)數(shù)據(jù)請求,而是要通過初態(tài)函數(shù)來實(shí)現(xiàn),為的就是和直出端的頁面解析渲染流程保持嚴(yán)格統(tǒng)一,便于同構(gòu)。
而對于直出端,其解析流程大體和客戶端相同,唯一區(qū)別是,直出流式渲染后,頁面到達(dá)客戶端需要進(jìn)行樓層組件的激活,讓直出樓層接受 Vue 的狀態(tài)管理。
有時(shí)候我們可能遇到這種場景需求:有一個(gè)組件,串聯(lián)請求了主、次兩個(gè)接口,次接口內(nèi)容沒那么重要,為了提高直出效率,能不能只直出主接口,次接口等到了客戶端再請求呢?
為了實(shí)現(xiàn)這類主次接口的分端請求,我們又進(jìn)一步對初態(tài)函數(shù)做了一些改造。我們讓初態(tài)函數(shù)支持了這種寫法,除了返回一個(gè) Promise 來表示異步之外,我們允許初態(tài)函數(shù)提供第二個(gè)參數(shù) ——
callback
。
callback
是一個(gè)回調(diào)函數(shù),用于通知引擎執(zhí)行渲染,所以我們可以通過在初態(tài)函數(shù)中多次調(diào)用
callback
函數(shù)來實(shí)現(xiàn)初態(tài)數(shù)據(jù)的分階段渲染。
對于這類寫法的初態(tài)函數(shù),直出端只會響應(yīng)其中的第一個(gè)
callback
,也就是說,當(dāng)?shù)谝粋€(gè)
callback
被執(zhí)行時(shí),直出端就默認(rèn)你已經(jīng)準(zhǔn)備好了用于直出渲染的數(shù)據(jù),余下的
callback
將直接忽略。等到了客戶端之后,初態(tài)函數(shù)會再被執(zhí)行一遍,以補(bǔ)充剩余的
callback
調(diào)用。這樣一來,我們只需要把主接口數(shù)據(jù)放在第一個(gè)
callback
調(diào)用,次接口數(shù)據(jù)由第二個(gè)
callback
調(diào)用,就能實(shí)現(xiàn)主次接口數(shù)據(jù)的分端請求渲染了。
八、總結(jié)
- 以上就是 MPM 為自搭建 H5 賣場打造的整個(gè)數(shù)據(jù)模型解決方案。
- 雖說方案是基于 MPM 這類特殊場景設(shè)計(jì)的,有一定的針對性,但對于其他場景的頁面搭建依然有它的借鑒意義。
1.頁面搭建系統(tǒng)的開發(fā)心得
1.1 嚴(yán)謹(jǐn)設(shè)計(jì)
相比獨(dú)立開發(fā)一個(gè)頁面,搭建場景的開發(fā)可能隨時(shí)隨地都要求著嚴(yán)謹(jǐn)?shù)脑O(shè)計(jì)。任何你認(rèn)為的微不足道,如果不引起重視,最終都可能被放大,成為一個(gè)繞不開的絆腳石,阻礙你的系統(tǒng)進(jìn)一步迭代優(yōu)化。
1.2 重視規(guī)范
很多時(shí)候我們的設(shè)計(jì),比如今天討論的數(shù)據(jù)模型解決方案,并不是什么高深的技術(shù),包括數(shù)據(jù)源的編寫、三端同構(gòu)流程,更多只是一套開發(fā)范式。搭建系統(tǒng)需要考慮的東西遠(yuǎn)比獨(dú)立開發(fā)場景多得多,有了規(guī)范約束,才能更加自如地面對迭代和協(xié)同開發(fā)。
1.3 重視統(tǒng)一
獨(dú)立和統(tǒng)一并不矛盾,并不是說搭建場景就是一切務(wù)求獨(dú)立。相反,獨(dú)立和統(tǒng)一是相輔相成的,雖然搭建的目的是自由組合,但在設(shè)計(jì)開發(fā)時(shí)卻必須足夠重視統(tǒng)一的思想。
2.關(guān)注我們
最后,感謝大家的觀看,歡迎掃碼關(guān)注我們的技術(shù)團(tuán)隊(duì)
WecTeam,給你帶來更多技術(shù)分享。
近兩年 Scott 觀察到前端行業(yè)已經(jīng)完全進(jìn)入競爭的深水區(qū),各大小公司的前端 TL 剛剛上任,初帶團(tuán)隊(duì),針對前端工程師這個(gè)群體,應(yīng)該怎么管人理事,搭臺拿結(jié)果,幫帶有成長,就成立了這個(gè)前端技術(shù)主管學(xué)習(xí)交流群,在人的選用育留上互相學(xué)習(xí)成長,入群的門檻是你有實(shí)線或者虛線在帶團(tuán)隊(duì),請加 Scott 微信: codingdreamer 邀請入群:
看完若有啟發(fā),就請點(diǎn)贊評論轉(zhuǎn)發(fā)三連吧
關(guān)鍵詞:實(shí)現(xiàn),系統(tǒng),模型,設(shè)計(jì),數(shù)據(jù)