@zendesk/react-measure-timing-hooks
Version:
react hooks for measuring time to interactive and time to render of components
72 lines • 2.85 kB
JavaScript
;
/**
* Copyright Zendesk, Inc.
*
* Use of this source code is governed under the Apache License, Version 2.0
* found at http://www.apache.org/licenses/LICENSE-2.0.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.performanceMeasure = exports.performanceMark = void 0;
const getTimingMarkName = (name) => `useTiming: ${name}`;
const performanceMark = (name, markOptions, realMark = false) => {
const markName = getTimingMarkName(name);
// default to a "fake performance.mark", to improve UX in the profiler
// (otherwise we have thousands of little marks sprinkled everywhere)
if (realMark) {
// Since old browsers (like >1yr old Firefox/Gecko) unfortunately behaves differently to other browsers,
// in that it doesn't immediately return the instance of PerformanceMark object
// so we sort-of polyfill it cheaply below.
// see: https://bugzilla.mozilla.org/show_bug.cgi?id=1724645
try {
const mark = performance.mark(markName, markOptions);
if (mark)
return mark;
}
catch {
// do nothing, polyfill below
}
}
// polyfill:
return {
name: markName,
duration: 0,
startTime: markOptions?.startTime ?? performance.now(),
entryType: 'mark',
toJSON: () => ({}),
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
detail: markOptions?.detail ?? null,
};
};
exports.performanceMark = performanceMark;
const performanceMeasure = (name, startMark, endMark, detail) => {
// We want to use performance.mark, instead of performance.now or Date.now,
// because those named metrics will then show up in the profiler and in Lighthouse audits
// see: https://web.dev/user-timings/
// incidentally, this also makes testing waaay easier, because we don't have to deal with timestamps
const measureName = getTimingMarkName(name);
const end = endMark ? endMark.startTime + endMark.duration : performance.now();
// some old browsers might not like performance.measure / performance.mark
// we don't want to crash due to reporting, so we'll polyfill instead
try {
const measure = performance.measure(measureName, {
start: startMark.startTime + startMark.duration,
end,
detail: detail ?? {},
});
if (measure)
return measure;
}
catch {
// do nothing, polyfill below
}
return {
name: measureName,
duration: end - startMark.startTime,
startTime: startMark.startTime,
entryType: 'measure',
toJSON: () => ({}),
detail: detail ?? null,
};
};
exports.performanceMeasure = performanceMeasure;
//# sourceMappingURL=performanceMark.js.map