88 lines
3.2 KiB
JavaScript
88 lines
3.2 KiB
JavaScript
// copied to prevent pulling in un-necessary utils
|
|
const WEB_VITALS = [
|
|
'CLS',
|
|
'FCP',
|
|
'FID',
|
|
'INP',
|
|
'LCP',
|
|
'TTFB'
|
|
];
|
|
const initialHref = location.href;
|
|
let isRegistered = false;
|
|
let userReportHandler;
|
|
function onReport(metric) {
|
|
if (userReportHandler) {
|
|
userReportHandler(metric);
|
|
}
|
|
// This code is not shipped, executed, or present in the client-side
|
|
// JavaScript bundle unless explicitly enabled in your application.
|
|
//
|
|
// When this feature is enabled, we'll make it very clear by printing a
|
|
// message during the build (`next build`).
|
|
if (process.env.NODE_ENV === 'production' && // This field is empty unless you explicitly configure it:
|
|
process.env.__NEXT_ANALYTICS_ID) {
|
|
var ref;
|
|
const body = {
|
|
dsn: process.env.__NEXT_ANALYTICS_ID,
|
|
id: metric.id,
|
|
page: (ref = window.__NEXT_DATA__) == null ? void 0 : ref.page,
|
|
href: initialHref,
|
|
event_name: metric.name,
|
|
value: metric.value.toString(),
|
|
speed: 'connection' in navigator && navigator['connection'] && 'effectiveType' in navigator['connection'] ? navigator['connection']['effectiveType'] : ''
|
|
};
|
|
const blob = new Blob([
|
|
new URLSearchParams(body).toString()
|
|
], {
|
|
// This content type is necessary for `sendBeacon`:
|
|
type: 'application/x-www-form-urlencoded'
|
|
});
|
|
const vitalsUrl = 'https://vitals.vercel-insights.com/v1/vitals';
|
|
// Navigator has to be bound to ensure it does not error in some browsers
|
|
// https://xgwang.me/posts/you-may-not-know-beacon/#it-may-throw-error%2C-be-sure-to-catch
|
|
const send = navigator.sendBeacon && navigator.sendBeacon.bind(navigator);
|
|
function fallbackSend() {
|
|
fetch(vitalsUrl, {
|
|
body: blob,
|
|
method: 'POST',
|
|
credentials: 'omit',
|
|
keepalive: true
|
|
}).catch(console.error);
|
|
}
|
|
try {
|
|
// If send is undefined it'll throw as well. This reduces output code size.
|
|
send(vitalsUrl, blob) || fallbackSend();
|
|
} catch (err) {
|
|
fallbackSend();
|
|
}
|
|
}
|
|
}
|
|
export default ((onPerfEntry)=>{
|
|
// Update function if it changes:
|
|
userReportHandler = onPerfEntry;
|
|
// Only register listeners once:
|
|
if (isRegistered) {
|
|
return;
|
|
}
|
|
isRegistered = true;
|
|
const attributions = process.env.__NEXT_WEB_VITALS_ATTRIBUTION;
|
|
for (const webVital of WEB_VITALS){
|
|
try {
|
|
let mod;
|
|
if (process.env.__NEXT_HAS_WEB_VITALS_ATTRIBUTION) {
|
|
if (attributions == null ? void 0 : attributions.includes(webVital)) {
|
|
mod = require('next/dist/compiled/web-vitals-attribution');
|
|
}
|
|
}
|
|
if (!mod) {
|
|
mod = require('next/dist/compiled/web-vitals');
|
|
}
|
|
mod[`on${webVital}`](onReport);
|
|
} catch (err) {
|
|
// Do nothing if the module fails to load
|
|
console.warn(`Failed to track ${webVital} web-vital`, err);
|
|
}
|
|
}
|
|
});
|
|
|
|
//# sourceMappingURL=performance-relayer.js.map
|