class ListenDomChange { // 监听 dom 节点 dom = null; // observer observer = null; // performance performanceConfig = {}; constructor(dom, callbackDomChange) { this.dom = dom; this.callbackDomChange = callbackDomChange; // 初始化为{} this.performanceConfig={} // 计算performanceConfig this.calcPerformance() } // 监听 dom变化 mutationListen() { // 选择需要观察变动的节点 const targetNode = this.dom // 观察器的配置(需要观察什么变动) const config = { attributes: true, childList: true, subtree: true }; // 当观察到变动时执行的回调函数 const callback = function (mutationsList, observer) { // Use traditional 'for loops' for IE 11 for (let mutation of mutationsList) { if (mutation.type === "childList") { console.log("A child node has been added or removed."); } else if (mutation.type === "attributes") { console.log("The " + mutation.attributeName + " attribute was modified."); } } console.log('change', change) }; // 创建一个观察器实例并传入回调函数 this.observer = new MutationObserver(callback); // 以上述配置开始观察目标节点 this.observer.observer.observe(targetNode, config); // 之后,可停止观察 this.observer.observer.disconnect(); } getPerformance(){ return performance } setPerformance(key,value){ this.calcPerformance[key]=value } calcPerformance() { // Time to when activation occurred let activationStart = performance.getEntriesByType("navigation")[0].activationStart; // Time to first paint let firstPaint = performance.getEntriesByName("first-paint")[0].startTime; // Time to first contentful paint let firstContentfulPaint = performance.getEntriesByName( "first-contentful-paint", )[0].startTime; console.log("time to first paint: " + (firstPaint - activationStart)); console.log( "time to first-contentful-paint: " + (firstContentfulPaint - activationStart), ); setPerformance('time to first paint',firstPaint - activationStart) setPerformance('time to first-contentful-paint',firstContentfulPaint - activationStart) const entries = performance.getEntriesByType("navigation"); entries.forEach((entry) => { console.log(`${entry.name}: domComplete time: ${entry.domComplete}ms`); const domContentLoadedTime = entry.domContentLoadedEventEnd - entry.domContentLoadedEventStart; console.log( `${entry.name}: DOMContentLoaded processing time: ${domContentLoadedTime}ms`, ); setPerformance(entry.name,domContentLoadedTime) }); } } export { ListenDomChange }