@ustinian-wang/js-monitor
Version:
A universal front-end error monitor and reporting tool for Vue and JS.
188 lines (140 loc) • 5.83 kB
Markdown
# js-monitor
## 背景介绍
- 为了完善项目质量, 我们需要对异常进行监控, 基于此背景开发一个异常监控sdk捕获错误,即`js-monitor`
## 安装
```bash
yarn install @ustinian-wang/js-monitor@latest
# 或
npm install @ustinian-wang/js-monitor@latest
```
## 使用
### 1. 引入并初始化
> umd
```html
<script src="https://cdn.jsdelivr.net/npm/@ustinian-wang/js-monitor@latest">
window.addEventListener('DOMContentLoaded', (e) => {
console.log('DOMContentLoaded', e);
const JsMonitor = window.JsMonitor;
JsMonitor.setup({
appId: 'monitor-demo',
api: 'http://localhost:3000/api/monitor',
debug: true
});
});
</script>
```
> esm
```ts
import { setup } from 'js-monitor';
setup({
appId: 'your-app-id',
api: '/api/report', // 或自定义函数
debug: true,
filter: (data) => false, // 返回 true 则不上报
transform: (data) => data, // 可自定义数据转换
});
```
| 参数名 | 类型 | 必填 | 说明 |
| --------- | -------------------------- | ---- | -------------------------------------------------------------------- |
| force | boolean | 否 | 是否强制安装,默认false。setup默认只能执行一次,重复setup只执行一次,但force为true时每次setup都会重新初始化 |
| appId | string | 是 | 应用唯一标识 |
| api | string \| Function | 是 | 上报地址(字符串)或自定义上报函数 |
| debug | boolean | 否 | 是否开启调试模式(开启后会打印调试日志) |
| filter | (data) => boolean | 否 | 过滤函数,返回 true 时本次数据不上报 |
| transform | (data) => object | 否 | 数据转换函数,上报前可对数据进行自定义处理 |
| warnHandler | (error, vm, info) => void | 否 | Vue.config.warnHandler 警告处理函数 |
| errorHandler | (error, vm, info) => void | 否 | Vue.config.errorHandler 错误处理函数 |
| unhandledrejection | (event) => void | 否 | window.unhandledrejection 未捕获异常处理函数 |
| onerror | (message, source, lineno, colno, error) => void | 否 | window.onerror 错误处理函数 |
| error | (event) => void | 否 | window.addEventListener('error', config.error) 资源加载错误处理函数 |
| report | (config, data) => void | 否 | 上报回调 |
### 2. 手动上报
```ts
import { report } from 'js-monitor';
report({
appId: 'your-app-id',
api: '/api/report',
filter: () => false,
transform: (data) => data,
}, {
type: 'custom',
message: '自定义上报内容'
});
```
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ---------------------- | ---- | ---------------------------- |
| config | setupConfigDef | 是 | 同 setup 的配置参数 |
| data | reportDataDef | 是 | 需要上报的数据对象 |
data(reportDataDef)常用字段
| 字段名 | 类型 | 说明 |
| --------- | --------- | ---------------------- |
| appId | string | 应用ID |
| type | ErrTypeEnum | 错误/事件类型,枚举值:'vue-warn'、'vue-error'、'unhandledrejection'、'onerror'、'resource-error'、'test' |
| error | Error | 错误对象 |
| vmName | string | Vue 组件名 |
| info | string | 额外信息 |
| message | string | 错误消息 |
| stack | string | 错误堆栈 |
| url | string | 当前页面地址 |
| time | number | 上报时间戳 |
| userAgent | string | UA 信息 |
| source | string | 错误来源 |
| lineno | number | 行号 |
| colno | number | 列号 |
| reason | any | Promise 拒绝原因 |
| tagName | string | 资源标签名 |
| src | string | 资源地址 |
| resConfig | string | 请求配置,Promise reject 时,可能是 axios 的请求配置 |
### ErrTypeEnum 枚举
`type` 字段为 `ErrTypeEnum`,可选值如下:
- `'vue-warn'` Vue 警告
- `'vue-error'` Vue 错误
- `'unhandledrejection'` Promise 未捕获异常
- `'onerror'` 全局 JS 错误
- `'resource-error'` 资源加载错误
- `'test'` 测试类型
## API 扩展
除了 `setup` 和 `report`,还暴露了以下辅助函数,便于自定义集成:
- `callWarnHandler(config, error, vm, info)`:手动触发 Vue 警告处理和上报。
- `callErrorHandler(config, error, vm, info)`:手动触发 Vue 错误处理和上报。
- `callUnhandledrejection(config, event)`:手动处理 Promise 未捕获异常并上报。
- `callError(config, event)`:手动处理资源加载错误并上报。
这些函数可用于更细粒度的错误监控或自定义场景。
## 在线用例
<https://stackblitz.com/edit/stackblitz-starters-ofnzdvcm?embed=1&file=index.html>
## 功能特性
- **Vue 错误与警告监控**:自动代理 Vue 的 `errorHandler` 和 `warnHandler`。
- **全局 JS 错误监控**:自动监听 `window.onerror`。
- **Promise 未捕获异常监控**:自动监听 `unhandledrejection`。
- **静态资源加载错误监控**:自动监听 `error` 事件,捕获图片、脚本、样式等资源加载失败。
- **可配置过滤与转换**:支持自定义过滤和数据转换逻辑。
- **支持自定义上报函数**:可通过 `api` 传入自定义上报方法。
## 测试
本项目使用 [Jest](https://jestjs.io/) 进行单元测试。
### 运行测试
```bash
yarn test
# 或
npm test
```
### 测试文件示例
测试文件位于 `__tests__/` 目录下,覆盖了 `setup` 和 `report` 的主要逻辑。
## 开发
### 本地开发
```bash
yarn dev
```
### 构建
```bash
yarn build
```
## 依赖
- [TypeScript](https://www.typescriptlang.org/)
- [Vite](https://vitejs.dev/)
- [Jest](https://jestjs.io/)
- [ts-jest](https://kulshekhar.github.io/ts-jest/)
## 贡献
欢迎提 issue 或 PR!
---
## License
MIT