前端JS日志采集的幾種方式盤點(diǎn)
1. + GIF / Pixel 上報(bào)
原理: 通過(guò)在頁(yè)面上動(dòng)態(tài)創(chuàng)建一個(gè)Image對(duì)象,把要上報(bào)的數(shù)據(jù)編碼到請(qǐng)求 URL 的 query 參數(shù)中,然后加載一個(gè) 1x1 的透明 GIF 圖片(當(dāng)然不需要真的返回一張圖,后端 204 也行),重點(diǎn)是通過(guò)src請(qǐng)求資源的同時(shí),讓服務(wù)端記錄.gif后的數(shù)據(jù)。
代碼示例:
const img = new Image(); img.src = `https://logserver.com/collect?event=click&userId=123`;
優(yōu)點(diǎn):
- 兼容性超好,從古早 IE 到現(xiàn)代瀏覽器都能用。
- 不受 CORS 限制,因?yàn)?strong>圖片加載天然跨域。
- 簡(jiǎn)單,幾乎不會(huì)影響頁(yè)面性能。
缺點(diǎn):
- 請(qǐng)求量小,受 URL 長(zhǎng)度限制(一般 2KB 左右)。
- 只能 GET,不能 POST。
- 無(wú)法拿到發(fā)送成功或失敗的準(zhǔn)確回調(diào)。
適用場(chǎng)景:
- 簡(jiǎn)單 PV/UV 打點(diǎn),曝光上報(bào)。
- 無(wú)需保證必達(dá),只要發(fā)出請(qǐng)求就行。
2. fetch / XMLHttpRequest 上報(bào)
原理: 使用fetch或者XMLHttpRequest直接發(fā) HTTP 請(qǐng)求,數(shù)據(jù)格式可以是 JSON 或表單數(shù)據(jù),GET/POST 都行。
代碼示例:
js
體驗(yàn)AI代碼助手
代碼解讀
復(fù)制代碼
// fetch版
fetch('https://logserver.com/collect', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ event: 'click', userId: 123 })
});
優(yōu)點(diǎn):
- 可以 POST,支持大體積數(shù)據(jù)。
- 可以拿到請(qǐng)求成功或失敗的反饋。
- 靈活,能帶復(fù)雜頭部,比如認(rèn)證信息。
缺點(diǎn):
- 受 CORS 限制,需要服務(wù)器支持。
- 發(fā)送過(guò)程中可能阻塞主線程,尤其是同步 XHR。
- 如果頁(yè)面關(guān)閉得太快,可能請(qǐng)求還沒(méi)發(fā)出去(不過(guò)可以用
keepalive選項(xiàng)優(yōu)化)。
適用場(chǎng)景:
- 錯(cuò)誤日志、性能埋點(diǎn)。
- 需要可靠上報(bào)、需要認(rèn)證或者復(fù)雜參數(shù)時(shí)。
3. navigator.sendBeacon
原理: 專門為這種場(chǎng)景設(shè)計(jì)的 API,可以在頁(yè)面卸載(比如跳轉(zhuǎn)、關(guān)閉)時(shí),異步且可靠地把數(shù)據(jù)發(fā)送到服務(wù)器,不阻塞頁(yè)面卸載流程。
代碼示例:
navigator.sendBeacon('https://logserver.com/collect', JSON.stringify({ event: 'unload', userId: 123 }));
優(yōu)點(diǎn):
- 適合頁(yè)面關(guān)閉前發(fā)送數(shù)據(jù),不容易丟包。
- 不阻塞 unload 流程,不卡界面。
- 支持 POST,發(fā)送簡(jiǎn)單。
缺點(diǎn):
- 兼容性略差(但現(xiàn)在主流瀏覽器基本都支持了)。
- 不支持自定義請(qǐng)求頭。
- 只支持 Content-Type 是
application/x-www-form-urlencoded或text/plain的請(qǐng)求體。
適用場(chǎng)景:
- 頁(yè)面 unload 時(shí)的上報(bào),比如用戶行為日志、退出日志。
4. WebSocket 上報(bào)
原理: 建立長(zhǎng)連接,把日志實(shí)時(shí)推送到服務(wù)器。
優(yōu)點(diǎn):
- 實(shí)時(shí)性超強(qiáng)。
- 理論上吞吐量高,連接一旦建立數(shù)據(jù)傳輸非常輕量。
缺點(diǎn):
- 建連、?;钣谐杀荆苿?dòng)端或弱網(wǎng)環(huán)境下容易掉線。
- 服務(wù)端也要有能力管理大量持久連接。
- 不適合小流量、輕量應(yīng)用。
適用場(chǎng)景:
- 高實(shí)時(shí)要求的埋點(diǎn),比如游戲、IM、股票類應(yīng)用。
總結(jié)
| 方式 | 優(yōu)勢(shì) | 劣勢(shì) | 常用場(chǎng)景 |
|---|---|---|---|
| + GIF | 簡(jiǎn)單兼容 | 只能 GET,小數(shù)據(jù)量 | 曝光打點(diǎn) |
| fetch/XHR | 靈活可靠 | 受 CORS 限制 | 錯(cuò)誤日志、性能上報(bào) |
| sendBeacon | 頁(yè)面關(guān)閉也能發(fā) | 兼容性略差,簡(jiǎn)單數(shù)據(jù) | 離開(kāi)頁(yè)面上報(bào) |
| WebSocket | 實(shí)時(shí)性強(qiáng) | 成本高 | 游戲、IM 實(shí)時(shí)上報(bào) |
實(shí)際開(kāi)發(fā)里,我們會(huì)根據(jù)業(yè)務(wù)場(chǎng)景,多種方式結(jié)合使用:普通打點(diǎn)用fetch,頁(yè)面 unload 用sendBeacon,曝光用Image兜底,再加一些重試機(jī)制,做到不丟、不卡、可靠。
以上就是前端JS日志采集的幾種方式盤點(diǎn)的詳細(xì)內(nèi)容,更多關(guān)于前端JS日志采集方式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JS實(shí)現(xiàn)太極旋轉(zhuǎn)思路分析
本文主要對(duì)JS實(shí)現(xiàn)太極旋轉(zhuǎn)的思路進(jìn)行分析,步驟清晰,簡(jiǎn)短的文字,深入的理解。需要的朋友可以看下2016-12-12
js實(shí)現(xiàn)彈窗插件功能實(shí)例代碼分享
這篇文章主要介紹了2013-12-12
JavaScript下申明對(duì)象的幾種方法小結(jié)
在JavaScript中可以用下面的幾種方法申明對(duì)象:(從"Truly"的文章中學(xué)到)2008-10-10
小程序數(shù)據(jù)緩存機(jī)制應(yīng)用實(shí)現(xiàn)
這篇文章主要介紹了小程序數(shù)據(jù)緩存機(jī)制應(yīng)用實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
基于JavaScript實(shí)現(xiàn)五子棋游戲
這篇文章主要為大家詳細(xì)介紹了基于JavaScript實(shí)現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
小程序開(kāi)發(fā)基礎(chǔ)之view視圖容器
這篇文章主要介紹了小程序開(kāi)發(fā)基礎(chǔ)之view視圖容器,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
setTimeout與setInterval的區(qū)別淺析
這篇文章主要給大家介紹了關(guān)于setTimeout與setInterval區(qū)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03

