npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

microspot

v1.2.1

Published

<div align="center"> <h1>microspot</h1>

Downloads

6

Readme

Build Status Code Coverage version downloads MIT License PRs Welcome

Watch on GitHub Star on GitHub

内容列表

简介

在前端系统中,通常异常是不可控的,并不能确定什么时候或者什么场景会发生异常,但它却会实实在在的影响用户体现。所以,我们非常有必要去做这样一件事情,就是去监控异常的发生并防范它。

不过有时候尽管没有异常发生,功能也正常,但是由于编码的问题导致运行十分缓慢,这就需要监控 web 应用的性能指标。

除此之外,去了解用户的行为,以用户数据为基础,来指导我们产品的优化方向,也是前端监控的重要课题之一。

所以前端监控主要可以分为三大类:数据监控、性能监控和异常监控。

如何消费

microspot 支持 CDN 和 ES Module 的方式使用,但是必须确保的是需要在所有资源之前引入。

支持 CDN 引入

打包之后会在 es 文件夹中生成 index.global.js,我们将它挂到 CDN 上通过路径引入,它会在 window 上定义一个 microspot 对象,通过对象上的 set 方法来配置监听项,通过 start 方法启动监听。

<html>
  <head></head>
  <body>
    <script src="https://www.cdn.com/index.global.js"></script>
    <script>
      microspot.set({
        tracker: [
          'STABILITY',
          'EXPERIENCE',
          'BUSINESS'
        ],
        lastEvent: true,
        send: (spot) => {
          console.log('上传', spot)
        }
      });

      microspot.start(() => {
        console.log('启动监听');
      });
    </script>
  </body>
</html>

支持 ES Module

安装

本模块通过 npm 分发,需要将其添加到项目的 dependencies 中:

npm install microspot --save

通过 yarn 安装:

yarn add microspot

使用

import { Microspot } from 'microspot';
const microspot = new Microspot();
microspot.set({
  tracker: [
    'STABILITY',
    'EXPERIENCE',
    'BUSINESS'
  ],
  lastEvent: true,
  send: (spot) => {
    console.log('上传', spot)
  }
});

microspot.start(() => {
   console.log('启动监听');
});

配置项

我们通过 set 方法可以传入监控配置,下面是具体的配置项:

Config 定义

|字段|类型|默认值|描述| |:-:|:-:|:----:|:--| |tracker|{Array<string\|TrackerOption>}|['STABILITY','EXPERIENCE','BUSINESS']|需要监控的大类有:STABILITY 稳定性EXPERIENCE 体验BUSINESS 业务| |lastEvent|{boolean\|Array<string>}|true|是否监听最后操作事件, 也可以通过事件数组指定监听的事件| |send|{(spot: SendSpot\|SendSpot[], options: DefaultIndexOption) => void}|模块提供了 gif 上传方法|自定义埋点数据上传的方法,当埋点被触发时会调用该方法|

监控项

监控用户数据的上报格式,如下:

异常监控

监控 JS 运行时异常

配置
{
  "tracker": [
    {
      "type": "STABILITY",
      "index": [
        {
          "type": "JS_RUNTIME_ERROR",
          /** 采样率 0-1, 比如 0.2,只有百分之 20 的埋点会被上传*/
          "sampling": 1,
          /** 缓存,会收集埋点数据批量上传 */
          // "buffer": 10
        },
      ]
    }
  ],
}
埋点数据
interface Spot {
  type: string;
  env: { title: string; url: string; timestamp: number; userAgent: string; };
  subType: string;
  filename: string;
  message: string;
  position: string;
  stack: { at: string; scope: string; filename: string; lineno: string; colno: string; }[];
  selector: string;
}

监控资源加载异常

配置

|资源类型|对应字段| |:-----:|:-----:| |脚本|SCRIPT_LOAD_ERROR| |样式|CSS_LOAD_ERROR| |图像|IMAGE_LOAD_ERROR| |音频|AUDIO_LOAD_ERROR| |视频|VIDEO_LOAD_ERROR|

{
  "tracker": [
    {
      "type": "STABILITY",
      "index": [
        {
          "type": "SCRIPT_LOAD_ERROR",
          /** 采样率 0-1, 比如 0.2,只有百分之 20 的埋点会被上传*/
          "sampling": 1,
          /** 缓存,会收集埋点数据批量上传 */
          // "buffer": 10
        },
      ]
    }
  ],
}
埋点数据
interface Spot {
  type: string;
  env: { title: string; url: string; timestamp: number; userAgent: string; };
  subType: string;
  filename: string;
  tagName: string;
  selector: string;
}

捕获拒绝未处理的 Promise

配置
{
  "tracker": [
    {
      "type": "STABILITY",
      "index": [
        {
          "type": "PROMISE_REJECTION",
          /** 采样率 0-1, 比如 0.2,只有百分之 20 的埋点会被上传*/
          "sampling": 1,
          /** 缓存,会收集埋点数据批量上传 */
          // "buffer": 10
        },
      ]
    }
  ],
}
埋点数据
interface Spot {
  type: string;
  env: { title: string; url: string; timestamp: number; userAgent: string; };
  subType: string;
  message: string;
  filename: string;
  position: string;
  stack: { at: string; scope: string; filename: string; lineno: string; colno: string; }[];
  selector: string;
}

白屏

配置
{
  "tracker": [
    {
      "type": "STABILITY",
      "index": [
        {
          "type": "BLANK_SCREEN",
          /** 采样率 0-1, 比如 0.2,只有百分之 20 的埋点会被上传*/
          "sampling": 1,
          /** 缓存,会收集埋点数据批量上传 */
          // "buffer": 10
        },
      ]
    }
  ],
}
埋点数据
interface Spot {
  type: string;
  env: { title: string; url: string; timestamp: number; userAgent: string; };
  subType: string;
  emptyPoints: string;
  screen: string;
  viewPoint: string;
  selector: string[];
}

监控 Ajax

配置
{
  "tracker": [
    {
      "type": "STABILITY",
      "index": [
        {
          "type": "XHR",
          /** 采样率 0-1, 比如 0.2,只有百分之 20 的埋点会被上传*/
          "sampling": 1,
          /** 缓存,会收集埋点数据批量上传 */
          // "buffer": 10,
          /** 接口白名单,名单中的接口不会进行打点 **/
          "apiWhiteList": [/^http:\/\/127.0.0.1:5500\/.+/],
          /** 监听的状态码列表 **/
          "statusList": [404, 405]
        },
      ]
    }
  ],
}
埋点数据
interface Spot {
  type: string;
  env: { title: string; url: string; timestamp: number; userAgent: string; };
  subType: string;
  eventType: string;
  pathname: string;
  status: string;
  statusText: string;
  duration: string;
  response: string;
  params: string | Document | Blob | ArrayBufferView | ArrayBuffer | FormData;
}

监控 Fetch

配置
{
  "tracker": [
    {
      "type": "STABILITY",
      "index": [
        {
          "type": "FETCH",
          /** 采样率 0-1, 比如 0.2,只有百分之 20 的埋点会被上传*/
          "sampling": 1,
          /** 缓存,会收集埋点数据批量上传 */
          // "buffer": 10,
          /** 接口白名单,名单中的接口不会进行打点 **/
          "apiWhiteList": [/^http:\/\/127.0.0.1:5500\/.+/],
          /** 监听的状态码列表 **/
          "statusList": [404, 405]
        },
      ]
    }
  ],
}
埋点数据
interface Spot {
  type: string;
  env: { title: string; url: string; timestamp: number; userAgent: string; };
  subType: string;
  pathname: string;
  status: string;
  statusText: string;
  contentType: string;
  duration: string;
}

性能监控

Web 指标是 Google 开创的一项新计划,旨在为网络质量信号提供统一指导,这些信号对于提供出色的网络用户体验至关重要。

网站所有者要想了解他们提供给用户的体验质量,并非需要成为性能专家。Web 指标计划为了简化场景,帮助网站专注于最重要的指标,即 核心 Web 指标(LCP FID CLS)

除此核心指标之外还有另外一些指标,如 FP、FCP、longTask、内存使用情况和阶段耗时等也是重要的指标。

LCP (Largest Contentful Paint) 最大内容绘制

配置
{
  "tracker": [
    {
      "type": "EXPERIENCE",
      "index": [
        {
          "type": "LARGEST_CONTENTFUL_PAINT",
          /** 采样率 0-1, 比如 0.2,只有百分之 20 的埋点会被上传*/
          "sampling": 1,
          /** 缓存,会收集埋点数据批量上传 */
          // "buffer": 10,
        },
      ]
    }
  ],
}
埋点数据
interface Spot {
  type: string;
  env: { title: string; url: string; timestamp: number; userAgent: string; };
  subType: string;
  startTime: string;
  duration: string;
  selector: string;
  url: string;
}

FID (First Input Delay) 首次输入延迟

配置
{
  "tracker": [
    {
      "type": "EXPERIENCE",
      "index": [
        {
          "type": "FIRST_INPUT_DELAY",
          /** 采样率 0-1, 比如 0.2,只有百分之 20 的埋点会被上传*/
          "sampling": 1,
          /** 缓存,会收集埋点数据批量上传 */
          // "buffer": 10,
        },
      ]
    }
  ],
}
埋点数据
interface Spot {
  type: string;
  env: { title: string; url: string; timestamp: number; userAgent: string; };
  subType: string;
  cancelable: string,
  processingStart: string,
  processingEnd: string,
  startTime: string;
  duration: string;
}

CLS (Cumulative Layout Shift) 累计布局位移

配置
{
  "tracker": [
    {
      "type": "EXPERIENCE",
      "index": [
        {
          "type": "CUMULATIVE_LAYOUT_SHIFT",
          /** 采样率 0-1, 比如 0.2,只有百分之 20 的埋点会被上传*/
          "sampling": 1,
          /** 缓存,会收集埋点数据批量上传 */
          // "buffer": 10,
        },
      ]
    }
  ],
}
埋点数据
interface Spot {
  type: string;
  env: { title: string; url: string; timestamp: number; userAgent: string; };
  subType: string;
  value: string;
  sources: string[];
}

FP (First Paint) 首次绘制时间

配置
{
  "tracker": [
    {
      "type": "EXPERIENCE",
      "index": [
        {
          "type": "FIRST_PAINT",
          /** 采样率 0-1, 比如 0.2,只有百分之 20 的埋点会被上传*/
          "sampling": 1,
          /** 缓存,会收集埋点数据批量上传 */
          // "buffer": 10,
        },
      ]
    }
  ],
}
埋点数据
interface Spot {
  type: string;
  env: { title: string; url: string; timestamp: number; userAgent: string; };
  subType: string;
  startTime: string;
  duration: string;
}

FCP (First Contentful Paint) 首次内容绘制时间

配置
{
  "tracker": [
    {
      "type": "EXPERIENCE",
      "index": [
        {
          "type": "FIRST_CONTENTFUL_PAINT",
          /** 采样率 0-1, 比如 0.2,只有百分之 20 的埋点会被上传*/
          "sampling": 1,
          /** 缓存,会收集埋点数据批量上传 */
          // "buffer": 10,
        },
      ]
    }
  ],
}
埋点数据
interface Spot {
  type: string;
  env: { title: string; url: string; timestamp: number; userAgent: string; };
  subType: string;
  startTime: string;
  duration: string;
}

LongTask 长任务

配置
{
  "tracker": [
    {
      "type": "EXPERIENCE",
      "index": [
        {
          "type": "LONG_TASK",
          /** 采样率 0-1, 比如 0.2,只有百分之 20 的埋点会被上传*/
          "sampling": 1,
          /** 缓存,会收集埋点数据批量上传 */
          // "buffer": 10,
          /** 长任务埋点设定时长,超过这个时长会进行打点,默认 200 毫秒 */
          "limitTime": 200
        },
      ]
    }
  ],
}
埋点数据
interface Spot {
  type: string;
  env: { title: string; url: string; timestamp: number; userAgent: string; };
  subType: string;
  eventType: string;
  startTime: string;
  duration: string;
  selector: string;
}

Timing 阶段耗时

在 Web 应用中还有很多耗时的指标计算如下:

|名称|计算方法|描述| |:-:|:-----:|:-:| |loadTiming|loadEventEnd - startTime|页面加载总耗时| |dnsTiming|domainLookupEnd - domainLookupStart|DNS 解析耗时| |tcpTiming|connectEnd - connectStart|TCP 连接耗时| |sslTiming|connectEnd - secureConnectionStart|SSL 连接耗时| |requestTiming|responseStart - requestStart|网路请求耗时| |responseTiming|responseEnd - responseStart|数据请求耗时| |domTiming|domContentLoadedEventEnd - responseEnd|DOM 解析耗时| |resourceTiming|loadEventEnd - domContentLoadedEventEnd|资源加载耗时| |firstPacketTiming|responseStart - startTime|首包耗时| |renderTiming|loadEventEnd - responseEnd|页面渲染耗时| |htmlTiming|responseEnd - startTime|HTML 加载完时间| |firstInteractiveTiming|domInteractive - startTime|首次可交互时间|

配置
{
  "tracker": [
    {
      "type": "EXPERIENCE",
      "index": [
        {
          "type": "TIMING",
          /** 采样率 0-1, 比如 0.2,只有百分之 20 的埋点会被上传*/
          "sampling": 1,
          /** 缓存,会收集埋点数据批量上传 */
          // "buffer": 10,
        },
      ]
    }
  ],
}
埋点数据
interface Spot {
  type: string;
  env: { title: string; url: string; timestamp: number; userAgent: string; };
  subType: string;
  /** 性能元数据 */
  raw: PerformanceNavigationTiming;
  loadTiming: string;
  dnsTiming: string;
  tcpTiming: string;
  sslTiming: string;
  requestTiming: string;
  responseTiming: string;
  domTiming: string;
  resourceTiming: string;
  firstPacketTiming: string;
  renderTiming: string;
  htmlTiming: string;
  firstInteractiveTiming: string;
}

业务埋点

Page View 页面访问量

配置
{
  "tracker": [
    {
      "type": "BUSINESS",
      "index": [
        {
          "type": "PAGE_VIEW",
          /** 采样率 0-1, 比如 0.2,只有百分之 20 的埋点会被上传*/
          "sampling": 1,
          /** 缓存,会收集埋点数据批量上传 */
          // "buffer": 10,
        },
      ]
    }
  ],
}
埋点数据
interface Spot {
  type: string;
  env: { title: string; url: string; timestamp: number; userAgent: string; };
  subType: string;
  href: string;
}

自定义埋点

不管是 CDN 还是 ES Modulemicrospot 对象都会提供一个 send 方法,可以手动发送埋点数据,参数有两个:

import { Microspot } from 'microspot';
const microspot = new Microspot();
microspot.set(/** ... **/ );
microspot.start(/** ... **/);

/**
 * 第一个入参数是自定义的对象,不限制属性
 * 第二个入参数是指标配置项
 */
microspot.send(
  { type: '自定义 type', arg2: '自定义属性' }, 
  { sampling: 1, buffer: 10 }
);

指标配置项

从上面的配置中,应该已经大概了解,下面具体列举下:

|名称|适用的指标|描述| |:-:|:-----:|:-:| |type|all|指标类型| |sampling|all|采样率 0 - 1| |buffer|all|缓冲发送| |routerMode|PAGE_VIEW|路由模式| |apiWhiteList|XHR, FETCH|请求域名白名单| |statusList|XHR, FETCH|请求监听 status| |limitTime|LONG_TASK|长任务埋点设定时长|