预加载扫描器
预加载扫描器是现代浏览器自身对于资源加载的一种性能优化,它负责在页面的解析过程中提前发现并下载页面中的资源(例如图片、CSS、JavaScript等),以提高页面加载速度和用户体验。
假如页面中不包含阻塞文档解析和渲染的资源,那么预加载扫描器的作用就会降低或者不起作用,因为主解析器和预加载扫描器在很大程度上可以同步进行工作。
工作原理
主解析器和预加载扫描器是并行工作的。
主解析器负责解析文档,构建 DOM 树和 CSSOM 树,这个过程是逐步的,当主解析器遇到阻塞性资源时,就会停下当前的解析工作,进行资源的加载,加载完成后才能继续解析文档。
而预加载扫描器则负责在主解析器解析文档的同时,并行地扫描HTML文档,提取可能需要加载的资源(例如CSS、JavaScript、图片等),并立即发起下载请求。
预加载扫描器并不会像主解析器那样因为资源加载而暂停,它的目的是尽早并行加载资源,最大化利用网络带宽。
它不阻塞主线程,运行在独立线程上。它只负责发现资源并发起请求,而不负责构建DOM树或执行JavaScript。
NOTE
预加载扫描器只能提前发现静态资源,对于动态加载的资源(比如通过 JavaScript 动态插入的资源),则无法提前加载。
例外情况
当主解析器遇到同步的JavaScript时,它会暂停文档的解析,而预加载扫描器也可能会因为主解析器暂停而无法继续扫描到新的资源。
直到该脚本执行完成,预加载扫描器可以在主解析器恢复工作后继续向下扫描。