按模板在目标前端项目中接入火熊(FireBear)浏览器埋点与土熊(NativeBear)前端监控 SDK,包含封装、统一初始化入口、CDN 脚本注入、配置开关与完整性校验。

把「火熊(FireBear)浏览器埋点 + 土熊(NativeBear)前端监控」按已验证的模板接进任意前端项目。默认按 Vue3 + Vite 落地,同时给出非 Vue / 非 Vite 项目的替换方式。
和手写接入的区别:它不只复制三个文件,还会先探测项目现状(框架、路径别名、.env* 的 MODE、是否已有同职责文件、是否装了 vite-plugin-html),再决定模板如何落位,并在最后跑一遍完整性校验。
| 产物 | 位置 | 作用 |
|---|---|---|
| 火熊封装 | src/utils/fire-bear-browser.ts | init / setUser / trackEvent + FireBearSegmentation 推荐类型,3 次重试 |
| 土熊封装 | src/utils/native-bear-monitor.ts | init / logger / setUser,3 次重试 |
| 统一入口 | src/utils/init-sdks.ts | 固定顺序 analytics → monitor → 业务 SDK |
| 环境变量 | .env* | VITE_APP_FIREBEAR_CDN、VITE_APP_NATIVE_BEAR_MONITOR_CDN,值为完整 <script> 标签 |
| HTML 注入 | index.html + 构建配置 | 条件注入两个 async 脚本 |
| 配置开关 | src/config/index.ts | analyticsEnable / monitorEnable |
| 调用点 | src/bootstrap.ts 或 src/main.ts | await initSdks() |
模板文件在 skill 的 templates/ 下,复制后按注释里的「适配点」改。纯 JS 项目把 .ts 落成 .js 即可,同时去掉类型声明。
| 条件 | 要求 |
|---|---|
| 目标目录 | 就是要接入的那个前端仓库,且能正常 dev / build |
| 框架 | 默认 Vue3 + Vite;Vue2 只需去掉 import * as Vue from 'vue' 之外的类型差异 |
| 凭证 | 火熊 appKey + salt、土熊 appKey,每个环境各一套 |
| 网络 | 开发/生产环境的 CDN 与上报域名可达(内网需挂 VPN) |
凭证没拿到时不必编造:留空字符串交付即可,封装里的 ready 门禁为 false,SDK 不初始化、功能不受影响,后续把值补上就能生效。
先确认事实再决定落位路径,不要假设:
vite / webpack / next)、是否有 vue 依赖。vite.config.* 的 resolve.alias、tsconfig.json 的 paths(模板默认写 @/config)。.env* 文件与全部 MODE 值(development / test / preview / production)。fireBear|waterbear|SZHN_NATIVE_BEAR|native-bear|fire-bear:已有同职责文件就只补差异,不要整体覆盖。vite-plugin-html:没有就用 transformIndexHtml 注入。analyticsEnable / monitorEnable 开关,复用优先,避免出现两套开关。一次问完,不要逐条追问:需要接入的环境列表、各环境火熊 appKey + salt、各环境土熊 appKey、两个开关的初始值、生产环境是否走公网替代域名。
域名与环境映射见 skill 的 references/reference.md 第 1 节。
按 templates/ 复制三个文件后逐项替换:
| 模板 | 必改内容 |
|---|---|
fire-bear-browser.ts | @/config 别名、各环境 FIRE_BEAR_KEY / FIRE_BEAR_SALT、环境键集合 |
native-bear-monitor.ts | 别名、各环境 NATIVE_BEAR_APP_KEY、APP_VERSION 来源 |
init-sdks.ts | 别名;第 3 段业务 SDK 只留注释占位,不引入业务配置 |
环境键必须与 import.meta.env.MODE 的实际取值完全一致,否则索引出 undefined、ready 恒为 false。非 Vite 项目把 import.meta.env.MODE 换成项目自己的环境判断。
.env* 每个环境追加两条变量,值为完整 <script async src="..."></script>。index.html 在 </head> 前加条件注入块;<%- %> 要原样输出,不能写成 <%= %>。vite-plugin-html 就在 inject.data 补两个变量,否则加 transformIndexHtml 插件。config 只补 analyticsEnable、monitorEnable 两个布尔开关。不要把接口基址之类的业务配置塞进来。# 1) 应用入口里 await initSdks(),位置早于 createApp().mount()
# 2) 登录成功 / 退出登录处补两个 SDK 的 setUser(userId)
# 3) 跑完整性校验
node <本 skill 目录>/scripts/verify-integration.mjs .校验脚本输出 PASS / FAIL 清单,FAIL 按提示修复后重跑;自定义了文件名的项目允许少量误报,人工确认即可。之后再看运行时:window.fireBear、window.SZHN_NATIVE_BEAR 是否存在,Network 里两个 CDN 脚本是否 200。
trackEvent(key, segmentation) 的 segmentation 建议带齐 6 个公共字段,平台才能按页面 / 版本 / 用户维度下钻:
| 字段 | 示例 | 说明 |
|---|---|---|
userId | xxxx-xxxx-xxxx-xxxx | 用户唯一标识;未登录传空字符串,与 setUser 同源 |
pageTitle | 页面一 | 页面标题 |
version | 0.0.1 | 应用版本号,建议取 package.json 的 version |
pageCode | page-one | 页面编码,英文短横线命名,与 pageTitle 一一对应 |
name | 页面切换 | 事件名称(动作),区分同一页面内的不同行为 |
url | /order/list | 页面地址,可传 location.pathname 或完整 URL |
模板已导出 FireBearSegmentation 类型,调用方复用它即可,不要另建一份重复定义;业务自定义维度在此基础上追加。
init 用 dns,土熊 init 用 dsn。写反不报错,但数据不上报。nativeBearMonitor.logger()。async,脚本未就绪时 window.* 是 undefined,靠 3 次、间隔 300ms 的 setTimeout 兜底。ready 门禁:只有 ready === true 才 init,这是「配置缺失即自动降级」的唯一开关。try/catch:任一 SDK 或 CDN 失败都不能阻塞应用启动。URL_WHITE_LIST 填接口前缀。window.fireBear.init:绕过 ready 与重试,会出现「开关关了仍有上报」。| 现象 | 排查方向 |
|---|---|
控制台有 window.fireBear,但平台上没有数据 | dns / dsn 写反;appKey / salt 与环境不匹配;上报域名不通(需 VPN) |
初始化日志显示 ready: false | import.meta.env.MODE 与封装里的环境键不一致,索引出 undefined |
| Network 里 CDN 脚本 404 | .env* 里的脚本地址写错,或该环境未配置变量 |
VitePress / Nuxt 等 SSR 项目构建报 window is not defined | enhanceApp 会在 Node 侧执行,封装里每个 window 访问点都要加 typeof window !== 'undefined' 守卫 |
| 页面浏览量翻倍、标题错位 | 火熊自动 PV 与 SPA 的 replaceState + pushState 双调用冲突,属 SDK 侧行为,平台侧按 pageUrl 去重或过滤时长极短(毫秒级)的记录 |
setUser / trackEvent 用法:skill 的 references/reference.mdscripts/verify-integration.mjs(执行,不要只读)