前端常用的通訊技術

發表於2017-07-05

前段時間在忙開發攜程運動專案和相應的微信小程式,其中和後端通訊猶為頻繁。get、post請求方法是很多前端童鞋使用最頻繁的;websocket在11年盛行後方便了客戶端和伺服器之間傳輸,……and so on ,除了這些,還有很多我們不常使用的其他方式,但是在實際的業務場景中卻真實需要。

本文總結了目前前端使用到的資料交換方式,闡述了業務場景中如何選擇適合的方式進行資料交換( form ,xhr, fetch, SSE, webstock, postmessage, web workers等),並列舉了一些示例程式碼, 可能存在不足的地方,歡迎大家指正。

本文用到的原始碼都放在Github上,點選下方閱讀原文可直達。

關於HTTP協義基礎可以參考阮一峰老師的《HTTP協議入門》一文。

前端經常使用的HTTP協議相關(1.0 / 1.1)method

  • GET ( 對應 restful api 查詢資源, 用於客戶端從服務端取資料 )
  • POST(對應 restful api中的增加資源, 用於客戶端傳資料到服務端)
  • PUT (對應 restful api中的更新資源)
  • DELETE ( 對應 restful api中的刪除資源 )
  • HEAD ( 可以用於http請求的時間什麼,或者判斷是否存在判斷檔案大小等)
  • OPTIONS (在前端中常用於 cors跨域驗證)
  • TRACE * (我這邊沒有用到過,歡迎補充)
  • CONNECT * (我這邊沒有用到過,歡迎補充)

enctype

  • application/x-www-form-urlencoded (預設,正常的提交方式)
  • multipart/form-data(有上傳檔案時常用這種)
  • application/json (ajax常用這種格式)
  • text/xml
  • text/plain

enctype示例說明( form , ajax, fetch 三種示例 )

服務端 form_action.php

* fetch api是基於Promise設計
* fetch 的一些例子 mdn/fetch-examples

伺服器到客戶端的推送 – Server-sent Events這個是html5的一個新特性,主要用於伺服器推送訊息到客戶端, 可以用於監控,通知,更新庫存之類的應用場景, 在攜程運動專案中我們主要應用於線上被預訂後通知下發通知到場館的操作介面上的即時改變狀態。

前端常用的通訊技術

圖片來源於網路,侵刪

優點: 基於http協義無需特別的改造,除錯方便, 可以CORS跨域
server-send events 是服務端往客戶端單向推送的,如果客戶端需要上傳訊息可以使用 WebSocket

客戶端程式碼

服務端程式碼

前端常用的通訊技術

對於低版本的瀏覽器可以使用 eventsource polyfill

  • Yaffle/EventSource by yaffle
  • https://github.com/remy/polyfills/blob/master/EventSource.js by Remy Sharp
  • rwaldron/jquery.eventsource by Rick Waldron
  • amvtek/EventSource by AmvTek

客戶端與伺服器雙向通訊 WebSocket

特點

1. websocket 是個雙向的通訊。
2. 常用於應用於一些都需要雙方互動的,實時性比較強的地方(如聊天,線上客服)
3. 資料傳輸量小
4. websocket 是個 持久化的連線

原理圖前端常用的通訊技術

圖片來源於網路. 侵刪

這個的服務端是基於 nodejs實現的(不要問為什麼不是php,因為 nodejs 簡單些!)

server.js

client.html

說完了客戶端與服客端之間的通訊,現在我們來聊聊客戶端之間的通訊。

客戶端與客戶端頁面之間的通訊 postMessage

主要特點

1. window.postMessage() 方法可以安全地實現跨域通訊
2.主要用於兩個頁面之間的訊息傳送
3. 可以使用iframe與window.open開啟的頁面進行通訊.

特別的應用場景
我們的頁面引用了其他的人頁面,但我們不知道他們的頁面高度,這時可以通過window.postMessages 從iframe 裡面的頁面來傳到 當前頁面.

語法

示例程式碼
postmessage.html (入口)

post1.html

post2.html

Web Workers 程式通訊(html5中的js的後臺程式)javascript設計上是一個單線,也就是說在執行js過程中只能執行一個任務, 其他的任務都在佇列中等待執行。

如果我們執行大量計算的任務時,就會阻止瀏覽器執行js,導致瀏覽器假死。

html5的 web Workers 子程式 就是為了解決這種問題而設計的。把大量計算的任務當作類似ajax非同步方式進入子程式計算,計算完了再通過 postmessage通知主程式計算結果。

前端常用的通訊技術圖片來源於網路. 侵刪

主執行緒程式碼(index.html)

後臺程式程式碼( compute.js )

上述程式碼簡單的說明一下, 主程式與後臺程式之間的互相通訊。

(攜程技術中心市場營銷研發部武藝嬙,對本文亦有貢獻)

 

相關文章