成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

解析Twitter前端架構(gòu) 學(xué)習(xí)復(fù)雜場(chǎng)景數(shù)據(jù)設(shè)計(jì)

csRyan / 2124人閱讀

摘要:總結(jié)本文分析了在采用架構(gòu)下的數(shù)據(jù)設(shè)計(jì)結(jié)構(gòu),在一個(gè)復(fù)雜的場(chǎng)景下,希望引起讀者對(duì)能有一個(gè)更深入的認(rèn)識(shí)。

前幾天刷Twitter,發(fā)現(xiàn)Nicolas(Engineering at @twitter. Technical Lead for Twitter Lite)發(fā)布了這么一條推文:

大體意思就是Twitter前端經(jīng)過重構(gòu),已經(jīng)完全遷移到React+Redux+PWA技術(shù)棧了,后端也使用了nodeJS,實(shí)現(xiàn)了“前端一統(tǒng)天下”,lol。

聽到這個(gè)消息之后,我覺得去深挖一下Twitter的Redux store組織架構(gòu),將會(huì)非常有意思。
這對(duì)于在復(fù)雜場(chǎng)景下的前端數(shù)據(jù)學(xué)習(xí),以及React、Redux數(shù)據(jù)流設(shè)計(jì)十分有意義。

因?yàn)?,在Redux數(shù)據(jù)流框架的思想下,對(duì)于數(shù)據(jù)的處理和分配完全由前端掌握。
前端數(shù)據(jù)如何設(shè)計(jì),設(shè)計(jì)的功力如何直接完全決定整個(gè)項(xiàng)目的開發(fā)進(jìn)度以及代碼強(qiáng)健性,甚至還決定著頁面的性能。

本文將剖析Twitter前端數(shù)據(jù)結(jié)構(gòu)層次,如果你對(duì)React技術(shù)棧不是很了解,也不妨礙閱讀;同樣,如果你對(duì)這套技術(shù)棧有興趣的話,歡迎參看我的其他類似文章:

React Conf 2017 干貨總結(jié)1: React + ES next = ?

React+Redux打造“NEWS EARLY”單頁應(yīng)用 一個(gè)項(xiàng)目理解最前沿技術(shù)棧真諦

一個(gè)react+redux工程實(shí)例

......

歡迎關(guān)注我的主頁,更多技術(shù)文章不再錯(cuò)過。

本文主體內(nèi)容翻譯自Ryan Johnson的文章:Dissecting Twitter’s Redux Store,筆者進(jìn)行了一定程度的拓展。

準(zhǔn)備工作

想要看Redux store的前提是你需要配有React Developer Tools (RDT),在RDT tab中選中應(yīng)用根節(jié)點(diǎn)。
確保選中之后,在console面板中輸入:

// $r is a shortcut that references the selected element in RDT
$r.store.getState();

接下來,我們就可以看到Redux數(shù)據(jù)樹,就像圖中所示:

設(shè)計(jì)分析

我建議大家花些時(shí)間對(duì)每個(gè)不同的state進(jìn)行展開,并加以學(xué)習(xí)。但在這篇文章中,由于篇幅所限,我會(huì)挑選并深挖:

entities/tweets和

homeTimeline

兩個(gè)最主要也是最核心的state進(jìn)行剖析。這兩個(gè)states包含了一條tweet的所有關(guān)聯(lián)數(shù)據(jù)。

一條tweet,就像下圖中我所發(fā)的:

一條tweet內(nèi)容的數(shù)據(jù)信息全部存儲(chǔ)在entities/tweets/entities中,entities/tweets/entities可以理解為一個(gè)normalized的data table,它存儲(chǔ)了所有tweets推文的信息;
在這個(gè)table中,每一條tweet都是一個(gè)鍵值對(duì)類型的js object:key為該條tweet的id,value為該條tweet的數(shù)據(jù),也是一個(gè)js object。

下圖中,我將第一條tweet展開,方便大家一探究竟:

了解了tweet存儲(chǔ)結(jié)構(gòu),我們接下來看一下Twitter首頁的timeline結(jié)構(gòu)。
直觀上,timeline一定包含了個(gè)人主頁展示推文的信息。通過tweet id和剛才介紹過的entities/tweets/entities中的tweet相匹配,并最終加以在timeline上展示。
如下圖:

每個(gè)用戶的首頁timeline信息可homeTimelines/timeline找到。首頁timeline展示的順序,則按照timeline這個(gè)數(shù)組的順序。也就是說,timeline數(shù)組index為0的條目,就是你在首頁timeline上看到的第一條tweet;

重要的話再說一遍:
首頁timeline上的每條tweet,都有一個(gè)唯一的id,這個(gè)id和上面介紹的,存儲(chǔ)在entities/tweets/entities之中的tweet id相匹配。

看到這里,你也許會(huì)感嘆:

“This is pretty much normalizing state shape 101 from Dan Abramov!”

沒錯(cuò),這樣的范式也是Redux所推崇的,完全的扁平化設(shè)計(jì)帶來的開發(fā)體驗(yàn)和性能提升是無與倫比的。

當(dāng)然,你可能會(huì)問為什么Redux設(shè)計(jì)哲學(xué),包括Twitter都在推崇扁平化的數(shù)據(jù)結(jié)構(gòu)呢?
這個(gè)問題建議參考:Redux core concepts,這里講的非常清晰,被收錄在Redux core concepts中,強(qiáng)烈建議閱讀。
如果您英語吃力,可以留言與我交流,就不再展開了。

繼續(xù)言歸正傳,我們來討論一下滾動(dòng)時(shí)的異步請(qǐng)求設(shè)計(jì)。
首頁timeline加載新tweets方式有兩種:

上拉加載 track tweets by top

下滑加載 track tweets by bottom

第一種用于拉取更新的tweets,第二種用于拉取更舊的tweets;比如你新發(fā)了一條tweet,就要上拉,方可顯示在timeline上;如果沒有最新的,向下滑動(dòng)到底部后,自動(dòng)加載時(shí)間上更早的tweets。
用一個(gè)等式來表達(dá):

top = new tweets,

and
bottom = older tweets

這種情況下,homeTimelines下的lastFetch.bottom和lastFetch.top,分別為時(shí)間戳,記錄最后一次更新數(shù)據(jù)的信息(上拉和下滑)。

lastFetch.bottom: 記錄最后一次向下滑動(dòng)而更新數(shù)據(jù)的信息;

lastFetch.top: 記錄最后一次下上拉取而更新數(shù)據(jù)的信息;

同時(shí),
cursor.bottom和cursor.top值分別為一個(gè)tweet id,表示當(dāng)前timeline上,最上邊和最底部分別是哪一條tweet。

cursor.bottom: 記錄屏幕最底部tweet ID;

cursor.top: 記錄屏幕最頂部tweet ID;

同時(shí), homeTimelines里面還記錄了isLoadingDirections.bottom和isLoadingDirections.top來表示數(shù)據(jù)加載的觸發(fā)源頭。

如圖:

最后一個(gè)非常有意思的是,entities下除了存在entities/tweets之外,還分別有cards, lists and users;

entities/tweets

entities/cards

entities/lists

entities/users

來表示不同的推文特性。

當(dāng)你打開這其余三項(xiàng)的時(shí)候,會(huì)發(fā)現(xiàn)這三項(xiàng)與entities/tweets保持在相同的結(jié)構(gòu),他們都有一個(gè)fetchStatus的data table,key為tweet id, value為加載狀態(tài),據(jù)統(tǒng)計(jì)一共有一下幾種:

‘none’;

‘loading’;

‘loaded’;

‘failed’.

這幾種狀態(tài)的設(shè)置無外乎這么幾個(gè)目的:

保證在loading狀態(tài)或loaded的tweet不會(huì)再發(fā)送請(qǐng)求給server;

在未加載完時(shí),可以顯示加載動(dòng)畫或者展位圖;

在加載失敗時(shí),可以顯示失敗提示或者在此請(qǐng)求時(shí)進(jìn)行補(bǔ)救。

總結(jié)

本文分析了Twitter在采用Redux架構(gòu)下的數(shù)據(jù)設(shè)計(jì)結(jié)構(gòu),在一個(gè)復(fù)雜的場(chǎng)景下,希望引起讀者對(duì)redux能有一個(gè)更深入的認(rèn)識(shí)。

本文主體內(nèi)容翻譯自Ryan Johnson的文章:Dissecting Twitter’s Redux Store,筆者進(jìn)行了一定程度的拓展。

Happy coding!

PS: 作者Github倉庫,歡迎通過代碼各種形式交流。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/82747.html

相關(guān)文章

  • 前端進(jìn)階資源整理

    摘要:前端進(jìn)階進(jìn)階構(gòu)建項(xiàng)目一配置最佳實(shí)踐狀態(tài)管理之痛點(diǎn)分析與改良開發(fā)中所謂狀態(tài)淺析從時(shí)間旅行的烏托邦,看狀態(tài)管理的設(shè)計(jì)誤區(qū)使用更好地處理數(shù)據(jù)愛彼迎房源詳情頁中的性能優(yōu)化從零開始,在中構(gòu)建時(shí)間旅行式調(diào)試用輕松管理復(fù)雜狀態(tài)如何把業(yè)務(wù)邏輯這個(gè)故事講好和 前端進(jìn)階 webpack webpack進(jìn)階構(gòu)建項(xiàng)目(一) Webpack 4 配置最佳實(shí)踐 react Redux狀態(tài)管理之痛點(diǎn)、分析與...

    BlackMass 評(píng)論0 收藏0
  • 前端每周清單半年盤點(diǎn)之 React 與 ReactNative 篇

    摘要:前端每周清單半年盤點(diǎn)之與篇前端每周清單專注前端領(lǐng)域內(nèi)容,以對(duì)外文資料的搜集為主,幫助開發(fā)者了解一周前端熱點(diǎn)分為新聞熱點(diǎn)開發(fā)教程工程實(shí)踐深度閱讀開源項(xiàng)目巔峰人生等欄目。與求同存異近日,宣布將的構(gòu)建工具由遷移到,引發(fā)了很多開發(fā)者的討論。 前端每周清單半年盤點(diǎn)之 React 與 ReactNative 篇 前端每周清單專注前端領(lǐng)域內(nèi)容,以對(duì)外文資料的搜集為主,幫助開發(fā)者了解一周前端熱點(diǎn);分為...

    Barry_Ng 評(píng)論0 收藏0
  • 正則表達(dá)式

    摘要:最全正則表達(dá)式總結(jié)驗(yàn)證號(hào)手機(jī)號(hào)中文郵編身份證地址等是正則表達(dá)式的縮寫,作用是對(duì)字符串執(zhí)行模式匹配。學(xué)習(xí)目標(biāo)了解正則表達(dá)式語法在中使用正則表達(dá)式在中使 JS高級(jí)技巧 本篇是看的《JS高級(jí)程序設(shè)計(jì)》第23章《高級(jí)技巧》做的讀書分享。本篇按照書里的思路根據(jù)自己的理解和經(jīng)驗(yàn),進(jìn)行擴(kuò)展延伸,同時(shí)指出書里的一些問題。將會(huì)討論安全的類型檢測(cè)、惰性載入函數(shù)、凍結(jié)對(duì)象、定時(shí)器等話題。1. 安全的類型檢測(cè)...

    yibinnn 評(píng)論0 收藏0
  • 「真?全棧之路」Web前端開發(fā)的后端指南

    前言 在若干次前的一場(chǎng)面試,面試官看我做過python爬蟲/后端 的工作,順帶問了我些后端相關(guān)的問題:你覺得什么是后端? 送命題。當(dāng)時(shí)腦瓦特了,答曰:邏輯處理和數(shù)據(jù)增刪改查。。。 showImg(https://user-gold-cdn.xitu.io/2019/4/24/16a4ed4fc8c18078); 當(dāng)場(chǎng)被懟得體無完膚,羞愧難當(dāng)。事后再反思這問題,結(jié)合資料總結(jié)了一下。發(fā)現(xiàn)自己學(xué)過的Re...

    chuyao 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<