最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何用原生JS+Vue實(shí)現(xiàn)一套可復(fù)用的前端錯(cuò)誤監(jiān)控系統(tǒng)

 更新時(shí)間:2025年08月22日 09:00:29   作者:前端世界  
在現(xiàn)代前端開發(fā)中,錯(cuò)誤監(jiān)控系統(tǒng)是保障應(yīng)用穩(wěn)定性和用戶體驗(yàn)的核心組件,這篇文章主要介紹了如何用原生JS+Vue實(shí)現(xiàn)一套可復(fù)用的前端錯(cuò)誤監(jiān)控系統(tǒng)的相關(guān)資料,需要的朋友可以參考下

摘要

隨著前端項(xiàng)目變得越來越復(fù)雜,一點(diǎn)小小的異常都有可能導(dǎo)致頁(yè)面白屏、功能不可用,甚至用戶直接流失。為了盡早發(fā)現(xiàn)這些問題,我們需要在項(xiàng)目中構(gòu)建一個(gè)前端錯(cuò)誤監(jiān)控系統(tǒng),能自動(dòng)捕獲錯(cuò)誤、記錄上下文、上報(bào)后端,輔助我們快速定位問題,保障線上應(yīng)用的穩(wěn)定運(yùn)行。

引言

雖然市面上已有如 Sentry、Fundebug 等成熟的監(jiān)控平臺(tái),但對(duì)于部分項(xiàng)目(特別是中小項(xiàng)目)來說,要么成本太高,要么無(wú)法靈活定制。這時(shí)候,自己搭建一套“夠用”的前端監(jiān)控系統(tǒng),就是非常實(shí)際的選擇。

本文將手把手帶你實(shí)現(xiàn)一個(gè)前端錯(cuò)誤監(jiān)控系統(tǒng),包括常見錯(cuò)誤捕獲方法、信息收集、后端上報(bào)接口以及典型的實(shí)際使用場(chǎng)景。

前端錯(cuò)誤監(jiān)控系統(tǒng)的搭建思路

全局錯(cuò)誤捕獲方式

JavaScript 運(yùn)行時(shí)錯(cuò)誤

// 捕獲運(yùn)行時(shí)錯(cuò)誤(語(yǔ)法錯(cuò)誤、null 訪問等)
window.onerror = function (message, source, lineno, colno, error) {
  reportError({
    type: 'js_error',
    message,        // 錯(cuò)誤信息
    source,         // 出錯(cuò)文件
    lineno,         // 行號(hào)
    colno,          // 列號(hào)
    stack: error?.stack // 錯(cuò)誤堆棧
  });
};

解釋:當(dāng)你訪問未定義變量、或函數(shù)中拋出異常,這個(gè)函數(shù)會(huì)第一時(shí)間捕獲它,并將錯(cuò)誤信息打包給 reportError 函數(shù)。

靜態(tài)資源加載錯(cuò)誤(圖片、CSS、JS)

window.addEventListener('error', function (e) {
  // 過濾 JS 運(yùn)行錯(cuò)誤,保留資源加載錯(cuò)誤
  if (e.target && e.target !== window) {
    reportError({
      type: 'resource_error',
      tagName: e.target.tagName,       // 資源標(biāo)簽名(如 IMG / SCRIPT)
      src: e.target.src || e.target.href // 資源地址
    });
  }
}, true);

解釋:這個(gè)事件在 true 捕獲階段觸發(fā),可以監(jiān)聽資源文件加載失敗,比如圖片 404 或字體文件加載不到。

Promise 未處理異常

window.addEventListener('unhandledrejection', function (e) {
  reportError({
    type: 'promise_error',
    reason: e.reason?.message || JSON.stringify(e.reason) // 兼容各種 Promise 報(bào)錯(cuò)內(nèi)容
  });
});

解釋:這類錯(cuò)誤通常出現(xiàn)在你 fetch() 或異步函數(shù)沒有 .catch() 的時(shí)候,可能會(huì)被忽略,非常隱蔽。

錯(cuò)誤信息統(tǒng)一上報(bào)接口

我們將捕獲到的錯(cuò)誤發(fā)送到服務(wù)器接口,一般推薦使用異步請(qǐng)求。

function reportError(errorInfo) {
  try {
    const payload = {
      ...errorInfo,
      url: location.href,
      userAgent: navigator.userAgent,
      time: Date.now()
    };

    // 推薦使用 sendBeacon,不阻塞主線程
    if (navigator.sendBeacon) {
      navigator.sendBeacon('/api/log/error', JSON.stringify(payload));
    } else {
      fetch('/api/log/error', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(payload)
      });
    }
  } catch (e) {
    console.warn('reportError 發(fā)送失敗', e);
  }
}

說明:

  • sendBeacon():適合在頁(yè)面卸載時(shí)使用,保證日志能發(fā)出去。
  • 加了 try-catch 防止監(jiān)控代碼本身出錯(cuò)。

在框架中接入錯(cuò)誤監(jiān)控

Vue 應(yīng)用錯(cuò)誤捕獲(Vue 3)

import { createApp } from 'vue';
import App from './App.vue';

const app = createApp(App);

// Vue 全局錯(cuò)誤處理
app.config.errorHandler = (err, instance, info) => {
  reportError({
    type: 'vue_error',
    message: err.message,
    stack: err.stack,
    info
  });
};

app.mount('#app');

說明:配合 Vue 的生命周期,能捕獲組件內(nèi)部的渲染錯(cuò)誤、生命周期鉤子中的異常。

用戶提示與異常處理

你可以根據(jù)錯(cuò)誤類型,給用戶展示提示信息,而不是直接頁(yè)面崩潰。

function handleUserNotice(errorInfo) {
  if (errorInfo.type === 'js_error') {
    alert('頁(yè)面出現(xiàn)了一些小問題,請(qǐng)刷新后重試');
  }
}

還可以加入“自動(dòng)恢復(fù)機(jī)制”或“點(diǎn)擊重試按鈕”。

典型使用場(chǎng)景舉例

場(chǎng)景 1:用戶打開頁(yè)面就白屏,控制臺(tái)報(bào)錯(cuò)

可能是初始化代碼異常。我們可以在入口加上 try-catch:

try {
  app.mount('#app');
} catch (e) {
  reportError({
    type: 'entry_error',
    message: e.message,
    stack: e.stack
  });
}

場(chǎng)景 2:資源加載失敗導(dǎo)致圖標(biāo)不顯示

在加載資源時(shí)增加標(biāo)識(shí):

<link rel="stylesheet" href="cdn/font-awesome.css" rel="external nofollow"  data-monitor="true">

然后在錯(cuò)誤監(jiān)聽中判斷:

if (e.target.dataset.monitor === 'true') {
  reportError({
    type: 'resource_error',
    src: e.target.href,
    tag: e.target.tagName
  });
}

場(chǎng)景 3:用戶點(diǎn)擊按鈕后無(wú)響應(yīng)

可能是某個(gè)異步請(qǐng)求失敗但未 catch:

fetch('/api/data')
  .then(res => res.json())
  .then(data => {
    processData(data);
  });
  // 忘記加 .catch

通過 unhandledrejection 我們可以自動(dòng)捕獲到:

window.addEventListener('unhandledrejection', function (e) {
  reportError({
    type: 'promise_error',
    reason: e.reason
  });
});

QA 問答環(huán)節(jié)

Q:這個(gè)監(jiān)控系統(tǒng)會(huì)影響頁(yè)面性能嗎?

不會(huì)。錯(cuò)誤上報(bào)是異步的,不會(huì)阻塞主線程。你還可以批量收集再統(tǒng)一發(fā)送,進(jìn)一步降低影響。

Q:如果錯(cuò)誤很多,會(huì)不會(huì)一直重復(fù)上報(bào)?

建議加入簡(jiǎn)單去重機(jī)制,例如根據(jù) message + stack 做 hash,存在緩存中,5分鐘內(nèi)相同的不再重復(fù)上報(bào)。

Q:如何知道哪些頁(yè)面報(bào)錯(cuò)多?

你可以在錯(cuò)誤上報(bào)接口中增加字段,比如:

pagePath: location.pathname

后端聚合統(tǒng)計(jì)后,就能知道哪些頁(yè)面最容易出問題。

總結(jié)

搭建前端錯(cuò)誤監(jiān)控系統(tǒng)并不難,只要掌握:

  • 錯(cuò)誤的捕獲機(jī)制(onerrorerror 事件、Promise 異常等)
  • 上下文數(shù)據(jù)收集
  • 合理的后端上報(bào)方式
  • 框架錯(cuò)誤集成(Vue、React 等)

這樣的監(jiān)控系統(tǒng),可以幫助你第一時(shí)間發(fā)現(xiàn)問題、快速定位、避免用戶流失。

到此這篇關(guān)于如何用原生JS+Vue實(shí)現(xiàn)一套可復(fù)用的前端錯(cuò)誤監(jiān)控系統(tǒng)的文章就介紹到這了,更多相關(guān)JS+Vue前端錯(cuò)誤監(jiān)控系統(tǒng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Javascript作用域和作用域鏈原理解析

    Javascript作用域和作用域鏈原理解析

    這篇文章主要介紹了Javascript作用域和作用域鏈原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • three.js中點(diǎn)對(duì)象(Point)和點(diǎn)材質(zhì)(PointsMaterial)的具體使用

    three.js中點(diǎn)對(duì)象(Point)和點(diǎn)材質(zhì)(PointsMaterial)的具體使用

    本文主要介紹了three.js中點(diǎn)對(duì)象(Point)和點(diǎn)材質(zhì)(PointsMaterial)的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 詳解如何較好的使用js

    詳解如何較好的使用js

    本文將對(duì)在網(wǎng)頁(yè)中引用js常會(huì)出現(xiàn)的問題進(jìn)行匯總,并提出解決問題的具體方案,有助于我們更好的學(xué)習(xí)和使用js,需要的朋友一起來看下吧
    2016-12-12
  • JS document form表單元素操作完整示例

    JS document form表單元素操作完整示例

    這篇文章主要介紹了JS document form表單元素操作,結(jié)合完整實(shí)例形式詳細(xì)分析了JavaScript form表單元素獲取、輸出、遍歷等相關(guān)操作技巧,需要的朋友可以參考下
    2020-01-01
  • JS封裝通過className獲取元素的函數(shù)示例

    JS封裝通過className獲取元素的函數(shù)示例

    這篇文章主要介紹了JS封裝通過className獲取元素的函數(shù),涉及javascript針對(duì)頁(yè)面元素屬性的遍歷與數(shù)組相關(guān)操作技巧,需要的朋友可以參考下
    2016-12-12
  • 一文讓你徹底搞懂TypeScript(TS)和JavaScript(JS)區(qū)別與聯(lián)系

    一文讓你徹底搞懂TypeScript(TS)和JavaScript(JS)區(qū)別與聯(lián)系

    TS是JS的超集,是一個(gè)可選的、靜態(tài)的類型系統(tǒng),下面這篇文章主要介紹了關(guān)于TypeScript(TS)和JavaScript(JS)區(qū)別與聯(lián)系的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • JavaScript簡(jiǎn)單獲取系統(tǒng)當(dāng)前時(shí)間完整示例

    JavaScript簡(jiǎn)單獲取系統(tǒng)當(dāng)前時(shí)間完整示例

    這篇文章主要介紹了JavaScript簡(jiǎn)單獲取系統(tǒng)當(dāng)前時(shí)間的方法,涉及javascript針對(duì)日期與時(shí)間的判斷以及字符串組合的相關(guān)技巧,需要的朋友可以參考下
    2016-08-08
  • JavaScript數(shù)組方法push()、forEach()、filter()、sort()實(shí)戰(zhàn)教程

    JavaScript數(shù)組方法push()、forEach()、filter()、sort()實(shí)戰(zhàn)教程

    在JS中,數(shù)組方法是非常重要且常用的的方法,下面這篇文章主要介紹了JavaScript數(shù)組方法push()、forEach()、filter()、sort()的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-01-01
  • JavaScript 截取字符串代碼實(shí)例

    JavaScript 截取字符串代碼實(shí)例

    這篇文章主要介紹了JavaScript 截取字符串代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • JS純前端實(shí)現(xiàn)瀏覽器語(yǔ)音播報(bào)、朗讀功能的完整代碼

    JS純前端實(shí)現(xiàn)瀏覽器語(yǔ)音播報(bào)、朗讀功能的完整代碼

    在現(xiàn)代互聯(lián)網(wǎng)的發(fā)展中,語(yǔ)音技術(shù)正逐漸成為改變用戶體驗(yàn)的重要一環(huán),下面這篇文章主要介紹了JS純前端實(shí)現(xiàn)瀏覽器語(yǔ)音播報(bào)、朗讀功能的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-09-09

最新評(píng)論

罗定市| 岳池县| 玉山县| 永泰县| 鸡西市| 荣成市| 济宁市| 乌苏市| 新安县| 屯门区| 宁蒗| 舒兰市| 嘉定区| 高雄县| 永城市| 泗水县| 来安县| 台南市| 吉安市| 汉寿县| 张家港市| 潮州市| 江陵县| 曲沃县| 府谷县| 观塘区| 临沧市| 诸城市| 安新县| 永兴县| 开远市| 裕民县| 江源县| 中牟县| 拉萨市| 宕昌县| 马尔康县| 乌兰浩特市| 灵石县| 文安县| 色达县|