3***@qq.com
3***@qq.com
  • 发布:2026-09-05 17:52
  • 更新:2026-09-05 17:53
  • 阅读:28

【报Bug】INP监听报错

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: win10

HBuilderX类型: 正式

HBuilderX版本号: 5.24

手机系统: Android

手机系统版本号: Android 11

手机厂商: 模拟器

手机机型: vivo

页面类型: vue

vue版本: vue2

打包方式: 云端

项目创建方式: HBuilderX

操作步骤:

使用uni.navigateTo({
url:
})
跳转之后使用uni.navigateBack({
delta: 1
})

预期结果:

解决

实际结果:

未解决

bug描述:

et(t => {  
            ut({  
                name: "INP",  
                value: t.value,  
                subparts: {  
                    inputDelay: t.attribution.inputDelay,  
                    processingDuration: t.attribution.processingDuration,  
                    presentationDelay: t.attribution.presentationDelay  
                },  
                startTime: t.entries[0].startTime,  
                entryGroupId: t.entries[0].interactionId,  
                interactionType: t.attribution.interactionType  
            })  
        }

这段代码报错 startTime: t.entries[0].startTime,

2026-09-05 17:52 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

好的,收到你的 bug 反馈。作为 DCloud 官方人员,我对这个反馈进行如下评审和分析:

1. 反馈质量评审

这个 bug 反馈的整体结构比较完整,但在关键信息上存在缺失,需要补充。

  • BUG 标题与描述:标题“INP监听报错”简明扼要。描述中给出了报错的代码片段,指出 startTime: t.entries[0].startTime 报错,官方人员能够看懂问题的表象。
  • 代码示例:不完整。提供的只是一个监听回调的片段,缺乏 t 对象的来源(如使用了哪个 Web API 或三方库来获取 INP 指标),也没有外层的调用逻辑。官方人员无法直接运行复现,也无法判断 t.entries 的数据结构。
  • 复现步骤:描述了“使用 uni.navigateTo 跳转之后使用 uni.navigateBack 返回”,但未说明这段 INP 监听代码在生命周期中是如何注册和触发的,是否与页面路由有直接的绑定关系。仅凭现有步骤,官方人员难以成功复现。
  • 预期结果与实际结果:预期结果“解决”过于宽泛,未描述期望的正常行为(如正常获取到 startTime 或不触发报错)。实际结果“未解决”没有提供具体的报错日志(如是否为 Cannot read property 'startTime' of undefined),无法判断是否为误报。
  • 分类信息:完整。包含了操作系统(Win10)、HBuilderX 版本(5.24 正式版)、手机 OS 平台与版本(Android 11 模拟器)、Vue 版本(Vue2)等信息,分类非常清晰。

评审结论:反馈有效但信息不足。建议补充完整的 INP 监听代码实现、具体的报错信息,以及一个最简的可复现工程。

2. 问题分析与排查

在 uni-app(Vue2)的 App 端,页面通常由 webview 渲染。代码中使用了 t.entries[0].startTime,如果 t.entries 为空数组或不是预期的 PerformanceEntry 对象,就会因为读取 undefined 的属性而报错。

结合你提到的“uni.navigateTo 跳转后 uni.navigateBack 返回”的复现步骤,问题很可能出在以下方面:

  • 监听未正确销毁:如果在页面的 onLoadonShow 中注册了性能监听器(如 PerformanceObserver),但没有在 onUnloadonHide 中及时断开监听(disconnect)。当执行 navigateBack 导致页面销毁或隐藏时,如果监听器仍然在后台触发,此时获取到的 t.entries 可能因为页面生命周期结束而变成空数组或异常对象,从而导致报错。
  • 数据结构未做防御性判断:在读取 t.entries[0].startTime 前,没有判断 t.entries 是否存在且长度大于 0。

3. 解决方案与建议

建议你检查代码中注册 INP 监听的逻辑,并做以下调整:

  1. 增加防御性判断:在读取数组或对象属性前,先校验数据的有效性。

    et(t => {  
    if (t.entries && t.entries.length > 0) {  
        ut({  
            name: "INP",  
            value: t.value,  
            subparts: {  
                inputDelay: t.attribution.inputDelay,  
                processingDuration: t.attribution.processingDuration,  
                presentationDelay: t.attribution.presentationDelay  
            },  
            startTime: t.entries[0].startTime,  
            entryGroupId: t.entries[0].interactionId,  
            interactionType: t.attribution.interactionType  
        })  
    }  
    })

    本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

  2. 规范监听器的生命周期管理:确保在页面 onUnload 时,断开相关的性能监听器,避免在页面销毁后仍触发回调导致异常。

如果增加判断后仍然存在问题,请补充完整的监听代码和具体的报错日志,以便进一步排查。

内容为 AI 生成,仅供参考

要回复问题请先登录注册