GitRead 中文社区
首页趋势排行榜原创文章严选周刊
更多资源
新手训练营
精选专题热门话题GitHub 文档资源精选实战指南

nemetric

前端性能指标的监控,采集以及上报。用于测量第一个dom生成的时间(FP/FCP/LCP)、用户最早可操作时间(fid|tti)和组件的生命周期性能,,网络状况以及资源大小等等。向监控后台报告实际用户测量值。

  • 语言TypeScript
  • 默认分支master
  • 大小313 KB
  • 更新2020年2月23日
  • Issues2
在 GitHub 打开
avatarWarrenJones

项目介绍

WarrenJones/nemetric 是一个托管在 GitHub 上的开源项目,主要使用 TypeScript 编写,目前获得 183 个 Star、13 次 Fork。

仓库全名
WarrenJones/nemetric

README 摘要

Nemetrics v1.2.5) 一个小型的web性能监控库,它采集性能指标,如导航时间、资源时间、第一个有内容的油漆(FP/FCP)、最大的有内容油漆(LCP)、第一次输入延迟(FID)返回到您喜爱的分析工具。 Nemetrics 利用最新的 W3C Performance 提案 (比如 PerformanceObserver), 用于测量第一个dom生成的时间(FP/FCP)、LCP,用户最早可操作时间(fid|tti)和组件的生命周期性能。向监控后台报告实际用户测量值。 首次绘制 (FP) 首次内容绘制 (FCP) 首次输入延迟 (FID) 最大的绘制元素(LCP) 主角元素(Hero element) 框架、组件生命周期监控 Navigation Timing Resource Timing NetworkInformation 你可以收集这些指标…

完整内容见 GitHub 原始 README 或本页 。

常见问题

nemetric 用什么语言开发?

主要使用 TypeScript 编写,目前有 183 个 Star。

如何获取 nemetric 的源码?

可以直接克隆仓库:git clone https://github.com/WarrenJones/nemetric.git,默认分支为 master;安装与运行步骤见仓库 README。

nemetric 最近还在维护吗?

仓库最近一次更新为 2020年2月23日,当前有 2 个未关闭 Issue;Star 数为 183,可作为社区活跃度的参考。

本页面展示项目元数据与原始 README,GitRead 中文社区 编辑团队负责选题收录。

相关仓库

freeCodeCamp/freeCodeCamp avatar
freeCodeCampfreeCodeCamp
1 小时前
459.1k
47.5k
189

freeCodeCamp.org 的开源代码库和课程体系。免费学习数学、编程和计算机科学。

learn-to-codenonprofitsprogramming+7
TypeScript
571.2 MB
9
详情
morluto/rea avatar
reamorluto
3 小时前
457.7k
112.0k
941

借助智能体逆向分析任何内容,从应用行为直至原生二进制文件。

agent-skillsaiandroid+17
TypeScript
159.0 MB
0
详情
openclaw/openclaw avatar
openclawopenclaw
1 小时前
394.4k
81.6k
4.8k

真正做实事的 AI。任何 OS。任何平台。龙虾之道。🦞

aiassistantcrustacean+4
TypeScript
14.0 GB
18
详情
nilbuild/developer-roadmap avatar
developer-roadmapnilbuild
17 小时前
372.0k
46.3k
0

交互式路线图、指南及其他教育内容,帮助开发者在职业生涯中成长。

computer-scienceroadmapdeveloper-roadmap+7
TypeScript
356.3 MB
2
详情
deepseek-ai/deepseek-harness avatar
deepseek-harnessdeepseek-ai
18 小时前
280.5k
34.6k
0

DeepSeek Harness:一切皆插件。

ai-agentscordisdsh+1
TypeScript
380.6 MB
3
详情
anomalyco/opencode avatar
opencodeanomalyco
5 小时前
226.7k
30.7k
4.0k

开源编码代理。

TypeScript
709.5 MB
0
详情
vuejs/vue avatar
vuevuejs
2024年10月10日
212.5k
34.3k
645

这是 Vue 2 的仓库。如需 Vue 3,请前往 https://github.com/vuejs/core

vuejavascriptfrontend+1
TypeScript
31.4 MB
0
详情
n8n-io/n8n avatar
n8nn8n-io
1 小时前
210.4k
61.5k
1.2k

具备原生 AI 能力的公平代码工作流自动化平台。将可视化构建与自定义代码相结合,支持自托管或云端部署,提供 400+ 种集成。

automationipaasn8n+7
TypeScript
800.4 MB
3
详情

关于

dnsdomfcpfidfmpmetricsmonitornavigationnavigation-timingnetworkinformationperfmattersperformanceperformance-analysisperformance-metricsperformance-monitoringttiuser-timingweb-performancewebperfworker
  • 183 Stars
  • 13 Forks
  • 4 Watching

简要分析

热度分
213
价值分
114
活跃状态
活跃
GitHub

语言占比

TypeScript

贡献者

WarrenJonesWarrenJones

Nemetrics v1.2.5

一个小型的web性能监控库,它采集性能指标,如导航时间、资源时间、第一个有内容的油漆(FP/FCP)、最大的有内容油漆(LCP)、第一次输入延迟(FID)返回到您喜爱的分析工具。

Nemetrics 利用最新的 W3C Performance 提案 (比如 PerformanceObserver), 用于测量第一个dom生成的时间(FP/FCP)、LCP,用户最早可操作时间(fid|tti)和组件的生命周期性能。向监控后台报告实际用户测量值。

首次绘制 (FP)

首次内容绘制 (FCP)

首次输入延迟 (FID)

最大的绘制元素(LCP)

主角元素(Hero element)

框架、组件生命周期监控

Navigation Timing

Resource Timing

NetworkInformation

你可以收集这些指标,并在根据ip采集世界各地深入了解你的客户如何看待你的应用程序的web性能。使用您喜欢的分析工具来可视化国家之间的数据,

下图是某个应用 印度/fetchTime/ 的数据图

这是一些数据分析的生成图

如何使用

npm (https://www.npmjs.com/package/nemetric):

npm install nemetric --save-dev
import Nemetric from 'nemetric';

UMD

import Nemetric from 'node_modules/nemetric/dist/nemetric.umd.min.js';

Navigation Timing

  • DNS lookup: 当用户请求URL时,将查询域名系统(DNS),以将域转换为IP地址。
  • Header size: HTTP 头部大小
  • Fetch time:缓存查找和响应时间
  • Worker time: Service worker 时间加上响应时间
  • Total time:网络请求的请求和响应时间
  • Download time: 响应时间
  • Time to First Byte:客户端发送HTTP GET请求以接收来自服务器的请求资源的第一个字节所花费的时间。 它是最大的web页面加载时间组件,占整个web页面延迟的40%到60%。
  • page Load Time:页面加载所需的总时长
// fetchStart marks when the browser starts to fetch a resource
      // responseEnd is when the last byte of the response arrives
      fetchTime: parseFloat((navigation.responseEnd - navigation.fetchStart).toFixed(2)),
      // Service worker time plus response time
      workerTime: parseFloat(
        (navigation.workerStart > 0 ? navigation.responseEnd - navigation.workerStart : 0).toFixed(2),
      ),
      // Request plus response time (network only)
      totalTime: parseFloat((navigation.responseEnd - navigation.requestStart).toFixed(2)),
      // Response time only (download)
      downloadTime: parseFloat((navigation.responseEnd - navigation.responseStart).toFixed(2)),
      // Time to First Byte (TTFB)
      timeToFirstByte: parseFloat(
        (navigation.responseStart - navigation.requestStart).toFixed(2),
      ),
      // HTTP header size
      headerSize: parseFloat((navigation.transferSize - navigation.encodedBodySize|| 0).toFixed(2)),
      // Measuring DNS lookup time
      dnsLookupTime: parseFloat(
        (navigation.domainLookupEnd - navigation.domainLookupStart).toFixed(2),
      ),
      //page load time
      pageLoadTime:parseFloat(
        (navigation.loadEventEnd - navigation.startTime).toFixed(2),
      )
interface IAnalyticsTrackerOptions {
        data?: any;
        metricName: string;
        duration?: number;
        browser?: BrowserInfo | any;
}
const nemetric = new Nemetric({
  navigationTiming: true,
  analyticsTracker: (data: IAnalyticsTrackerOptions) => {
          //上报到后台 
          request.get('/metric/measure', data)
        }
});
// Nemetric: NavigationTiming {{'{'}} ... timeToFirstByte: 192.65 {{'}'}}

Resource Timing

Resource Timing收集与文档相关的资源的性能指标。比如css、script、图像等等。 Nemetric帮助公开所有的PerformanceResourceTiming条目和分组数据。

const nemetric = new Nemetric({
  resourceTiming: true,
  dataConsumption: true,
  analyticsTracker: (data: IAnalyticsTrackerOptions) => {
          //上报到后台 
          request.get('/metric/measure', data)
    }
});
// Nemetric: dataConsumption { "css": 185.95, "fetch": 0, "img": 377.93, ... , "script": 8344.95 }

NetworkInformation

NetworkInformation 提供有关设备正在使用的连接与网络进行通信的信息,并提供了在连接类型更改时通知脚本的事件。NetworkInformation 接口不能被是实例化, 而是通过 Navigator 的 connection 属性进行访问。

const nemetric = new Nemetric({
  networkInformation: true,
  analyticsTracker: (data: IAnalyticsTrackerOptions) => {
          //上报到后台 
          request.get('/metric/measure', data)
    }
});
// Nemetric: NetworkInformation  {downlink: 10, effectiveType: "4g", rtt: 100, saveData: false}

首次绘制 FP

FP 标记浏览器渲染任何在视觉上不同于导航前屏幕内容之内容的时间点

const nemetric = new Nemetric({
  firstPaint: true
});
// Nemetric: First Paint 1482.00 ms

首次内容绘制 (FCP)

FCP 标记的是浏览器渲染来自 DOM 第一位内容的时间点,该内容可能是文本、图像、SVG 甚至 <canvas> 元素。

const nemetric = new Nemetric({
  firstContentfulPaint: true
});
// Nemetric: First Contentful Paint 2029.00 ms

首次输入延迟 (FID)

FID 测量用户首次与站点交互时(即,当他们单击链接,点击按钮或使用自定义的,由JavaScript驱动的控件)到浏览器实际能够回应这种互动的延时。

const nemetric = new Nemetric({
  firstInputDelay: true
});
// Nemetric: First Input Delay 3.20 ms

最大内容绘制 (LCP)

LCP 标记的是浏览器渲染的最大的那个元素,可能是

  1. 元素
  2. 里面的元素
  3. 元素
  4. 一个有background-image:url样式的元素
  5. 块级元素包括 text节点或者其他内联元素 的元素
const nemetric = new Nemetric({
  largestContentfulPaint: true
});
// Nemetric: Largest Contentful Paint 2029.00 ms

在开发者工具中标记指标

性能标记 (自定义时间测量API) 用于在浏览器的性能条目中创建自定义性能标记。

nemetric.start('doStuff');
doStuff(300);
nemetric.end('doStuff');
// Nemetric: doStuff 0.14 ms

组件首次渲染

当浏览器将像素渲染到屏幕时,此指标会在创建新组件后立即标记该点。

nemetric.start('togglePopover');
$(element).popover('toggle');
nemetric.endPaint('togglePopover');
// Nemetric: togglePopover 10.54 ms

自定义日志记录

保存一段时间并且按照想要的方式打印出来

const nemetric = new Nemetric({
  logPrefix: 'warren.js:'
});
nemetric.start('doStuff');
doStuff(500);
const duration = this.nemetric.end('doStuff');
nemetric.log('Custom logging', duration);
//warren.js: Custom logging 0.14 ms

React

结合React 框架,我们可以开始配置Nemetric来收集初始化性能指标(比如 FCP,FID)。

将nemetric.start() 和 nemetric.endPaint() API用于组件的生命周期,已测量绘制组件所需要的时间。

import request from 'request';
import Nemetric from 'nemetric';
/**
 * 公开nemetric的装饰器接头
 * 自动绑定nemetric到对象里面,只需要
 * 1.在被绑定类里面声明静态变量 nemetric
 * 2.直接类命.nemetric就可以调用
 * 
 * @param project 项目名字
 * @param needReport 是否需要上报
 */
export const plugInNemetric = (project: string, needReport = true) => {
  return (target: Object) => {
    if (!Reflect.has(target, 'nemetric')) {
      const nemetric = new Nemetric({
        firstInputDelay: true,
        firstContentfulPaint: true,
        largestContentfulPaint: true,
        navigationTiming: true,
        dataConsumption: true,
        networkInformation: true,
        analyticsTracker: (data: IAnalyticsTrackerOptions) => {
          //上报到后台 
          if (needReport) {
              request.post('/metric/measure', { ...data, project} }).catch(err => {
                console.log('nemetric report failed')
              });
          }
        }
      })
      Reflect.set(target, 'nemetric', nemetric);
    }
  }
}


import React from 'react';

@plugInNemetric('App',true)
export default class App extends React.Component {

  constructor() {
    // 开始测量要绘制的组件时间
    App.nemetric.start('AppAfterPaint');
  }

  loadData = async () => {
    await request.get('whatever1');
    await request.get('whatever2');
    if(err){
       App.nemetric.clear('AppAfterPaint');
    }
    // 结束测量部件绘制时间
    App.nemetric.endPaint('AppAfterPaint');
  }

  render() {
    const data = this.loadData();
    return (
      <div>
        <h2>Nemo App</h2>
        <div>{data}</div>
      </div>
    );
  }
}

自定义 & 工具集

默认选项

在构造函数中提供给Nemetric默认选项。

const config: INemetricConfig = {
    // Metrics
    firstContentfulPaint: false,
    firstPaint: false,
    firstInputDelay: false,
    largestContentfulPaint: false,
    navigationTiming: false,
    networkInformation: false,
    dataConsumption: false,
    // Logging
    logPrefix: 'Nemetric:',
    logging: true,
    maxMeasureTime: 15000,
    warning: false,
    //默认是app端内应用
    inApp: true,
    sampleRate: 1
  };
工具集

Nemetric 公开了一些方法和属性,这些方法和属性可能对扩展这个库的人有用。

const nemetric = new Nemetric({
  firstContentfulPaint: true,
  firstInputDelay: true,
});

// Values
nemetric.firstPaintDuration;
nemetric.firstContentfulPaintDuration;
nemetric.firstInputDelayDuration;

// Aync Values
const durationFCP = await nemetric.observeFirstContentfulPaint;
const durationFID = await nemetric.observeFirstInputDelay;

// 将自定义用户时间标识发送到Google Analytics
nemetric.sendTiming(metricName, durationFCP);

文章

  • Nemetric 实现原理
  • 如何采集和分析网页用户的性能指标
  • Assessing Loading Performance in Real Life with Navigation and Resource Timing
  • navigation-timing
  • Idle Until Urgent
  • First Input Delay
  • Largest Contentful Paint

评论

登录 后发表评论
暂无评论
GitRead 中文社区
深度解读 · 趋势洞察 · 价值精选

关于

关于我们联系我们编辑准则收录标准赞赏人员

发现

技术趋势新手训练营资源精选实战指南精选专题热门话题GitHub 文档

条款

隐私政策服务条款网站地图
26.9万收录项目
7.2万中文话题
155精选专题
发现技术价值,连接开源智慧
© 2026 GitRead · GitHub 中文社区 本站与 GitHub, Inc. 无隶属关系;GitHub 是 GitHub, Inc. 的商标。