前端项目中的Vue、React错误监听

 更新时间:2022年04月22日 11:33:10   作者:​ 服部   ​  
这篇文章主要介绍了前端项目中的Vue、React错误监听,文章围绕主题的相关资料展开详细内容介绍需要的小伙伴可以参考一下

一、 Vue 错误监听

题目:

如何统一监听 Vue 组件报错?

分析:

真实项目需要闭环,即考虑各个方面,除了基本的功能外,还要考虑性能优化、报错、统计等。 而个人项目、课程项目一般以实现功能为主,不会考虑这么全面。所以,没有实际工作经验的同学,不会了解如此全面。

window.onerror

可以监听当前页面所有的 JS 报错,jQuery 时代经常用。
注意,全局只绑定一次即可。不要放在多次渲染的组件中,这样容易绑定多次。

window.onerror = function(msg, source, line, column, error) {
    console.log('window.onerror---------', msg, source, line, column, error)
}
// 注意,如果用 window.addEventListener('error', event => {}) 参数不一样!!!

errorCaptured 生命周期

会监听所有下级组件的错误。可以返回 false 阻止向上传播,因为可能会有多个上级节点都监听错误。

errorCaptured(error, instance, info) {
    console.log('errorCaptured--------', error, instance, info)
}

errorHandler

全局的错误监听,所有组件的报错都会汇总到这里来。PS:如果 errorCaptured 返回 false 则不会到这里。

const app = createApp(App)
app.config.errorHandler = (error, instance, info) => {
    console.log('errorHandler--------', error, instance, info)
}

请注意,errorHandler 会阻止错误走向 window.onerror

PS:还有 warnHandler

异步错误

组件内的异步错误 errorHandler 监听不到,还是需要 window.onerror

mounted() {
    setTimeout(() => {
        throw new Error('setTimeout 报错')
    }, 1000)
},

答案

方式

  • errorCaptured 监听下级组件的错误,可返回 false 阻止向上传播
  • errorHandler 监听 Vue 全局错误
  • window.onerror 监听其他的 JS 错误,如异步

建议:结合使用

  • 一些重要的、复杂的、有运行风险的组件,可使用 errorCaptured 重点监听
  • 然后用 errorHandler window.onerror 候补全局监听,避免意外情况

扩展

Promise 监听报错要使用 window.onunhandledrejection

前端拿到错误监听之后,需要传递给服务端,进行错误收集和分析,然后修复 bug 。 后面会有一道面试题专门讲解。

二、React 错误监听

题目:

如何统一监听 React 组件报错?

分析:

真实项目需要闭环,即考虑各个方面,除了基本的功能外,还要考虑性能优化、报错、统计等。

ErrorBoundary

React 16+ 引入。可以监听所有下级组件报错,同时降级展示 UI 。
代码参考 ErrorBoundary.js 和 components/ErrorDemo

import React from 'react'

class ErrorBoundary extends React.Component {
    constructor(props) {
        super(props)
        this.state = {
            error: null // 存储当前的报错信息
        }
    }
    static getDerivedStateFromError(error) {
        // 更新 state 使下一次渲染能够显示降级后的 UI
        console.info('getDerivedStateFromError...', error)
        return { error }
    }
    componentDidCatch(error, errorInfo) {
        // 统计上报错误信息
        console.info('componentDidCatch...', error, errorInfo)
    }
    render() {
        if (this.state.error) {
            // 提示错误
            return <h1>报错了</h1>
        }

        // 没有错误,就渲染子组件
        return this.props.children
    }
}

export default ErrorBoundary

FunctionalDemo.js

import { useState, useEffect } from 'react'

function ErrorDemo() {
    const [num] = useState(100)

    function clickHandler() {
        num() // ErrorBoundary 无法监听事件报错,需要自行 try-catch
    }

    useEffect(() => {
        // throw new Error('mounted error') // ErrorBoundary 可监听渲染过程的报错
    }, [])

    return <div>
        <p>error demo - functional</p>
        <button onClick={clickHandler}>error</button>
    </div>
}

export default ErrorDemo

建议应用到最顶层,监听全局错误

// index.js 入口文件
ReactDOM.render(
  <React.StrictMode>
    <ErrorBoundary>
      <App />
    </ErrorBoundary>
  </React.StrictMode>,
  document.getElementById('root')
);

函数组件中也可以使用

function App(props) {
    return <ErrorBoundary>
        {props.children}
    </ErrorBoundary>
}

dev 和 build

dev 环境下无法看到 ErrorBoundary 的报错 UI 效果。会显示的提示报错信息。
yarn build 之后再运行,即可看到 UI 效果。

事件报错

React 不需要 ErrorBoundary 来捕获事件处理器中的错误。与 render 方法和生命周期方法不同,事件处理器不会在渲染期间触发。

如果你需要在事件处理器内部捕获错误,使用普通的 try-catch 语句。也可以使用全局的 window.onerror 来监听。

异步错误

ErrorBoundary 无法捕捉到异步报错,可使用 window.onerror 来监听。

window.onerror = function(msg, source, line, column, error) {
    console.log('window.onerror---------', msg, source, line, column, error)
}
// 注意,如果用 window.addEventListener('error', event => {}) 参数不一样!!!

答案

  • ErrorBoundary 监听渲染时报错
  • try-catch 和 window.onerror 捕获其他错误

扩展

Promise 监听报错要使用 window.onunhandledrejection

前端拿到错误监听之后,需要传递给服务端,进行错误收集和分析,然后修复 bug 。

到此这篇关于前端项目中的Vue、React错误监听的文章就介绍到这了,更多相关Vue,React错误监听内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue.js中vue-property-decorator的使用方法详解

    Vue.js中vue-property-decorator的使用方法详解

    vue-property-decorator是一个用于在Vue.js中使用TypeScript装饰器的库,它能够简化 Vue 组件的定义,使代码更加简洁和可维护,它能够简化Vue组件的定义,使代码更加简洁和可维护,本文将深入探讨vue-property-decorator的使用方法,并展示如何在Vue.js项目中应用它
    2024-08-08
  • vue 路由视图 router-view嵌套跳转的实现

    vue 路由视图 router-view嵌套跳转的实现

    这篇文章主要介绍了vue 路由视图 router-view嵌套跳转,主要实现的内容有制作一个登录页面,跳转到首页,首页包含菜单栏、顶部导航栏、主体,标准的后台网页格式,菜单点击显示不同的页面,感兴趣的小伙伴请参考下面文章内容
    2021-09-09
  • Vue极简生成器 Vuepress的实现

    Vue极简生成器 Vuepress的实现

    本文主要介绍了Vue极简生成器 Vuepress的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧<BR>
    2022-06-06
  • 遇到vue前端npm i报错多个版本不一致问题及解决

    遇到vue前端npm i报错多个版本不一致问题及解决

    这篇文章主要介绍了遇到vue前端npm i报错多个版本不一致问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Vue页面中播放音频文件的方法详解

    Vue页面中播放音频文件的方法详解

    这篇文章主要为大家详细介绍了Vue实现页面中播放音频文件的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-02-02
  • 在Vue当中同时配置多个路由文件的方法案例代码

    在Vue当中同时配置多个路由文件的方法案例代码

    这篇文章主要介绍了在Vue当中同时配置多个路由文件的方法,包含具体代码,本文分步骤结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • 解决vue打包后vendor.js文件过大问题

    解决vue打包后vendor.js文件过大问题

    这篇文章主要介绍了解决vue打包后vendor.js文件过大问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • 一文详解Vue Router的使用和路由守卫

    一文详解Vue Router的使用和路由守卫

    Vue Router 是 Vue.js 的官方路由库,用于在 Vue 应用中实现单页面应用(SPA)的客户端路由,以下是 Vue Router 的详细介绍,包括基本概念、配置、路由导航以及高级用法,感兴趣的小伙伴跟着小编一起来看看吧
    2024-08-08
  • Animate.css在vue中的使用方式

    Animate.css在vue中的使用方式

    这篇文章主要介绍了Animate.css在vue中的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • vue 授权获取微信openId操作

    vue 授权获取微信openId操作

    这篇文章主要介绍了vue 授权获取微信openId操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11

最新评论