Uni-App 页面跳转监控实战:快速定位路由问题

一.在做 Uni-App 小程序开发时,路由跳转是很常见的操作,比如 uni.navigateTouni.reLaunch 等。但有时候,我们会遇到一些奇怪的问题:

  • 页面一打开,就莫名其妙跳回首页

  • 业务逻辑正确,但路由被拦截器或全局逻辑改写

  • 无法快速定位,到底是哪个页面或组件触发了跳转

这种时候,如果能在全局"监控"所有路由调用,就能快速找到问题源头。下面就带大家实现一个全局路由监控工具

二.原理:函数劫持(Monkey Patch)

思路很简单:

  1. 保存原始方法 ,比如 uni.navigateTo

  2. 用自定义函数替换它

  3. 在自定义函数里,先打印日志(方法名、参数、堆栈),再执行原函数。

这样,每次调用路由方法时,都会经过我们的"代理函数",相当于全局插了一层日志

三. 实现代码

App.vueonLaunch 中加入以下代码:

javascript 复制代码
onLaunch(() => {
  // 封装一个包装函数,用来代理 uni 的路由方法
  const wrap = (name: keyof typeof uni) => {
    // 保存原始方法
    const raw = (uni as any)[name]

    // 覆盖原方法
    ;(uni as any)[name] = function (...args: any[]) {
      // 打印调用信息
      console.log(`[NAV] 调用了 ${name}`, args)

      // 打印调用堆栈,方便定位调用来源
      try {
        throw new Error(`[NAV STACK] ${name}`)
      } catch (err) {
        console.warn(err)
      }

      // 调用原始方法,保持功能不变
      return raw.apply(this, args)
    }
  }

  // 批量给常见的路由方法加代理
  ;['navigateTo', 'redirectTo', 'reLaunch', 'switchTab', 'navigateBack'].forEach(wrap)
})

四. 效果演示

当某个地方调用了:

uni.reLaunch({ url: '/pages/index/index' })

控制条输出

NAV\] 调用了 reLaunch \[ { url: '/pages/index/index' }

Error: [NAV STACK] reLaunch

at App.vue:25

at routeInterceptor.ts:38

at ...

不仅能看到调用了什么方法、传了什么参数,还能追踪到具体的调用堆栈,快速定位是哪个文件写的。

五. 使用场景

  • 🔍 调试拦截器:验证是否正确拦截、是否跳错页面。

  • 🐞 排查 Bug:解决"页面秒回首页""路由失效"等问题。

  • 📊 埋点统计:统计用户真实的路由行为(可拓展上报服务器)。

六. 总结

通过简单的函数代理,我们就能轻松实现 全局路由监控

优点是:

  • 无侵入,不需要改业务代码。

  • 实时可见,能直接看到参数和调用堆栈。

  • 扩展方便,可以加日志上报、埋点统计。

相关推荐
wx_lidysun8 小时前
Nextjs学习笔记
前端·react·next
无羡仙11 小时前
从零构建 Vue 弹窗组件
前端·vue.js
源心锁12 小时前
👋 手搓 gzip 实现的文件分块压缩上传
前端·javascript
源心锁12 小时前
丧心病狂!在浏览器全天候记录用户行为排障
前端·架构
GIS之路12 小时前
GDAL 实现投影转换
前端
烛阴13 小时前
从“无”到“有”:手动实现一个 3D 渲染循环全过程
前端·webgl·three.js
BD_Marathon13 小时前
SpringBoot——辅助功能之切换web服务器
服务器·前端·spring boot
Kagol13 小时前
JavaScript 中的 sort 排序问题
前端·javascript
eason_fan13 小时前
Service Worker 缓存请求:前端性能优化的进阶利器
前端·性能优化
光影少年13 小时前
rn如何和原生进行通信,是单线程还是多线程,通信方式都有哪些
前端·react native·react.js·taro