Resource Timing API 提供了高精度时间戳,用于度量当前页面加载时请求资源的速度。浏览器会在 加载资源时自动记录 PerformanceResourceTiming。这个对象会捕获大量时间戳,用于描述资源加 载的速度。 下面的例子计算了加载一个特定资源所花的时间:

const performanceResourceTimingEntry = performance.getEntriesByType('resource')[0];
console.log(performanceResourceTimingEntry);
// PerformanceResourceTiming {
//   connectEnd: 138.11499997973442
     //   connectStart: 138.11499997973442
    //   decodedBodySize: 33808
    //   domainLookupEnd: 138.11499997973442
    //   domainLookupStart: 138.11499997973442
    //   duration: 0
    //   encodedBodySize: 33808
    //   entryType: "resource"
    //   fetchStart: 138.11499997973442
    //   initiatorType: "link"
    //   name: "https://static.foo.com/bar.png",
    //   nextHopProtocol: "h2"
    //   redirectEnd: 0
    //   redirectStart: 0
    //   requestStart: 138.11499997973442
    //   responseEnd: 138.11499997973442
    //   responseStart: 138.11499997973442
    //   secureConnectionStart: 0
    //   serverTiming: []
    //   startTime: 138.11499997973442
    //   transferSize: 0
    //   workerStart: 0
    // }
console.log(performanceResourceTimingEntry.responseEnd – performanceResourceTimingEntry.requestStart);
    // 493.9600000507198

通过计算并分析不同时间的差,可以更全面地审视浏览器加载页面的过程,发现可能存在的性能瓶颈。

Web 组件

这里所说的 Web 组件指的是一套用于增强 DOM 行为的工具,包括影子 DOM、自定义 元素和 HTML 模板。这一套浏览器 API 特别混乱。  并没有统一的“Web Components”规范:每个 Web 组件都在一个不同的规范中定义。  有些 Web 组件如影子 DOM 和自定义元素,已经出现了向后不兼容的版本问题。  浏览器实现极其不一致。 由于存在这些问题,因此使用 Web 组件通常需要引入一个 Web 组件库,比如 Polymer。这种库可以 作为腻子脚本,模拟浏览器中缺失的 Web 组件。 注意 本章只介绍Web组件的最新版本。

HTML 模板

在 Web 组件之前,一直缺少基于 HTML 解析构建 DOM 子树,然后在需要时再把这个子树渲染出 来的机制。一种间接方案是使用 innerHTML 把标记字符串转换为 DOM 元素,但这种方式存在严重的 安全隐患。另一种间接方案是使用 document.createElement()构建每个元素,然后逐个把它们添加 到孤儿根节点(不是添加到 DOM),但这样做特别麻烦,完全与标记无关。 相反,更好的方式是提前在页面中写出特殊标记,让浏览器自动将其解析为 DOM 子树,但跳过渲视频讲解染。这正是 HTML 模板的核心思想,而