跳转至

前端框架插件接入

从 RUM SDK 3.3.6 开始,可以通过独立框架插件采集框架路由 View 和框架错误。 框架插件与 RUM 主包保持独立,应用只需安装实际使用的插件。

支持范围

框架 支持版本 路由能力 错误能力
React React 18、19;React Router 6、7、8;TanStack Router 1.x 使用路由模板命名 View,忽略仅 query 或 hash 变化 ErrorBoundaryaddReactError()
Vue Vue 2.7 + Vue Router 3;Vue 3 + Vue Router 4 使用匹配到的路由模板命名 View,忽略仅 query 变化 Vue 全局错误处理器、addVueError()
Angular Angular 15 至 22;RxJS 7 及以上 NavigationEnd 后启动 View,忽略取消、失败及仅 query 或 hash 变化 Angular ErrorHandleraddAngularError()
Next.js Next.js 13 及以上、React 18 及以上 支持 App Router 和 Pages Router 参见 SSR 框架下接入
Nuxt Nuxt 3、4;Vue 3;Vue Router 4 支持 Nuxt 文件路由和客户端导航 参见 SSR 框架下接入
版本要求

RUM 主包版本不得低于框架插件版本。一个应用只能初始化完整 RUM 包或精简 RUM 包中的一个,不要同时初始化两个 RUM 实例。

完整 RUM 包支持 Session Replay 和压缩上报;精简 RUM 包不包含这两项能力。 两种 RUM 包均可使用框架插件采集 View 与 Error。

使用精简 RUM 包时,只需要替换 RUM 导入,框架插件配置保持不变:

import { datafluxRum } from "@cloudcare/browser-rum-slim"

以下示例使用公网 OpenWay 的 siteclientToken。使用 DataKit 直连时, 将这两个参数替换为 datakitOrigin,不要同时配置两种上报地址。

React

安装

npm install @cloudcare/browser-rum @cloudcare/browser-rum-react

React Router

启用 Router 集成时,需要:

  1. reactPlugin() 中设置 router: true
  2. 从与 React Router 主版本匹配的插件子路径导入 Router 创建 API、 RoutesuseRoutes

以下示例使用 React Router 6:

import { RouterProvider } from "react-router-dom"
import { datafluxRum } from "@cloudcare/browser-rum"
import { reactPlugin } from "@cloudcare/browser-rum-react"
import {
  createBrowserRouter,
} from "@cloudcare/browser-rum-react/react-router-v6"

const router = createBrowserRouter([
  { path: "/", element: <Home /> },
  { path: "/users/:id", element: <UserDetail /> },
])

datafluxRum.init({
  applicationId: "<APPLICATION_ID>",
  site: "<PUBLIC_OPENWAY_URL>",
  clientToken: "<CLIENT_TOKEN>",
  service: "web-react",
  env: "production",
  version: "1.0.0",
  sessionSampleRate: 100,
  plugins: [reactPlugin({ router: true })],
})

root.render(<RouterProvider router={router} />)

根据 Router 版本选择入口:

Router 插件入口 由插件入口导出的 API
React Router 6 @cloudcare/browser-rum-react/react-router-v6 createBrowserRoutercreateHashRoutercreateMemoryRouterRoutesuseRoutes
React Router 7 @cloudcare/browser-rum-react/react-router-v7 同上
React Router 8 @cloudcare/browser-rum-react/react-router-v8 同上
TanStack Router 1.x @cloudcare/browser-rum-react/tanstack-router createRouter

其他 Router API 仍从应用安装的 Router 包导入。不要从框架插件主入口导入 Router wrapper,否则插件无法区分 Router 主版本。

React 错误

在应用根节点或关键业务区域外层使用 ErrorBoundary

import { ErrorBoundary } from "@cloudcare/browser-rum-react"

root.render(
  <ErrorBoundary
    fallback={({ resetError }) => (
      <button type="button" onClick={resetError}>重试</button>
    )}
    context={{ module: "checkout" }}
  >
    <App />
  </ErrorBoundary>
)

已有 ErrorBoundary、React 19 根节点错误回调或业务主动捕获错误时,调用 addReactError(error, errorInfo, context)。React Error 事件会包含 context.framework = react,存在组件栈时还会包含 context.component_stack

Vue

安装

npm install @cloudcare/browser-rum @cloudcare/browser-rum-vue

Vue 3 与 Vue Router 4

import { createApp } from "vue"
import { createWebHistory } from "vue-router"
import { datafluxRum } from "@cloudcare/browser-rum"
import { vuePlugin } from "@cloudcare/browser-rum-vue"
import {
  createRouter,
} from "@cloudcare/browser-rum-vue/vue-router-v4"

const app = createApp(App)
const router = createRouter({
  history: createWebHistory(),
  routes: [
    { path: "/", component: Home },
    { path: "/users/:id", component: UserDetail },
  ],
})

datafluxRum.init({
  applicationId: "<APPLICATION_ID>",
  site: "<PUBLIC_OPENWAY_URL>",
  clientToken: "<CLIENT_TOKEN>",
  service: "web-vue",
  env: "production",
  version: "1.0.0",
  sessionSampleRate: 100,
  plugins: [vuePlugin({ app, router: true })],
})

app.use(router)
app.mount("#app")

传入 app 后,插件会安装 Vue 全局错误处理器,同时保留应用已有的 app.config.errorHandler

Vue 2.7 与 Vue Router 3

import Vue from "vue"
import { datafluxRum } from "@cloudcare/browser-rum"
import { vuePlugin } from "@cloudcare/browser-rum-vue"
import VueRouter from "@cloudcare/browser-rum-vue/vue-router-v3"

Vue.use(VueRouter)
const router = new VueRouter({ routes })

datafluxRum.init({
  applicationId: "<APPLICATION_ID>",
  site: "<PUBLIC_OPENWAY_URL>",
  clientToken: "<CLIENT_TOKEN>",
  plugins: [vuePlugin({ app: Vue, router: true })],
})

new Vue({ router, render: (h) => h(App) }).$mount("#app")

已有自定义错误处理器时,也可以调用 addVueError(error, componentInstance, info, context)。Vue Error 事件会包含 context.framework = vue,并尽可能记录组件名称和组件路径。

Angular

安装

npm install @cloudcare/browser-rum @cloudcare/browser-rum-angular

Standalone 应用

import { bootstrapApplication } from "@angular/platform-browser"
import { provideRouter } from "@angular/router"
import { datafluxRum } from "@cloudcare/browser-rum"
import { angularPlugin } from "@cloudcare/browser-rum-angular"
import {
  provideRumErrorHandler,
  provideRumRouter,
} from "@cloudcare/browser-rum-angular/providers"

datafluxRum.init({
  applicationId: "<APPLICATION_ID>",
  site: "<PUBLIC_OPENWAY_URL>",
  clientToken: "<CLIENT_TOKEN>",
  service: "web-angular",
  env: "production",
  version: "1.0.0",
  sessionSampleRate: 100,
  plugins: [angularPlugin({ router: true })],
})

bootstrapApplication(AppComponent, {
  providers: [
    provideRouter(routes),
    provideRumRouter(),
    provideRumErrorHandler(),
  ],
})

provideRumRouter() 只在 Angular Router 成功触发 NavigationEnd 后启动 View。 取消或失败的导航不会生成 View。provideRumErrorHandler() 在上报 Error 的同时, 保留 Angular 默认的控制台错误处理行为。

已有自定义 ErrorHandler 时,可以调用 addAngularError(error, context); 已有自定义 Router 集成时,可以调用 trackAngularRouter(router)

View 命名与生命周期

启用框架 Router 集成后,插件会接管手动 View:

场景 采集行为
首次进入路由 创建初始 View
pathname 变化且导航成功 创建新 View
仅 query 变化 不创建新 View
仅 hash 变化 React、Angular 不创建新 View;Nuxt 可跟踪 hash 路由
动态路由 使用 /users/:id/users/[id] 等模板名称
跳转取消、失败或新页面未提交 不创建 View

不要同时使用 Router 插件和业务代码中的 datafluxRum.startView() 跟踪同一次路由, 否则可能产生重复 View。

React、Vue 和 Angular 插件均支持 getViewName 回调。返回自定义字符串可覆盖默认 路由模板;返回 undefined 会跳过当前路由的 View 创建。

验证接入

  1. 打开浏览器开发者工具,在 Network 中过滤 /v1/write/rum
  2. 进入动态路由,例如从 /users/1 跳转到 /users/2
  3. 确认 View 名称保持为路由模板,而不是具体用户 ID。
  4. 只修改 query,确认没有重复创建 View。
  5. 触发框架渲染错误,确认出现 type=error,并带有对应 context.framework

常见问题

启用 router: true 后没有 View

确认 Router 创建 API、RoutesuseRoutes 来自与当前 Router 主版本匹配的 插件子路径。只注册插件但继续使用原始 Router 创建 API 时,插件无法获得完整路由 状态。

一个路由跳转产生多个 View

确认应用没有重复注册 Router 插件,也没有为同一次路由变化额外调用 datafluxRum.startView()

动态路由产生大量 View 名称

优先使用 Router 模板路径。无法从路由配置自动获得稳定名称时,通过 getViewName 把实体 ID 统一映射为固定业务名称。

文档评价

文档内容是否对您有帮助? ×