fetch和sendBeacon最大的區別
- fetch:頁面銷燬時的監控埋點大機率上報失敗,優先順序為 High
sendBeacon:
- 頁面銷燬時的監控埋點也傳送請求;
- 在瀏覽器空閒的時候非同步傳送資料,不影響頁面諸如 JS、CSS Animation 等執行,優先順序為 Lowest
需要注意的問題
一、跨域請求
使用 sendBeacon 發跨域請求時,需要注意以下兩點
- 不能設定 Access-Control-Allow-Origin 為 "*"
需要設定 Access-Control-Allow-Credentials: true
import cors from "@koa/cors" app.use(cors({Credentials: true}))
二、介面引數為 json型別時
sendBeacon Data 支援的引數型別如圖
Fetch post 請求,需要傳 http header:
headers: {'Content-Type': 'application/json',}
sendBeacon:使用Blob型別來實現。把Blob內容的格式型別設定為json格式
var data = { ajax_data: 22 };
var blob = new Blob([JSON.stringify(data)], {type : 'application/json'});
// Content-Type of the Beacon HTTP request will be application/json in this case
navigator.sendBeacon('ajax.php', blob);
在 iOS 13 的手機上 發現在端內開啟 webview 發生了崩潰,報錯資訊: iOS 13 不支援 POST body 裡面包含 Blob 或者 File 型別的資料。改成使用 fetch 請求後,上述問題不再復現。