cwj_monitoring 0.0.15 → 0.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -42
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -0
- package/package.json +2 -2
- package/dist/index.d.ts +0 -25
package/README.md
CHANGED
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
# 介绍
|
|
2
|
-
|
|
3
|
-
一个简易的前端监控 SDK DEMO,仅供学习,请勿在生产环境中使用。
|
|
4
|
-
|
|
5
|
-
## 目前已实现的功能
|
|
6
|
-
|
|
7
|
-
1. 行为监控:点击监控,页面跳转监控,页面停留时间监控
|
|
8
|
-
2. 错误监控:js错误,资源加载错误,手动console.error抛出的错误,promise未捕获的错误
|
|
9
|
-
3. 性能监控:DCL、FP、FCP、LCP、Load、FPS
|
|
10
|
-
|
|
11
|
-
注:目前点击监控只支持button标签触发的点击事件
|
|
12
|
-
|
|
13
|
-
## 源码涉及的设计模式
|
|
14
|
-
1. 单例模式
|
|
15
|
-
2. 代理模式
|
|
16
|
-
3. 模板方法模式
|
|
17
|
-
4. 工厂方法模式
|
|
18
|
-
5. 责任链模式
|
|
19
|
-
|
|
20
|
-
## 安装
|
|
21
|
-
|
|
22
|
-
```
|
|
23
|
-
npm i cwj_monitoring
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## 使用
|
|
27
|
-
|
|
28
|
-
```js
|
|
29
|
-
import { init , TYPES} from 'cwj_monitoring';
|
|
30
|
-
|
|
31
|
-
//使用 init 全局进行初始化
|
|
32
|
-
init({
|
|
33
|
-
url: 'http://localhost:8080', //必传参数,数据上传服务器地址
|
|
34
|
-
max: 10, //可选参数,最大缓存数,即超过缓存数立即上传,默认为5
|
|
35
|
-
time: 60000, //可选参数,最大缓存时间,即超过最大缓存时间立即上传,默认30s
|
|
36
|
-
plugin:[TYPES.ERROR,TYPES.CLICK,TYPES.PERFORMANCE,TYPES.ROUTER],//可选参数,错误事件,点击事件,性能指标,路由,传递几个就调用几个
|
|
37
|
-
data: {}, //可选参数,初始化时外部传入的固定参数,例如项目的名称与版本号data:{vs:'0.1.1'}
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
//无论vue的全局错误捕获,还是react的错误边界,都可使用window.$track.emit手动上传错误
|
|
41
|
-
window.$track.emit(type, data);
|
|
42
|
-
```
|
|
1
|
+
# 介绍
|
|
2
|
+
|
|
3
|
+
一个简易的前端监控 SDK DEMO,仅供学习,请勿在生产环境中使用。
|
|
4
|
+
|
|
5
|
+
## 目前已实现的功能
|
|
6
|
+
|
|
7
|
+
1. 行为监控:点击监控,页面跳转监控,页面停留时间监控
|
|
8
|
+
2. 错误监控:js错误,资源加载错误,手动console.error抛出的错误,promise未捕获的错误
|
|
9
|
+
3. 性能监控:DCL、FP、FCP、LCP、Load、FPS
|
|
10
|
+
|
|
11
|
+
注:目前点击监控只支持button标签触发的点击事件
|
|
12
|
+
|
|
13
|
+
## 源码涉及的设计模式
|
|
14
|
+
1. 单例模式
|
|
15
|
+
2. 代理模式
|
|
16
|
+
3. 模板方法模式
|
|
17
|
+
4. 工厂方法模式
|
|
18
|
+
5. 责任链模式
|
|
19
|
+
|
|
20
|
+
## 安装
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
npm i cwj_monitoring
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## 使用
|
|
27
|
+
|
|
28
|
+
```js
|
|
29
|
+
import { init , TYPES} from 'cwj_monitoring';
|
|
30
|
+
|
|
31
|
+
//使用 init 全局进行初始化
|
|
32
|
+
init({
|
|
33
|
+
url: 'http://localhost:8080', //必传参数,数据上传服务器地址
|
|
34
|
+
max: 10, //可选参数,最大缓存数,即超过缓存数立即上传,默认为5
|
|
35
|
+
time: 60000, //可选参数,最大缓存时间,即超过最大缓存时间立即上传,默认30s
|
|
36
|
+
plugin:[TYPES.ERROR,TYPES.CLICK,TYPES.PERFORMANCE,TYPES.ROUTER],//可选参数,错误事件,点击事件,性能指标,路由,传递几个就调用几个
|
|
37
|
+
data: {}, //可选参数,初始化时外部传入的固定参数,例如项目的名称与版本号data:{vs:'0.1.1'}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
//无论vue的全局错误捕获,还是react的错误边界,都可使用window.$track.emit手动上传错误
|
|
41
|
+
window.$track.emit(type, data);
|
|
42
|
+
```
|
package/dist/index.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
class e{name;constructor(e){this.name=e}}var t=
|
|
1
|
+
class e{name;constructor(e){this.name=e}}var t=(e=>(e.ERROR="error",e.CLICK="click",e.PERFORMANCE="performance",e.ROUTER="router",e))(t||{}),r=(e=>(e.ERROR_JS="error_js",e.ERROR_PROMISE="error_promise",e.ERROR_RESOURCE="error_resource",e.ROUTER_HASH="hashchange",e.ROUTER_HISTORY="historychange",e.PERFORMANCE_FP="performance_fp",e.PERFORMANCE_FCP="performance_fcp",e.PERFORMANCE_LCP="performance_lcp",e.PERFORMANCE_DOMCONTENTLOADED="performance_DOMContentLoaded",e.PERFORMANCE_LOAD="performance_load",e.BEHAVIOR_CLICK="click",e))(r||{});function n(e){const{error:t,target:n}=e;if(t instanceof Error)return S.emit(r.ERROR_JS,{message:t.message,stack:t.stack,filename:e.filename});if(n instanceof HTMLLinkElement||n instanceof HTMLScriptElement||n instanceof HTMLImageElement||n instanceof HTMLAudioElement||n instanceof HTMLVideoElement||n instanceof HTMLIFrameElement){const e=n.src||n.href;return S.emit(r.ERROR_RESOURCE,{message:`Failed to get resource:${e}`,url:e})}return S.emit(r.ERROR_JS,{message:e.message,filename:e.filename})}function o(e){e.reason instanceof Error?S.emit(r.ERROR_PROMISE,{stack:e.reason.stack,message:e.reason.message}):S.emit(r.ERROR_PROMISE,{message:e.reason})}var i=new class extends e{constructor(){super("error")}monitor(){window.addEventListener("error",n),window.addEventListener("unhandledrejection",o)}};var s=new class extends e{constructor(){super("pv")}monitor(){this.Hash(),this.History()}Hash(){window.addEventListener("hashchange",(function(){S.emit(r.ROUTER_HASH)}))}History(){const e=window.history.pushState,t=window.history.replaceState;window.history.pushState=function(){e.apply(window.history,arguments),S.emit(r.ROUTER_HISTORY)},window.history.replaceState=function(){t.apply(window.history,arguments),S.emit(r.ROUTER_HISTORY)},window.addEventListener("popstate",(function(){S.emit(r.ROUTER_HISTORY)}))}};var a=new class extends e{constructor(){super("behavior")}monitor(){[r.BEHAVIOR_CLICK].forEach((function(e){let t;document.addEventListener(e,(r=>{clearTimeout(t),t=setTimeout((()=>{const t=r.target;t instanceof HTMLButtonElement&&S.emit(e,t.textContent)}),300)}),!0)}))}};var c,d=new class extends e{constructor(){super("performance")}monitor(){this.paint(),this.lcp(),this.dcl(),this.load()}paint(){const e=new PerformanceObserver((t=>{for(const e of t.getEntries())"first-paint"===e.name?S.emit(r.PERFORMANCE_FP,e.startTime):"first-contentful-paint"===e.name&&S.emit(r.PERFORMANCE_FCP,e.startTime);e.disconnect()}));e.observe({type:"paint",buffered:!0})}lcp(){const e=new PerformanceObserver((t=>{e&&e.disconnect();for(const e of t.getEntries())S.emit(r.PERFORMANCE_LCP,e.startTime)}));e.observe({type:"largest-contentful-paint",buffered:!0})}dcl(){window.addEventListener("DOMContentLoaded",(function(e){S.emit(r.PERFORMANCE_DOMCONTENTLOADED,e.timeStamp)}))}load(){window.addEventListener("load",(function(e){S.emit(r.PERFORMANCE_LOAD,e.timeStamp)}))}},m=new Uint8Array(16);function u(){if(!c&&!(c="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return c(m)}for(var l=[],h=0;h<256;++h)l.push((h+256).toString(16).slice(1));var w={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};function f(e,t,r){if(w.randomUUID&&!t&&!e)return w.randomUUID();var n=(e=e||{}).random||(e.rng||u)();if(n[6]=15&n[6]|64,n[8]=63&n[8]|128,t){r=r||0;for(var o=0;o<16;++o)t[r+o]=n[o];return t}return function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return(l[e[t+0]]+l[e[t+1]]+l[e[t+2]]+l[e[t+3]]+"-"+l[e[t+4]]+l[e[t+5]]+"-"+l[e[t+6]]+l[e[t+7]]+"-"+l[e[t+8]]+l[e[t+9]]+"-"+l[e[t+10]]+l[e[t+11]]+l[e[t+12]]+l[e[t+13]]+l[e[t+14]]+l[e[t+15]]).toLowerCase()}(n)}const R="uuid";let E=()=>{const e=(()=>{const e=navigator.userAgent.toLowerCase();return e.indexOf("opera")>-1||e.indexOf("opr")>-1?{browser:"Opera",browser_version:e.match(/ope?ra?\/([\d.]+)/)?.[1]}:e.indexOf("compatible")>-1&&e.indexOf("msie")>-1?{browser:"IE",browser_version:e.match(/(msie\s|trident.*rv:)([\w.]+)/)?.[2]||"IE"}:e.indexOf("edg")>-1?{browser:"Edge",browser_version:e.match(/edge?\/([\d.]+)/)?.[1]}:e.indexOf("firefox")>-1?{browser:"Firefox",browser_version:e.match(/firefox\/([\d.]+)/)?.[1]}:function(){const e=!1;for(const t in navigator.mimeTypes)if("application/360softmgrplugin"===navigator.mimeTypes[t].type)return!e;return e}()&&e.indexOf("safari")>-1?{browser:"360浏览器",browser_version:"Chromium browser"}:e.includes("2345explorer")?{browser:"2345浏览器",browser_version:e.match(/2345explorer\/([\d.]+)/)?.[1]||"Chromium browser"}:e.indexOf("bidubrowser")>-1?{browser:"百度浏览器",browser_version:e.match(/bidubrowser\/([\d.]+)/)?.[1]||"Chromium browser"}:e.indexOf("se 2.x")>-1?{browser:"搜狗浏览器",browser_version:"Chromium browser"}:e.indexOf("safari")>-1&&-1===e.indexOf("chrome")?{browser:"Safari",browser_version:e.match(/version\/([\d.]+)/)?.[1]}:/qqbrowser/.test(e)?{browser:"QQ浏览器",browser_version:e.match(/qqbrowser\/([\d.]+)/)?.[1]}:/micromessenger/i.test(e)?{browser:"微信浏览器",browser_version:e.match(/micromessenger\/([\d.]+)/)?.[1]}:e.indexOf("chrome")>-1&&e.indexOf("safari")>-1?{browser:"Chrome",browser_version:e.match(/chrome\/([\d.]+)/)?.[1]}:{browser:"未检测到的浏览器",browser_version:void 0}})();return E=()=>e,e};function p(){let e=0;const t=window.screen,r=navigator.userAgent.toLowerCase();return void 0!==window.devicePixelRatio?e=window.devicePixelRatio:~r.indexOf("msie")?t.deviceXDPI&&t.logicalXDPI&&(e=t.deviceXDPI/t.logicalXDPI):void 0!==window.outerWidth&&void 0!==window.innerWidth&&(e=window.outerWidth/window.innerWidth),e&&(e=Math.round(100*e)),e}class g{device;uuid;constructor(){this.device=Object.assign({},E(),{width:window.screen.width,height:window.screen.height},{ratio:p(),os:(navigator.userAgent.match(/[(](.*?)[)]/)?.[0]||"").replace(/[()]/g,"")}),localStorage.getItem(R)?this.uuid=localStorage.getItem(R):(this.uuid=f(),localStorage.setItem(R,this.uuid))}}var v=new class{cache;constructor(){this.cache=[]}getLength(){return this.cache.length}add(e){this.cache.push(e)}clear(){this.cache.length=0}};const O=e=>{const t=new Date(e),r=t.getFullYear(),n=t.getMonth()+1,o=t.getDate(),i=t.getHours(),s=t.getMinutes(),a=t.getSeconds(),c=e=>{let t="";return t=e<10?"0"+e:e.toString(),t};return r+"-"+c(n)+"-"+c(o)+" "+c(i)+":"+c(s)+":"+c(a)};class x extends g{url;max;time;timer;visitTime;data;constructor(e){super(),this.url=e.url,this.max=e.max||5,this.time=e.time||3e4,this.timer,this.visitTime=Date.now(),this.data=e.data}formatter(e,t){const n=Date.now(),o=Object.assign({},{device:this.device,uuid:this.uuid},{type:e,data:t,date:O(n),url:window.location.href,referrer:document.referrer,uuid:localStorage.getItem(R),duration:(i=n,s=this.visitTime,i<s&&([i,s]=[s,i]),Math.floor((i-s)/1e3)),userData:this.data,id:""});var i,s,a;return[r.ERROR_JS,r.ERROR_PROMISE].includes(e)&&Object.assign(o,{id:(a=t.message,window.btoa(decodeURIComponent(encodeURIComponent(a))))}),this.visitTime=n,o}send(){var e,t;v.getLength()&&(e=this.url,t=v.cache,navigator.sendBeacon(e,JSON.stringify(t)),v.clear())}emit(e,t){const r=this.formatter(e,t);v.cache.filter((e=>e.id)).some((e=>e.id===r.id))||v.add(r),clearTimeout(this.timer),v.getLength()>=this.max?this.send():this.timer=setTimeout((()=>{this.send()}),this.time)}}function b(e){return/^\d+$/.test(e.toString())}class _{nextValidator;constructor(){this.nextValidator=null}}const C=new class extends _{constructor(){super()}setNext(e){this.nextValidator=e}validate(e){return t=e.url,new RegExp("^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.?)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$","i").test(t)?!this.nextValidator||this.nextValidator.validate(e):(console.error("请输入符合规范的url"),!1);var t}},T=new class extends _{constructor(){super()}setNext(e){this.nextValidator=e}validate(e){return e.max&&!b(e.max)?(console.error("max请输入正整数"),!1):!this.nextValidator||this.nextValidator.validate(e)}},L=new class extends _{constructor(){super()}setNext(e){this.nextValidator=e}validate(e){return e.time&&!b(e.time)?(console.error("time请输入正整数"),!1):!this.nextValidator||this.nextValidator.validate(e)}};let S;function I(e){C.validate(e)&&(S=new x(e),window.$track=S,function(e){const r=e.plugin;r&&r.forEach((e=>{switch(e){case t.CLICK:a.monitor();break;case t.ERROR:i.monitor();break;case t.PERFORMANCE:d.monitor();break;case t.ROUTER:s.monitor()}}))}(e),window.addEventListener("beforeunload",S.send,!0))}C.setNext(T),T.setNext(L);const M=function(){let e=!1;return function(t){e||(I(t),e=!0)}}();var y={init:M};export{t as TYPES,y as default,M as init};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/lib/plugin/definePlugin.ts","../src/types/event.ts","../src/lib/plugin/error.ts","../src/lib/plugin/pv.ts","../src/lib/plugin/behavior.ts","../src/lib/plugin/performance.ts","../node_modules/uuid/dist/esm-browser/rng.js","../node_modules/uuid/dist/esm-browser/stringify.js","../node_modules/uuid/dist/esm-browser/native.js","../node_modules/uuid/dist/esm-browser/v4.js","../src/lib/constant.ts","../src/utils/device.ts","../src/lib/baseInfo.ts","../src/lib/cache.ts","../src/utils/date.ts","../src/lib/eventTrack.ts","../src/utils/index.ts","../src/utils/regular.ts","../src/utils/validator.ts","../src/lib/index.ts","../src/index.ts"],"sourcesContent":["/* 模板方法模式 */\r\nexport default abstract class DefinePlugin {\r\n public name: string;\r\n\r\n constructor(name: string) {\r\n this.name = name;\r\n }\r\n /**监听逻辑收集数据 */\r\n abstract monitor(): void;\r\n}\r\n","export enum TYPES {\r\n ERROR = 'error',\r\n CLICK = 'click',\r\n PERFORMANCE = 'performance',\r\n ROUTER = 'router',\r\n}\r\n\r\nexport enum EMIT_RTYPE {\r\n ERROR_JS = 'error_js',\r\n ERROR_PROMISE = 'error_promise',\r\n ERROR_RESOURCE = 'error_resource',\r\n ROUTER_HASH = 'hashchange',\r\n ROUTER_HISTORY = 'historychange',\r\n PERFORMANCE_FP = 'performance_fp',\r\n PERFORMANCE_FCP = 'performance_fcp',\r\n PERFORMANCE_LCP = 'performance_lcp',\r\n PERFORMANCE_DOMCONTENTLOADED = 'performance_DOMContentLoaded',\r\n PERFORMANCE_LOAD = 'performance_load',\r\n BEHAVIOR_CLICK = 'click',\r\n}\r\n","import { track } from '../index';\r\nimport DefinePlugin from './definePlugin';\r\nimport { EMIT_RTYPE } from '../../types/event';\r\n\r\nclass ErrorPlugin extends DefinePlugin {\r\n constructor() {\r\n super('error');\r\n }\r\n\r\n monitor(): void {\r\n window.addEventListener('error', syncError); //同步错误(js错误,资源加载错误)\r\n window.addEventListener('unhandledrejection', asyncError); //异步错误(promise错误)\r\n }\r\n}\r\n\r\nfunction syncError(e: ErrorEvent) {\r\n const { error, target } = e;\r\n if (error instanceof Error) {\r\n return track.emit(EMIT_RTYPE.ERROR_JS, {\r\n message: error.message,\r\n stack: error.stack,\r\n filename: e.filename,\r\n });\r\n }\r\n\r\n if (\r\n target instanceof HTMLLinkElement ||\r\n target instanceof HTMLScriptElement ||\r\n target instanceof HTMLImageElement ||\r\n target instanceof HTMLAudioElement ||\r\n target instanceof HTMLVideoElement ||\r\n target instanceof HTMLIFrameElement\r\n ) {\r\n const url = (target as HTMLImageElement | HTMLScriptElement).src || (target as HTMLLinkElement).href;\r\n return track.emit(EMIT_RTYPE.ERROR_RESOURCE, {\r\n message: `Failed to get resource:${url}`,\r\n url,\r\n });\r\n }\r\n\r\n return track.emit(EMIT_RTYPE.ERROR_JS, {\r\n message: e.message,\r\n filename: e.filename,\r\n });\r\n}\r\n\r\nfunction asyncError(e: PromiseRejectionEvent) {\r\n if (e.reason instanceof Error) {\r\n //reject中通过new Error抛出的错误\r\n track.emit(EMIT_RTYPE.ERROR_PROMISE, {\r\n stack: e.reason.stack,\r\n message: e.reason.message,\r\n });\r\n } else {\r\n track.emit(EMIT_RTYPE.ERROR_PROMISE, {\r\n message: e.reason,\r\n });\r\n }\r\n}\r\n\r\nexport default new ErrorPlugin();\r\n","import { track } from '../index';\r\nimport DefinePlugin from './definePlugin';\r\nimport { EMIT_RTYPE } from '../../types/event';\r\n\r\nclass PVPlugin extends DefinePlugin {\r\n constructor() {\r\n super('pv');\r\n }\r\n monitor(): void {\r\n this.Hash(); //监听hash路由\r\n this.History(); //监听history路由\r\n }\r\n\r\n Hash() {\r\n window.addEventListener('hashchange', function () {\r\n track.emit(EMIT_RTYPE.ROUTER_HASH);\r\n });\r\n }\r\n\r\n /* 代理模式 */\r\n History() {\r\n const historyPushState = window.history.pushState;\r\n const historyReplaceState = window.history.replaceState;\r\n window.history.pushState = function () {\r\n //@ts-ignore\r\n // eslint-disable-next-line prefer-rest-params\r\n historyPushState.apply(window.history, arguments);\r\n track.emit(EMIT_RTYPE.ROUTER_HISTORY);\r\n };\r\n window.history.replaceState = function () {\r\n //@ts-ignore\r\n // eslint-disable-next-line prefer-rest-params\r\n historyReplaceState.apply(window.history, arguments);\r\n track.emit(EMIT_RTYPE.ROUTER_HISTORY);\r\n };\r\n window.addEventListener('popstate', function () {\r\n track.emit(EMIT_RTYPE.ROUTER_HISTORY);\r\n });\r\n }\r\n}\r\n\r\nexport default new PVPlugin();\r\n","import { track } from '../index';\r\n\r\nimport DefinePlugin from './definePlugin';\r\n\r\nimport { EMIT_RTYPE } from '../../types/event';\r\n\r\nclass BehaviorPlugin extends DefinePlugin {\r\n constructor() {\r\n super('behavior');\r\n }\r\n\r\n monitor(): void {\r\n [EMIT_RTYPE.BEHAVIOR_CLICK].forEach(function (eventType) {\r\n let timer: NodeJS.Timeout;\r\n document.addEventListener(\r\n eventType,\r\n (e) => {\r\n clearTimeout(timer);\r\n timer = setTimeout(() => {\r\n const target = e.target;\r\n //目前只处理button标签的点击事件\r\n if (target instanceof HTMLButtonElement) {\r\n track.emit(eventType, target.textContent);\r\n }\r\n }, 300);\r\n },\r\n true,\r\n );\r\n });\r\n }\r\n}\r\n\r\nexport default new BehaviorPlugin();\r\n","import { track } from '../index';\r\nimport DefinePlugin from './definePlugin';\r\nimport { EMIT_RTYPE } from '../../types/event';\r\n\r\nclass PerformancePlugin extends DefinePlugin {\r\n constructor() {\r\n super('performance');\r\n }\r\n\r\n monitor(): void {\r\n this.paint(); //第一个像素和内容渲染时间\r\n this.lcp(); //页面最大内容渲染时间\r\n this.dcl(); //DOM加载完成时间\r\n this.load(); //样式表与图片都加载完成时间\r\n }\r\n\r\n paint() {\r\n const entryHandler = (list: { getEntries: () => any }) => {\r\n for (const entry of list.getEntries()) {\r\n if (entry.name === 'first-paint') {\r\n track.emit(EMIT_RTYPE.PERFORMANCE_FP, entry.startTime);\r\n } else if (entry.name === 'first-contentful-paint') {\r\n track.emit(EMIT_RTYPE.PERFORMANCE_FCP, entry.startTime);\r\n }\r\n }\r\n observer.disconnect();\r\n };\r\n\r\n const observer = new PerformanceObserver(entryHandler);\r\n // buffered 属性表示是否观察缓存数据,也就是说观察代码添加时机比事情触发时机晚也没关系。\r\n observer.observe({ type: 'paint', buffered: true });\r\n }\r\n\r\n lcp() {\r\n const entryHandler = (list: { getEntries: () => any }) => {\r\n if (observer) {\r\n observer.disconnect();\r\n }\r\n\r\n for (const entry of list.getEntries()) {\r\n track.emit(EMIT_RTYPE.PERFORMANCE_LCP, entry.startTime);\r\n }\r\n };\r\n\r\n const observer = new PerformanceObserver(entryHandler);\r\n observer.observe({ type: 'largest-contentful-paint', buffered: true });\r\n }\r\n\r\n dcl() {\r\n window.addEventListener('DOMContentLoaded', function (e) {\r\n track.emit(EMIT_RTYPE.PERFORMANCE_DOMCONTENTLOADED, e.timeStamp);\r\n });\r\n }\r\n\r\n load() {\r\n window.addEventListener('load', function (e) {\r\n track.emit(EMIT_RTYPE.PERFORMANCE_LOAD, e.timeStamp);\r\n });\r\n }\r\n}\r\n\r\nexport default new PerformancePlugin();\r\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","export const MAX_CACHE_LEN = 5; //最大缓存数\r\n\r\nexport const MAX_WAITING_TIME = 30000; //最大等待时间\r\n\r\nexport const UUID = 'uuid'; //存储uuid的字段\r\n","// 获取浏览器名称\r\nexport let getBrowserNameVersion = () => {\r\n const browser = (() => {\r\n const userAgent = navigator.userAgent.toLowerCase();\r\n if (userAgent.indexOf('opera') > -1 || userAgent.indexOf('opr') > -1) {\r\n return {\r\n browser: 'Opera',\r\n browser_version: userAgent.match(/ope?ra?\\/([\\d.]+)/)?.[1],\r\n };\r\n } else if (userAgent.indexOf('compatible') > -1 && userAgent.indexOf('msie') > -1) {\r\n return {\r\n browser: 'IE',\r\n browser_version: userAgent.match(/(msie\\s|trident.*rv:)([\\w.]+)/)?.[2] || 'IE',\r\n };\r\n } else if (userAgent.indexOf('edg') > -1) {\r\n return {\r\n browser: 'Edge',\r\n browser_version: userAgent.match(/edge?\\/([\\d.]+)/)?.[1],\r\n };\r\n } else if (userAgent.indexOf('firefox') > -1) {\r\n return {\r\n browser: 'Firefox',\r\n browser_version: userAgent.match(/firefox\\/([\\d.]+)/)?.[1],\r\n };\r\n } else if (check360() && userAgent.indexOf('safari') > -1) {\r\n return {\r\n browser: '360浏览器',\r\n browser_version: 'Chromium browser',\r\n };\r\n } else if (userAgent.includes('2345explorer')) {\r\n return {\r\n browser: '2345浏览器',\r\n browser_version: userAgent.match(/2345explorer\\/([\\d.]+)/)?.[1] || 'Chromium browser',\r\n };\r\n } else if (userAgent.indexOf('bidubrowser') > -1) {\r\n return {\r\n browser: '百度浏览器',\r\n browser_version: userAgent.match(/bidubrowser\\/([\\d.]+)/)?.[1] || 'Chromium browser',\r\n };\r\n } else if (userAgent.indexOf('se 2.x') > -1) {\r\n return { browser: '搜狗浏览器', browser_version: 'Chromium browser' };\r\n } else if (userAgent.indexOf('safari') > -1 && userAgent.indexOf('chrome') === -1) {\r\n return {\r\n browser: 'Safari',\r\n browser_version: userAgent.match(/version\\/([\\d.]+)/)?.[1],\r\n };\r\n } else if (/qqbrowser/.test(userAgent)) {\r\n return {\r\n browser: 'QQ浏览器',\r\n browser_version: userAgent.match(/qqbrowser\\/([\\d.]+)/)?.[1],\r\n };\r\n } else if (/micromessenger/i.test(userAgent)) {\r\n return {\r\n browser: '微信浏览器',\r\n browser_version: userAgent.match(/micromessenger\\/([\\d.]+)/)?.[1],\r\n };\r\n } else if (userAgent.indexOf('chrome') > -1 && userAgent.indexOf('safari') > -1) {\r\n return {\r\n browser: 'Chrome',\r\n browser_version: userAgent.match(/chrome\\/([\\d.]+)/)?.[1],\r\n };\r\n } else {\r\n return {\r\n browser: '未检测到的浏览器',\r\n browser_version: undefined,\r\n };\r\n }\r\n })();\r\n getBrowserNameVersion = () => browser;\r\n return browser;\r\n};\r\n\r\nfunction check360() {\r\n const result = false;\r\n for (const mt in navigator.mimeTypes) {\r\n //检测是否是360浏览器(测试只有pc端的360才起作用)\r\n if (navigator.mimeTypes[mt]['type'] === 'application/360softmgrplugin') {\r\n return !result;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n//获取操作系统类型\r\nexport function getOs() {\r\n return (navigator.userAgent.match(/[(](.*?)[)]/)?.[0] || '').replace(/[()]/g, '');\r\n}\r\n\r\n//获取屏幕缩放比例\r\nexport function getRatio() {\r\n let ratio = 0;\r\n const screen: any = window.screen;\r\n const ua = navigator.userAgent.toLowerCase();\r\n if (window.devicePixelRatio !== undefined) {\r\n ratio = window.devicePixelRatio;\r\n } else if (~ua.indexOf('msie')) {\r\n if (screen.deviceXDPI && screen.logicalXDPI) {\r\n ratio = screen.deviceXDPI / screen.logicalXDPI;\r\n }\r\n } else if (window.outerWidth !== undefined && window.innerWidth !== undefined) {\r\n ratio = window.outerWidth / window.innerWidth;\r\n }\r\n\r\n if (ratio) {\r\n ratio = Math.round(ratio * 100);\r\n }\r\n return ratio;\r\n}\r\n\r\n//获取浏览器宽高\r\nexport function getWH() {\r\n return {\r\n width: window.screen.width,\r\n height: window.screen.height,\r\n };\r\n}\r\n","import { v4 as uuidv4 } from 'uuid';\r\nimport { UUID } from './constant';\r\nimport { getBrowserNameVersion, getRatio, getOs, getWH } from '../utils/device';\r\nimport type { Device } from '../types/index';\r\n\r\n//基本信息\r\nexport default class BaseInfo {\r\n device: Device;\r\n uuid: string;\r\n constructor() {\r\n //设备信息\r\n this.device = Object.assign({}, getBrowserNameVersion(), getWH(), {\r\n ratio: getRatio(),\r\n os: getOs(),\r\n });\r\n if (!localStorage.getItem(UUID)) {\r\n this.uuid = uuidv4(); //唯一id;\r\n localStorage.setItem(UUID, this.uuid); //如果不存在uuid,则进行存储\r\n } else {\r\n this.uuid = localStorage.getItem(UUID) as string;\r\n }\r\n }\r\n}\r\n","import type { Info } from '../types/index';\r\n\r\nclass Events {\r\n cache: Info[];\r\n constructor() {\r\n this.cache = [];\r\n }\r\n\r\n getLength() {\r\n return this.cache.length;\r\n }\r\n add(data: Info) {\r\n this.cache.push(data);\r\n }\r\n clear() {\r\n this.cache.length = 0;\r\n }\r\n}\r\n\r\nexport default new Events();\r\n","/* 将时间戳转为年月日 */\r\nexport const getDate = (time: number) => {\r\n const date = new Date(time);\r\n const year = date.getFullYear();\r\n const month = date.getMonth() + 1; //获取系统月份,由于月份是从0开始计算,所以要加1\r\n const day = date.getDate();\r\n const hour = date.getHours();\r\n const minute = date.getMinutes();\r\n const second = date.getSeconds();\r\n\r\n const formatter = (date: number) => {\r\n let res = '';\r\n if (date < 10) {\r\n res = '0' + date;\r\n } else {\r\n res = date.toString();\r\n }\r\n return res;\r\n };\r\n\r\n return (\r\n year +\r\n '-' +\r\n formatter(month) +\r\n '-' +\r\n formatter(day) +\r\n ' ' +\r\n formatter(hour) +\r\n ':' +\r\n formatter(minute) +\r\n ':' +\r\n formatter(second)\r\n );\r\n};\r\n\r\n/* 将两个时间戳转为秒 */\r\nexport const getSeconds = (timestamp1: number, timestamp2: number) => {\r\n if (timestamp1 < timestamp2) {\r\n [timestamp1, timestamp2] = [timestamp2, timestamp1];\r\n }\r\n\r\n return Math.floor((timestamp1 - timestamp2) / 1000);\r\n};\r\n","import BaseInfo from './baseInfo';\r\nimport { MAX_CACHE_LEN, MAX_WAITING_TIME, UUID } from './constant';\r\nimport { sendData, getErrorId } from '../utils';\r\nimport events from './cache';\r\nimport { getDate, getSeconds } from '../utils/date';\r\n\r\nimport type { Options } from '../types/index';\r\n\r\nimport { EMIT_RTYPE } from '../types/event';\r\n\r\nexport default class EventTrack extends BaseInfo {\r\n private url: string; //上报地址\r\n private max: number; //最大缓存数\r\n private time: number; //最大缓存时间\r\n private timer: NodeJS.Timeout | undefined; //定时器ID\r\n private visitTime: number; //初始化时间\r\n private data: any;\r\n\r\n constructor(options: Options) {\r\n super();\r\n this.url = options.url;\r\n this.max = options.max || MAX_CACHE_LEN;\r\n this.time = options.time || MAX_WAITING_TIME;\r\n this.timer;\r\n this.visitTime = Date.now();\r\n this.data = options.data;\r\n }\r\n\r\n //格式化传输数据\r\n formatter(type: EMIT_RTYPE, data: any) {\r\n const date = Date.now();\r\n const info = Object.assign(\r\n {},\r\n { device: this.device, uuid: this.uuid },\r\n {\r\n type, //类型\r\n data, //自定义数据\r\n date: getDate(date), //日期\r\n url: window.location.href, //当前路由\r\n referrer: document.referrer, //上一次的路由\r\n uuid: localStorage.getItem(UUID), //如果已经有uuid,则用之前的\r\n duration: getSeconds(date, this.visitTime),\r\n userData: this.data, //外部传入的参数\r\n id: '', //日志id\r\n },\r\n );\r\n //给错误记录根据内容添加唯一id\r\n if ([EMIT_RTYPE.ERROR_JS, EMIT_RTYPE.ERROR_PROMISE].includes(type)) {\r\n Object.assign(info, { id: getErrorId(data.message) });\r\n }\r\n this.visitTime = date;\r\n return info;\r\n }\r\n\r\n send() {\r\n if (events.getLength()) {\r\n sendData(this.url, events.cache);\r\n events.clear(); //发送完,数组置空\r\n }\r\n }\r\n\r\n emit(type: EMIT_RTYPE, data?: any) {\r\n const info = this.formatter(type, data);\r\n if (!events.cache.filter((o) => o.id).some((o) => o.id === info.id)) {\r\n events.add(info);\r\n }\r\n clearTimeout(this.timer);\r\n // 满足最大记录数,立即发送\r\n events.getLength() >= this.max\r\n ? this.send()\r\n : (this.timer = setTimeout(() => {\r\n this.send();\r\n }, this.time));\r\n }\r\n}\r\n","/* 发送数据 */\r\nexport const sendData = (url: string, data: any) => {\r\n navigator.sendBeacon(url, JSON.stringify(data));\r\n};\r\n\r\nexport function isValidKey(key: string | number | symbol, object: object): key is keyof typeof object {\r\n return key in object;\r\n}\r\n\r\nexport function getErrorId(val: string) {\r\n return window.btoa(decodeURIComponent(encodeURIComponent(val)));\r\n}\r\n","/* 正则表达式:验证url */\r\nexport function isValidURL(url: string) {\r\n const pattern = new RegExp(\r\n '^(https?:\\\\/\\\\/)?' +\r\n '((([a-z\\\\d]([a-z\\\\d-]*[a-z\\\\d])*)\\\\.?)+[a-z]{2,}|' +\r\n '((\\\\d{1,3}\\\\.){3}\\\\d{1,3}))' +\r\n '(\\\\:\\\\d+)?' +\r\n '(\\\\/[-a-z\\\\d%_.~+]*)*' +\r\n '(\\\\?[;&a-z\\\\d%_.~+=-]*)?' +\r\n '(\\\\#[-a-z\\\\d_]*)?$',\r\n 'i',\r\n );\r\n return pattern.test(url);\r\n}\r\n\r\n/* 正则表达式:验证正整数 */\r\nexport function isValidInteger(number: number) {\r\n return /^\\d+$/.test(number.toString());\r\n}\r\n","import { isValidURL, isValidInteger } from './regular';\r\nimport type { Options } from '../types/index';\r\n\r\nabstract class Validator {\r\n public nextValidator: Validator | null;\r\n constructor() {\r\n this.nextValidator = null;\r\n }\r\n abstract setNext(validator: Validator): void;\r\n abstract validate(data: Options): void;\r\n}\r\n\r\n/* 验证url */\r\nclass UrlValidator extends Validator {\r\n constructor() {\r\n super();\r\n }\r\n setNext(validator: Validator) {\r\n this.nextValidator = validator;\r\n }\r\n\r\n validate(data: Options) {\r\n if (!isValidURL(data.url)) {\r\n console.error('请输入符合规范的url');\r\n return false;\r\n } else if (this.nextValidator) {\r\n return this.nextValidator.validate(data);\r\n } else {\r\n return true;\r\n }\r\n }\r\n}\r\n\r\n/* 验证缓存数量 */\r\nclass MaxValidator extends Validator {\r\n constructor() {\r\n super();\r\n }\r\n setNext(validator: Validator) {\r\n this.nextValidator = validator;\r\n }\r\n\r\n validate(data: Options) {\r\n if (data.max && !isValidInteger(data.max)) {\r\n console.error('max请输入正整数');\r\n return false;\r\n } else if (this.nextValidator) {\r\n return this.nextValidator.validate(data);\r\n } else {\r\n return true;\r\n }\r\n }\r\n}\r\n\r\n/* 验证上报时间 */\r\nclass TimeValidator extends Validator {\r\n constructor() {\r\n super();\r\n }\r\n setNext(validator: Validator) {\r\n this.nextValidator = validator;\r\n }\r\n\r\n validate(data: Options) {\r\n if (data.time && !isValidInteger(data.time)) {\r\n console.error('time请输入正整数');\r\n return false;\r\n } else if (this.nextValidator) {\r\n return this.nextValidator.validate(data);\r\n } else {\r\n return true;\r\n }\r\n }\r\n}\r\n\r\n/* 责任链模式 */\r\nconst urlValidator = new UrlValidator();\r\nconst maxValidator = new MaxValidator();\r\nconst timeValidator = new TimeValidator();\r\n\r\n/* 指定节点在责任链中的顺序 */\r\nurlValidator.setNext(maxValidator);\r\nmaxValidator.setNext(timeValidator);\r\n\r\nexport default urlValidator;\r\n","import ErrorPlugin from './plugin/error';\r\nimport PVPlugin from './plugin/pv';\r\nimport BehaviorPlugin from './plugin/behavior';\r\nimport PerformancePlugin from './plugin/performance';\r\nimport EventTrack from './eventTrack';\r\nimport Validator from '../utils/validator';\r\nimport { TYPES } from '../types/event';\r\nimport type { Options } from '../types/index';\r\n\r\nexport let track: EventTrack;\r\n\r\nexport default function initBase(options: Options) {\r\n if (!Validator.validate(options)) return;\r\n\r\n track = new EventTrack(options);\r\n window.$track = track;\r\n\r\n start(options);\r\n\r\n //页面刷新或卸载前主动发送数据\r\n window.addEventListener('beforeunload', track.send, true);\r\n}\r\n\r\n//根据参数启动对应的监听功能\r\n/* 工厂模式 */\r\nfunction start(options: Options) {\r\n const plugins = options.plugin;\r\n if (plugins) {\r\n plugins.forEach((plugin) => {\r\n switch (plugin) {\r\n case TYPES.CLICK:\r\n BehaviorPlugin.monitor(); //监听用户行为\r\n break;\r\n case TYPES.ERROR:\r\n ErrorPlugin.monitor(); //监听错误\r\n break;\r\n case TYPES.PERFORMANCE:\r\n PerformancePlugin.monitor(); //监听性能\r\n break;\r\n case TYPES.ROUTER:\r\n PVPlugin.monitor(); //监听路由\r\n break;\r\n default:\r\n break;\r\n }\r\n });\r\n }\r\n}\r\n","import initBase from './lib';\r\nimport type { Options } from './types/index';\r\n\r\n/* 单例模式 */\r\nconst init = (function () {\r\n let connect = false;\r\n return function (options: Options) {\r\n if (!connect) {\r\n initBase(options);\r\n connect = true;\r\n }\r\n };\r\n})();\r\n\r\nexport { init };\r\n\r\nexport { TYPES } from './types/event';\r\n\r\nexport default { init };\r\n"],"names":["DefinePlugin","name","constructor","this","TYPES","EMIT_RTYPE","syncError","e","error","target","Error","track","emit","ERROR_JS","message","stack","filename","HTMLLinkElement","HTMLScriptElement","HTMLImageElement","HTMLAudioElement","HTMLVideoElement","HTMLIFrameElement","url","src","href","ERROR_RESOURCE","asyncError","reason","ERROR_PROMISE","ErrorPlugin$1","super","monitor","window","addEventListener","PVPlugin$1","Hash","History","ROUTER_HASH","historyPushState","history","pushState","historyReplaceState","replaceState","apply","arguments","ROUTER_HISTORY","BehaviorPlugin$1","BEHAVIOR_CLICK","forEach","eventType","timer","document","clearTimeout","setTimeout","HTMLButtonElement","textContent","getRandomValues","PerformancePlugin$1","paint","lcp","dcl","load","observer","PerformanceObserver","list","entry","getEntries","PERFORMANCE_FP","startTime","PERFORMANCE_FCP","disconnect","observe","type","buffered","PERFORMANCE_LCP","PERFORMANCE_DOMCONTENTLOADED","timeStamp","PERFORMANCE_LOAD","rnds8","Uint8Array","rng","crypto","bind","byteToHex","i","push","toString","slice","_native","randomUUID","v4","options","buf","offset","native","rnds","random","arr","length","undefined","toLowerCase","unsafeStringify","UUID","getBrowserNameVersion","browser","userAgent","navigator","indexOf","browser_version","match","result","mt","mimeTypes","check360","includes","test","getRatio","ratio","screen","ua","devicePixelRatio","deviceXDPI","logicalXDPI","outerWidth","innerWidth","Math","round","BaseInfo","device","uuid","Object","assign","width","height","os","replace","localStorage","getItem","uuidv4","setItem","events","cache","getLength","add","data","clear","getDate","time","date","Date","year","getFullYear","month","getMonth","day","hour","getHours","minute","getMinutes","second","getSeconds","formatter","res","EventTrack","max","visitTime","now","info","location","referrer","duration","timestamp1","timestamp2","floor","userData","id","val","btoa","decodeURIComponent","encodeURIComponent","send","sendBeacon","JSON","stringify","filter","o","some","isValidInteger","number","Validator","nextValidator","urlValidator","setNext","validator","validate","RegExp","console","maxValidator","timeValidator","initBase","$track","plugins","plugin","CLICK","BehaviorPlugin","ERROR","ErrorPlugin","PERFORMANCE","PerformancePlugin","ROUTER","PVPlugin","start","init","connect","index"],"mappings":"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","x_google_ignoreList":[6,7,8,9]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cwj_monitoring",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.17",
|
|
4
4
|
"description": "基于 JS 适用Web端的插件,为前端项目提供【 行为、性能、异常 】监控手段",
|
|
5
5
|
"repository": "https://github.com/cwjbjy/cwj_monitoring",
|
|
6
6
|
"main": "dist",
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
"@babel/core": "^7.22.10",
|
|
29
29
|
"@babel/plugin-transform-runtime": "^7.22.10",
|
|
30
30
|
"@babel/preset-env": "^7.22.10",
|
|
31
|
+
"@changesets/cli": "^2.27.11",
|
|
31
32
|
"@commitlint/cli": "^17.7.1",
|
|
32
33
|
"@commitlint/config-conventional": "^17.7.0",
|
|
33
34
|
"@rollup/plugin-alias": "^5.0.0",
|
|
@@ -47,7 +48,6 @@
|
|
|
47
48
|
"husky": "^8.0.3",
|
|
48
49
|
"lint-staged": "^14.0.1",
|
|
49
50
|
"prettier": "^3.0.3",
|
|
50
|
-
"rimraf": "^5.0.1",
|
|
51
51
|
"rollup": "^3.27.2",
|
|
52
52
|
"rollup-plugin-delete": "^2.0.0",
|
|
53
53
|
"rollup-plugin-dts": "^6.1.0",
|
package/dist/index.d.ts
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
type Plugin = 'error' | 'click' | 'performance' | 'router';
|
|
2
|
-
|
|
3
|
-
//初始化时传入的参数
|
|
4
|
-
interface Options {
|
|
5
|
-
url: string;
|
|
6
|
-
max?: number;
|
|
7
|
-
time?: number;
|
|
8
|
-
plugin?: Plugin[];
|
|
9
|
-
data?: any;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
declare enum TYPES {
|
|
13
|
-
ERROR = "error",
|
|
14
|
-
CLICK = "click",
|
|
15
|
-
PERFORMANCE = "performance",
|
|
16
|
-
ROUTER = "router"
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
declare const init: (options: Options) => void;
|
|
20
|
-
|
|
21
|
-
declare const _default: {
|
|
22
|
-
init: (options: Options) => void;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
export { TYPES, _default as default, init };
|