三脉顿、TogetherJS的閃電提速

在協(xié)同辦公的場(chǎng)景中,Mozilla 開源的together.JS提供了非常豐富的功能基礎(chǔ)点寥,稍加修改就能滿足我們的很多需求艾疟。

上一章說了,TJS很慢敢辩,要解決這個(gè)問題就得先弄明白慢的原因是什么蔽莱?
一步步來,先從首頁(yè)加載開始责鳍。

注意:在本章需要websocket協(xié)議的相關(guān)知識(shí)碾褂,如有欠缺請(qǐng)自查百度。

3.1 首頁(yè)加載的速度優(yōu)化

我們以“tinymce”為例历葛,看看開銷大戶都有什么正塌,還是老方法,帶著問題找答案恤溶。

指南針
Netword
Console

看著有點(diǎn)兒亂乓诽,先把這些失敗的請(qǐng)求過一遍,把無關(guān)緊要的砍掉:

  • 干掉google的analytics.js咒程、ga.js 鸠天;
  • 干掉tabzilla.js ;

關(guān)掉這些資源之后帐姻,效果很明顯稠集。尤其是google那幾個(gè),嚴(yán)重影響了加載時(shí)間饥瓷。索性我們把沒用的東西都拿掉剥纷,就留一個(gè)干干凈凈的編輯框,看看首頁(yè)的加載能是什么速度呢铆?

  • 干掉Mozilla的Header和Footer晦鞋;
  • 干掉Bootstrap、parallax和scrollspy等其他js;
  • 干掉沒有的CSS悠垛;
  • ……
current index.hmlt

當(dāng)我把index.hmlt 精簡(jiǎn)成上圖那樣线定,再來看看首頁(yè)的加載速度:

nice

秒進(jìn),我們的目的達(dá)到了确买。也許首頁(yè)加載還有優(yōu)化的可能斤讥,但這不再是本文的重點(diǎn),我們解決下一個(gè)問題拇惋。

3.2 事件通知延遲的原因

在優(yōu)化之前周偎,我先介紹一下在“tinymce”這個(gè)例子中TJS的實(shí)現(xiàn)邏輯。
在together.js的背后撑帖,有這么多js的庫(kù)的支持,它們的作用都是什么呢澳眷?

備注:

為了debug方便胡嘿,要關(guān)掉git原始邏輯中的時(shí)間戳命名,方法是在together.js中注釋掉這一行钳踊。

together.js 421

在“tinymce”這個(gè)例子中衷敌,會(huì)用到的庫(kù)有:

  • forms.js :封裝了CodeMirror 、ACE 等編輯器的交互接口拓瞪;
  • session.js :業(yè)務(wù)層核心庫(kù)缴罗,定義消息規(guī)則與實(shí)現(xiàn)邏輯;
  • channels.js :WebSockets 抽象接口祭埂,為session.js提供ws協(xié)議代理面氓,同時(shí)完成json的編解碼工作;

它們是如何工作的呢蛆橡?接下來我用添加一個(gè)字符為例舌界,講述他們的關(guān)系和together.js遇到的問題

模塊關(guān)系
  1. forms中的_change()方法是編輯器修改的回調(diào)接口,通過該方法能拿到編輯器中的狀態(tài)和內(nèi)容泰演;
  2. session中的session.send方法可以組織數(shù)據(jù)呻拌,調(diào)用channels中的_send發(fā)送websocket報(bào)文;

我們來分析一下睦焕,在上述邏輯關(guān)系中藐握,得到下面這種現(xiàn)象的原因到底是什么?

send and rect

輸入一個(gè)字符垃喊,在另外一端得到響應(yīng)猾普,需要3秒以上的延遲。

  • 是forms的回調(diào)慢造成的嗎缔御?不是抬闷!
  • 是session組織數(shù)據(jù)太復(fù)雜造成的嗎?不是!
  • 那直接的原因就是channels在封裝websocket時(shí)出了問題笤成!

3.3 事件通知延遲的優(yōu)化

TJS的模塊層次還是很清晰的评架,如果只是websocket封裝除了問題,我們只需要修改channels中的邏輯炕泳,其他內(nèi)容不變纵诞。

優(yōu)化兩個(gè)問題:

  • channels都封裝了哪些接口,它內(nèi)部邏輯是什么培遵?
  • 什么原因?qū)е铝搜舆t的出現(xiàn)浙芙?
channels.js

TJS還是比較原始的,在_setupConnection方法中籽腕,它通過WebSocket()創(chuàng)建ws連接嗡呼,同時(shí)綁定收據(jù)收發(fā)的方法。

在這里我要聲明一下皇耗,前陣子解決這個(gè)問題的時(shí)候南窗,我并沒有找到channels內(nèi)延遲的真正原因!非常遺憾郎楼,我的解決方法是用socket.io 重寫channels模塊万伤,重寫_send和_setupConnection等方法。

send message
recv message

最終的結(jié)果就是呜袁,把原來的3秒延遲提高到了幾十毫秒敌买,最快也幾毫秒就能得到響應(yīng)!

3.4后記

對(duì)于提速這件事阶界,有收獲也有遺憾虹钮。這些工作是在三周前就做完了。寫博客的過程也是一次回顧的過程荐操,對(duì)當(dāng)時(shí)的一些想法也有了新的認(rèn)識(shí)芜抒。這系列的文檔我會(huì)一直寫下去,預(yù)計(jì)會(huì)有五個(gè)章節(jié)托启。
對(duì)于together.js 宅倒,我的結(jié)論是:

  • 這是一個(gè)非常優(yōu)秀的開源庫(kù),在協(xié)同解決方案上能給我們巨大的啟迪屯耸;
  • 這是一個(gè)好用的開源庫(kù)拐迁,模塊清晰權(quán)責(zé)明確,二次修改不費(fèi)勁疗绣;

好了线召,第三章也寫完了,下一步要做的就是精簡(jiǎn)指令多矮,敬請(qǐng)期待下一章內(nèi)容缓淹!

協(xié)同利器——together.js的應(yīng)用開發(fā)目錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哈打,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子讯壶,更是在濱河造成了極大的恐慌料仗,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伏蚊,死亡現(xiàn)場(chǎng)離奇詭異立轧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)躏吊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門氛改,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人比伏,你說我怎么就攤上這事胜卤。” “怎么了赁项?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵瑰艘,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我肤舞,道長(zhǎng),這世上最難降的妖魔是什么均蜜? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任李剖,我火速辦了婚禮,結(jié)果婚禮上囤耳,老公的妹妹穿的比我還像新娘篙顺。我一直安慰自己,他們只是感情好充择,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布德玫。 她就那樣靜靜地躺著,像睡著了一般椎麦。 火紅的嫁衣襯著肌膚如雪宰僧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天观挎,我揣著相機(jī)與錄音琴儿,去河邊找鬼。 笑死嘁捷,一個(gè)胖子當(dāng)著我的面吹牛造成,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雄嚣,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼晒屎,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鼓鲁,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤蕴轨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后坐桩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尺棋,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年绵跷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了膘螟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碾局,死狀恐怖荆残,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情净当,我是刑警寧澤内斯,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站像啼,受9級(jí)特大地震影響俘闯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜忽冻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一真朗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧僧诚,春花似錦遮婶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至慈省,卻和暖如春臀防,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辫呻。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工清钥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人放闺。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓祟昭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親怖侦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子篡悟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

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