Turbolinks

Table of Contents

Turbolinks 的历史和基本原理

  • Rails 里的 Assets Pipeline 会把 JavaScript、StypeSheet等资源都合并成单页面, 以减少浏览器需要发起的请求数量, 以加速浏览器加载页面的时间。
  • Assets Pipeline 的这种原理导致单个文件本身比较大, 如果每次都是全页刷新, 对加载速度一定会有影响, 所以 DHH 引入 Turbolinks 来解决重复载入和解析资源文件的时间浪费。
  • 页面加载速度 = 下载资源速度 + 解析资源速度, Turbolinks 解决的主要是解析资源的速度, 当切换页面时, Turbolinks会检查新页面 head 中 link 与 script 标签, 识别其中带有 data-turbolinks-track 的属性, 如果 src 发生变化, 就重新载入所有页面, 如果没有变化只是用新页面的 body 来替换老页面的 body 内容, 从而在绝大部分时间里避免每次重复解析和加载 head 中资源文件的时间(这个时间非常耗时)

优点

  • 单页面
  • 使用简单(//=require 'turbolinks')
  • 缓存

Chrome 解析页面步骤

  • 下载 index.html
  • 解析 head 标签中的 link 与 script 标签, 如果是带有 src 属性, 阻塞其他逻辑执行, 继续去下载对应的资源并执行. 如果没带, 则直接执行其中的代码逻辑.
  • 渲染 body 标签的内容, 并解析执行 body 中的 script 标签. 全部执行完毕, 执行 DOMContentLoaded 事件绑定的逻辑.
  • 第一次加载时网页执行跟上述是一致, 之后 Turbolinks 会绑定 Body 下所有的 a 元素的 click 事件, 切换页面时, Turbolinks 将会接管浏览器的页面加载过程

Turbolinks 解析页面步骤

  • 异步加载新页面的 index.html
  • 解析 head 标签中的 link 与 script 标签, 识别其中带有 data-turbolinks-track 的属性, 如果 src 有变化( 可能性很小 ), 则重载所有页面. 如果没有变化, 则不进行任何操作.
  • 解析 head 标签中新的 link 与 script 标签, 加载并执行.
  • 用新页面的 body 替换老的 body 中的内容, 并执行其中的 script 脚本.

资料

Date: 2020-02-26 Wed 08:41