Medium.com 的前端技術基於什麼,有怎樣的特點?
Medium
簡單分析:伺服器可以完成渲染,並且渲染後的首頁會同時包括 feed 的 JSON 內容;瀏覽器同樣可以通過 JSON 數據渲染。文章同樣道理。JavaScript 經過某種特定優化,未混淆。類似 ASM.js?https://dnqgz544uhbo8.cloudfront.net/_/fp/js/main-base.bundle.DImGiPCYnH-gW2A2BX9zag.js求更多具體分析和內幕。
Medium 用了三個和知乎同樣在使用的 Closure 相關工具,不得不說在 Google 之外很少見:
- Closure Library:提供定義和引用模塊的方式,以及一些 UI 組件(比如編輯器,Medium 在此之上做成了無形的,真是引人注目)。
- Closure Compiler:前端代碼進行優化壓縮的工具。
- Plovr:Closure Library 專用的模塊分組打包工具。
顧鵬說的渲染方式有點不對,pjax 和 SPA 的技術幾乎是對立的。Medium 是一個採用了 RESTful API 的 web app,它沒有直接替換 HTML,而是用 JSON + 模板來生成 HTML。我認為 Medium 在伺服器端和客戶端共用了模板,因此它能進行一致的渲染。當首屏載入時使用伺服器端渲染,之後的瀏覽使用客戶端渲染。這樣做的優點是對 SEO 友好,載入速度更快——首屏內容裡面有個 embedded 欄位,包含了文章的 JSON 表示,這節省了一個 HTTP 請求。文章對象裡面有個有趣的地方是, HTML 的結構化內容全部用被 JavaScript 化了——精確到任何塊級或內聯元素—— 這樣每個段落都可以由用戶添加註釋。
Medium 還有一篇文章分享了許多技術細節:Just a web page?
糾正,感謝顧鵬提供的文章鏈接,觀察了一些請求之後,發現 Medium 在文章頁面點擊左側菜單中的 Home 鏈接時,使用了 pjax 載入首頁的文章列表:Request URL:https://medium.com/?format=fragment
Request Method:GET
X-Response-Type:html-body
# 載入主資源,文章內容:
Request URL: https://medium.com/p/:postid
Request Method: GET
Accept: application/json
# 載入次級資源,此時文章內容已經提前顯示,沒有 side-loading:
GET https://medium.com/p/:postid/follow-ups
GET https://medium.com/p/:postid/upvotes
GET https://medium.com/p/:postid/notes
# 中途滾動,記錄當前正在閱讀的章節:
PUT https://medium.com/p/:postid/state/location
Request Payload: {paragraphName: "f169", sectionName: "0c50"}
# 滾動到頁面底端,標記為已讀:
PUT https://medium.com/p/:postid/state/read
# 滑鼠經過(不需要點擊)在底端的導航推薦文章鏈接之上時,預載其內容,並渲染成 DOM:
GET https://medium.com/:collection/:postid
Accept: application/json
最後一步預載內容就是出現多個 surface div 的原因,Medium 做的優化,以方便快速地切換頁面。
附上 DOM 斷點截圖(含 post 對象和模板):Update:
來看看Medium是如何load新文章的。1. 新的頁面:&
&...&
&
&...&