前端JS日志采集的幾種方式盤點
1. + GIF / Pixel 上報
原理: 通過在頁面上動態(tài)創(chuàng)建一個Image對象,把要上報的數(shù)據(jù)編碼到請求 URL 的 query 參數(shù)中,然后加載一個 1x1 的透明 GIF 圖片(當(dāng)然不需要真的返回一張圖,后端 204 也行),重點是通過src請求資源的同時,讓服務(wù)端記錄.gif后的數(shù)據(jù)。
代碼示例:
const img = new Image(); img.src = `https://logserver.com/collect?event=click&userId=123`;
優(yōu)點:
- 兼容性超好,從古早 IE 到現(xiàn)代瀏覽器都能用。
- 不受 CORS 限制,因為圖片加載天然跨域。
- 簡單,幾乎不會影響頁面性能。
缺點:
- 請求量小,受 URL 長度限制(一般 2KB 左右)。
- 只能 GET,不能 POST。
- 無法拿到發(fā)送成功或失敗的準(zhǔn)確回調(diào)。
適用場景:
- 簡單 PV/UV 打點,曝光上報。
- 無需保證必達(dá),只要發(fā)出請求就行。
2. fetch / XMLHttpRequest 上報
原理: 使用fetch或者XMLHttpRequest直接發(fā) HTTP 請求,數(shù)據(jù)格式可以是 JSON 或表單數(shù)據(jù),GET/POST 都行。
代碼示例:
js
體驗AI代碼助手
代碼解讀
復(fù)制代碼
// fetch版
fetch('https://logserver.com/collect', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ event: 'click', userId: 123 })
});
優(yōu)點:
- 可以 POST,支持大體積數(shù)據(jù)。
- 可以拿到請求成功或失敗的反饋。
- 靈活,能帶復(fù)雜頭部,比如認(rèn)證信息。
缺點:
- 受 CORS 限制,需要服務(wù)器支持。
- 發(fā)送過程中可能阻塞主線程,尤其是同步 XHR。
- 如果頁面關(guān)閉得太快,可能請求還沒發(fā)出去(不過可以用
keepalive選項優(yōu)化)。
適用場景:
- 錯誤日志、性能埋點。
- 需要可靠上報、需要認(rèn)證或者復(fù)雜參數(shù)時。
3. navigator.sendBeacon
原理: 專門為這種場景設(shè)計的 API,可以在頁面卸載(比如跳轉(zhuǎn)、關(guān)閉)時,異步且可靠地把數(shù)據(jù)發(fā)送到服務(wù)器,不阻塞頁面卸載流程。
代碼示例:
navigator.sendBeacon('https://logserver.com/collect', JSON.stringify({ event: 'unload', userId: 123 }));
優(yōu)點:
- 適合頁面關(guān)閉前發(fā)送數(shù)據(jù),不容易丟包。
- 不阻塞 unload 流程,不卡界面。
- 支持 POST,發(fā)送簡單。
缺點:
- 兼容性略差(但現(xiàn)在主流瀏覽器基本都支持了)。
- 不支持自定義請求頭。
- 只支持 Content-Type 是
application/x-www-form-urlencoded或text/plain的請求體。
適用場景:
- 頁面 unload 時的上報,比如用戶行為日志、退出日志。
4. WebSocket 上報
原理: 建立長連接,把日志實時推送到服務(wù)器。
優(yōu)點:
- 實時性超強(qiáng)。
- 理論上吞吐量高,連接一旦建立數(shù)據(jù)傳輸非常輕量。
缺點:
- 建連、?;钣谐杀荆苿佣嘶蛉蹙W(wǎng)環(huán)境下容易掉線。
- 服務(wù)端也要有能力管理大量持久連接。
- 不適合小流量、輕量應(yīng)用。
適用場景:
- 高實時要求的埋點,比如游戲、IM、股票類應(yīng)用。
總結(jié)
| 方式 | 優(yōu)勢 | 劣勢 | 常用場景 |
|---|---|---|---|
| + GIF | 簡單兼容 | 只能 GET,小數(shù)據(jù)量 | 曝光打點 |
| fetch/XHR | 靈活可靠 | 受 CORS 限制 | 錯誤日志、性能上報 |
| sendBeacon | 頁面關(guān)閉也能發(fā) | 兼容性略差,簡單數(shù)據(jù) | 離開頁面上報 |
| WebSocket | 實時性強(qiáng) | 成本高 | 游戲、IM 實時上報 |
實際開發(fā)里,我們會根據(jù)業(yè)務(wù)場景,多種方式結(jié)合使用:普通打點用fetch,頁面 unload 用sendBeacon,曝光用Image兜底,再加一些重試機(jī)制,做到不丟、不卡、可靠。
以上就是前端JS日志采集的幾種方式盤點的詳細(xì)內(nèi)容,更多關(guān)于前端JS日志采集方式的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Js類的靜態(tài)方法與實例方法區(qū)分及jQuery拓展的兩種方法
這篇文章主要介紹了Js類的靜態(tài)方法與實例方法區(qū)分及jQuery拓展的兩種方法 的相關(guān)資料,對靜態(tài)方法(Static)和實例方法(非Static)不太理解的朋友可以一起學(xué)習(xí)下2016-06-06
JS控件autocomplete 0.11演示及下載 1月5日已更新
JS控件autocomplete 0.11演示及下載 1月5日已更新...2007-01-01
javascript中強(qiáng)制執(zhí)行toString()具體實現(xiàn)
Javascript通常會根據(jù)方法或運算符的需要而自動把值轉(zhuǎn)成所需的類型,這可能導(dǎo)致各種錯誤,接下來為大家介紹下javascript如何強(qiáng)制執(zhí)行toString(),感興趣的朋友可以參考下哈2013-04-04
javascript 數(shù)組去重復(fù)(在線去重工具)
很多情況下我們需要去掉重復(fù)的內(nèi)容,一般我們都是將很多內(nèi)容放到一個數(shù)組里面,然后再去重復(fù),這里簡單為大家整理一下2016-12-12
微信小程序中如何使用flyio封裝網(wǎng)絡(luò)請求
這篇文章主要介紹了微信小程序中如何使用flyio封裝網(wǎng)絡(luò)請求,F(xiàn)ly.js 通過在不同 JavaScript 運行時通過在底層切換不同的 Http Engine來實現(xiàn)多環(huán)境支持,但同時對用戶層提供統(tǒng)一、標(biāo)準(zhǔn)的Promise API,需要的朋友可以參考下2019-07-07
Bootstrap~多級導(dǎo)航(級聯(lián)導(dǎo)航)的實現(xiàn)效果【附代碼】
下面小編就為大家分享一篇Bootstrap~多級導(dǎo)航(級聯(lián)導(dǎo)航)的實現(xiàn)效果【附代碼】。小編覺得挺不錯。希望對大家有所幫助。一起跟隨小編過來看看吧2016-03-03
Bootstrap教程JS插件彈出框?qū)W習(xí)筆記分享
這篇文章主要為大家分享了Bootstrap教程JS插件彈出框?qū)W習(xí)筆記,為大家詳細(xì)介紹Bootstrap彈出框的使用方法,感興趣的小伙伴們可以參考一下2016-05-05

