page-timing ⏱ Collect and measure browser performance metrics
All metrics are converted to snake_case
import { paint } from 'page-timing' ;
window. addEventListener ( 'load' , ( ) => {
const results = paint ( ) ;
fetch ( '/send-metrics' , {
method : 'POST' ,
body : JSON . stringify ( results) ,
} ) ;
} ) ; API endpoints (TOC)
navigation
Name
Type
connect_end
number
connect_start
number
decoded_body_size
number
domain_lookup_end
number
domain_lookup_start
number
dom_complete
number
dom_content_loaded_event_end
number
dom_content_loaded_event_start
number
dom_interactive
number
dom_loading
number
encoded_body_size
number
fetch_start
number
load_event_end
number
load_event_start
number
navigation_start
number
redirect_end
number
redirect_start
number
request_start
number
response_end
number
response_start
number
secure_connection_start
number
transfer_size
number
unload_event_end
number
unload_event_start
number
paint
Name
Type
Meaning
first_paint
number
User agent first rendered after navigation
first_contentful_paint
number
Document contains at least one element that is paintable and contentful†
† contentful element: A visible element which contains non empty text, media content or input.
assets
Name
Type
Meaning
asset_javascript_count
number
Total number of Javascript resources
asset_javascript_load
number
Loading time spent on Javascript resources
asset_javascript_size
number
Total size of Javascript resources
asset_stylesheets_count
number
Total number of CSS resources
asset_stylesheets_load
number
Loading time spent on CSS resources
asset_stylesheets_size
number
Total size of CSS resources
asset_images_count
number
Total number of image resources
asset_images_load
number
Loading time spent on image resources
asset_images_size
number
Total size of image resources
asset_other_count
number
Total number of other resources
asset_other_load
number
Loading time spent on other resources
asset_other_size
number
Total size of other resources
connection
Name
Type
Meaning
connection_type
string
bluetooth, cellular, ethernet, none, wifi, wimax, other, unknown
effective_bandwidth
number
Mbps
effective_connection_type
string
slow-2g, 2g, 3g, 4g
effective_max_bandwidth
number
Mbps
reduced_data_usage
boolean
Vendor's "Data Saver" feature enables
round_trip_time
number
Estimated effective round-trip in ms
memory
Name
Type
Meaning
js_heap_size_limit
number
Maximum bytes available for JS heap
total_js_heap_size
number
Total allocated bytes for JS heap
used_js_heap_size
number
Currently active bytes of JS heap
display
Name
Type
Meaning
screen_avail_height
number
Height of space available for content
screen_avail_width
number
Width of space available for content
window_inner_height
number
Height of the window's layout viewport
window_inner_width
number
Width of the window's layout viewport
screen_color_depth
number
Color depth of the screen
screen_pixel_depth
number
Bit depth of the screen
screen_orientation_type
string
landscape-primary, landscape-secondary, portrait-primary, portrait-secondary
dom
Name
Type
Meaning
dom_node_count
number
Total number of nodes under the document object
dom_nest_depth
number
Highest nesting depth of DOM element under the document
html_size
number
Character count of the HTML document
measureWrap a function and measure it's execution time in milliseconds into a performance measure entry.
import { measure } from 'page-timing' ;
async function myFunction (
await wait ( 50 ) ;
doSomethingElse ( ) ;
}
await measure ( myFunction, 'my-function' ) ;
Object. assign (
... performance. getEntriesByType ( 'measure' ) . map (
( { name, duration } ) => ( { [ name] : duration} )
)
) ;
const { duration } = performance. getEntriesByName ( 'my-function' ) ;
Illustration of navigation events