PerformAncetimeline规范定义了Web开发人员可以测量其Web应用程序的特定方面以使其更快的方法。它介绍了获得以下测量结果的两种主要方法:通过性能接口和通过性能操作器接口进行getter方法。后者是减少查询这些测量结果的性能影响的推荐方法。
性能键入对象可以托管某个指标的性能数据。 afformasterry具有4个属性: name , entryType , startTime和duration 。该规范不能定义具体性能键入对象。定义新型混凝土类型的性能对象的规格示例是油漆时机,用户时机,资源定时和导航时间。
性能接口通过三种新方法增强,可以返回performanceEntry对象列表:
getEntries() :返回性能对象可用的所有条目。getEntriesByType(type) :返回到entryType匹配类型的性能对象可用的所有条目。getEntriesByName(name, type) :返回所有可用的条目,其name匹配名称的性能对象。如果指定了可选参数类型,则仅返回其entryType匹配类型的条目。 以下示例显示了如何使用getEntriesByName()来获取第一个油漆信息:
// Returns the FirstContentfulPaint entry, or null if it does not exist.
function getFirstContentfulPaint ( ) {
// We want the entry whose name is "first-contentful-paint" and whose entryType is "paint".
// The getter methods all return arrays of entries.
const list = performance . getEntriesByName ( "first-contentful-paint" , "paint" ) ;
// If we found the entry, then our list should actually be of length 1,
// so return the first entry in the list.
if ( list . length > 0 )
return list [ 0 ] ;
// Otherwise, the entry is not there, so return null.
else
return null ;
} performanceObserver对象可以根据其entryType值将新的性能输入对象通知。对象的构造函数必须接收回调,每当用户代理派遣其entryType值与观察者观察到的新条目相匹配的新条目时,该回调将进行。此回调不是每个performanceentry或创建performanceentry时立即运行的。取而代之的是,在PerformanceObserver上“排队”条目,用户代理可以稍后执行回调。执行回调后,所有排队的条目都将传递到该函数上,并且performanceObserver的队列已重置。最初,performanceObserver不会观察到任何内容:必须调用observe()方法来指定要观察哪种性能的对象。可以使用“ EntryTypes”数组或单个“类型”字符串来调用observe()方法,如下所述。这些模式不能混合,或者将抛出异常。
施工后,回调传递到PerformanceObserver上是PerformanceObserverCallback 。这是一个带有以下参数的空白回调:
entries : PerformanceObserverEntryList对象,其中包含在回调中派遣的条目列表。observer :正在接收上述条目PerformanceObserver对象。hasDroppedEntries :一个boolean指示observer目前是否正在观察到一个entryType ,由于相应的缓冲液已满,因此至少丢失了一个条目。请参阅“缓冲旗”部分。 supportedEntryTypes static PerformanceObserver.supportedEntryTypes返回用户代理支持的entryType值的数组,按字母顺序排序。它可用于检测对特定类型的支持。
observe(entryTypes)在这种情况下,PerformanceObserver可以使用单个调用observe()指定各种entryTypes值。但是,在这种情况下不允许其他参数。多个observe()调用将覆盖要观察到的对象的种类。呼叫的示例: observer.observe({entryTypes: ['resource', 'navigation']}) 。
observe(type)在这种情况下,PerformanceObserver只能指定每个呼叫的单一类型observe()方法。在这种情况下,允许其他参数。除非对观察者进行相同type呼叫,否则多次observe()呼叫将堆叠,在这种情况下,它将覆盖。呼叫的示例: observer.observe({type: "mark"}) 。
buffered旗在此规范中定义了一个可以与observe(type)一起使用的参数:默认情况下的buffered标志。设置此标志后,用户代理会派遣记录其在PerformanceObserver的创建之前已经缓冲的记录,因此在此observe()呼叫发生后,在第一个回调中收到了记录。这使Web开发人员可以在方便的情况下注册PerformanceObservers,而不会在页面加载期间尽早派遣的条目。使用此标志的调用示例: observer.observe({type: "measure", buffered: true}) 。
每个entryType都有围绕注册表中描述的缓冲的特殊特征。特别是请注意,每种类型的条目数量都有限制。当entryType的缓冲区已满时,没有新的条目被缓冲。由于缓冲区通过其回调的hasDroppedEntry参数已满,因此PerformanceObserver可能会查询是否删除了条目(未缓冲)。
disconnect()当不再应该再通知条目时,可以调用此方法。
takeRecords()此方法返回已为性能播放器排队的条目列表,但尚未进行回调。对于性能播放器,也清空了条目的队列。它可以与disconnect()同时使用,以确保处理所有条目,直到特定时间点。
以下示例通过使用观察者标记和度量的性能者来记录所有用户定时,资源定时条目。
// Helper to log a single entry.
function logEntry ( entry => {
const objDict = {
"entry type" : , entry . entryType ,
"name" : entry . name ,
"start time" : , entry . startTime ,
"duration" : entry . duration
} ;
console . log ( objDict ) ;
} ) ;
const userTimingObserver = new PerformanceObserver ( list => {
list . getEntries ( ) . forEach ( entry => {
logEntry ( entry ) ;
} ) ;
} ) ;
// Call to log all previous and future User Timing entries.
function logUserTiming ( ) {
if ( ! PerformanceObserver . supportedEntryTypes . includes ( "mark" ) ) {
console . log ( "Marks are not observable" ) ;
} else {
userTimingObserver . observe ( { type : "mark" , buffered : true } ) ;
}
if ( ! PerformanceObserver . supportedEntryTypes . includes ( "measure" ) ) {
console . log ( "Measures are not observable" ) ;
} else {
userTimingObserver . observe ( { type : "measure" , buffered : true } ) ;
}
}
// Call to stop logging entries.
function stopLoggingUserTiming ( ) {
userTimingObserver . disconnect ( ) ;
}
// Call to force logging queued entries immediately.
function flushLog ( ) {
userTimingObserver . takeRecords ( ) . forEach ( entry => {
logEntry ( entry ) ;
} ) ;
}