Hola. Me gustaría compartir mi proyecto que he estado haciendo en los últimos meses. Es una herramienta de línea de comandos de código abierto diseñada para recopilar fácilmente métricas de rendimiento del sitio web en varios entornos de red (y no solo).
Emulación ya implementada de redes slow3g, fast3g y 4g, probando con o sin caché del navegador, emulación de ralentización del procesador. Se recopilan los eventos de la primera y más grande representación, el tiempo dedicado a construir el diseño y recalcular los estilos, el tamaño de los recursos cargados antes de FCP y otras métricas útiles.
Si está interesado en los detalles, un pequeño código y un poco sobre la nueva regla CSS que aparecerá en Chrome 85, ¡síganme!
¿Para qué?
Cuando aparece un nuevo instrumento, la pregunta número uno es "¿Por qué?" ¿Qué problema está tratando de resolver (aparte de "porque puedo")?
Así que comencemos con el problema. Era mayo, estaba tratando de optimizar la carga de una aplicación en React.JS y, para ser honesto, estaba un poco cansado. ¿Por qué estás cansada? Porque por cada estornudo que necesitaba:
- Seleccione los parámetros de red (por ejemplo, fast-3g)
- Empezar a perfilar
- ,
. , ? 12 . … , , - , , , :
, , , . , , , . Perfrunner , ( ) .
?
( "--"), Perfrunner
- . :
online
/regular4g
/fast3g
/hspa
/slow3g
. , , 100% . - . - . . . .
- . , . - React. , Angular .
- . , ( ), Perfrunner 3 . ,
--runs
.requiredPositiveInteger
, , , .
, , Perfrunner ( , ) . :
npx drag13.io --network slow-3g fast-3g hspa regular-4g online --cache true false
Perfrunner 24 , , HTML . , .
. :
- first-contentful-paint, largest-contentful-pain, dom-interactive -. - c .
- layout duration, script duration, recalculate-style-duration. ( ) .
- , FCP. .
- , .
- , .
():
jQuery . , CSS index.html SPA , preload prefetch, lazy-loading . 100 , , , slow-3g. , — - , , localhost.
, , .
?
. TypeScript, Lerna 3 – CLI, Reporters Core
CLI - command-line-args. , , slow3g
:
export const Slow3g: NetworkSetup = {
downloadThroughput: (0.4 * 1024 * 1024) / 8,
uploadThroughput: (0.4 * 1024 * 1024) / 8,
latency: 2000,
name: "slow3g",
};
Reporters . HTML, JSON CSV . HTML , --reporter
JSON, CSV , :
//reporer.js
module.exports = (outputFolder, data, args) =>
console.log(outputFolder, JSON.stringify(data), args);
npx perfrunner drag13@io --reporter "./reporter.js"
HTML Parcel Mustache. , c Parcel , . TypeScript, . ( ) parcel-plugin-inline-source. ( , Parcel ` "), - . Chart.JS, , , .
Core. Puppeter , . , , ( ):
import puppeteer, { Browser, Page } from "puppeteer";
const browser = await puppeteer.launch({ headless: true, timeout: 60000 });
const page = await browser.newPage();
await page.setCacheEnabled(false);
await pageSession.send("Network.setCacheDisabled", { cacheDisabled: true });
await pageSession.send("Network.enable");
await pageSession.send("Network.emulateNetworkConditions", {
latency: 20,
downloadThroughput: 500000,
uploadThroughput: 50000,
offline: false,
});
await pageSession.send("Emulation.setCPUThrottlingRate", { rate: 4 });
await pageSession.send("Performance.enable");
await page.goto(url.href, { waitUntil: "networkidle0" });
const metrics = await page.metrics();
const entries = await page.evaluate(() =>
JSON.stringify(performance.getEntries())
);
return { metrics, entries };
, , , .
, , largest-contentfull-paint performance.getEntries()
, . . , , JavaScript- (, , ), , , . , , , . . (mimetype) ( , ).
, , . , , .
«» , . , , , , ( ). TTFB, Stalled , 1200-1500ms. Proxy, - Windows . , wtf/sec .
chai + mocha preversion
prepublish
husky. , hasky lint-staged, prepush
prettier. CI/CD — Travis CI.
Content-Visiblity
- . , , Chrome 85 , , css — content-visibility. , , , , . , — . , .
Canary Chrome Puppeteer, , , headless . Perfrunner .
npx perfrunner "https://drag13.io" --network slow-3g fast-3g regular-4g --cache true false --executable-path" "C:\Users\ACCOUNT_NAME\AppData\Local\Google\Chrome SxS\Application\chrome.exe" --no-headless
:
Network | Cache | FMP before (ms) | FMP after (ms) | Diff (ms) |
---|---|---|---|---|
slow-3g | false | 4358 | 4267 | 91 |
slow-3g | true | 2953 | 2857 | 96 |
fast-3g | false | 421 | 329 | 92 |
fast-3g | true | 221 | 122 | 99 |
regular-4g | false | 316 | 223 | 93 |
regular-4g | true | 221 | 123 | 98 |
, 90ms 100ms 700 ( ) CoreI7 . .
, . . Perfrunner- Puppeter . — . , Perfrunner --chrome-args
, --ignore-default-args
, , --executable-path
.
().
. jQuery critical CSS . , , .
, , . readme. . — perfrunner.config , , , commitizen.
, , , . .