浏览器加载资源过程
- 将资源分类
- 资源安全策略检查,决定资源的加载权限
- 资源优先级计算和排序
- 根据加载优先级顺序加载资源
资源分类
chrome 浏览器资源分为 14 类:
类别 | 介绍 |
---|---|
kMainResource | 主资源,Html页面文件资源属于该类型 |
kImage | 图片资源 |
kCssStyleSheet | 层叠样式资源 |
kScript | 脚本资源,即js |
kFont | 字体资源,即.woff |
kRaw | 混合类型资源,ajax请求属于该类资源 |
kSVGDocument | SVG矢量图资源 |
kXSLStyleSheet | 扩展样式表 |
kLinkPrefetch | HTML5 页面的预读取资源,如dns-prefetch |
kTextTrack | video 字幕资源,即 |
kImportResource | HTML Imports,如 |
kMedia | 多媒体资源 |
kManifest | 应用程序缓存资源 |
kMock | 预留的测试类型 |
安全策略检查
Content Security Policy,即 CSP,浏览器提供的白名单制度。
通过配置外部资源的加载和执行限制,提高网页安全性。
常用应用:通过限制非信任域名脚本的加载来预防XSS攻击
配置CSP的2种方式
- 页面HTTP请求头的Content-Security-Policy字段来限制
- 通过
<meta>
标签设置
预防XSS
<meta http-equiv="Content-Security-Policy" content="script-src 'self'; style-src nos.netease.com kaola.com;">
script-src:脚本资源
style-src:样式资源
‘self’:只信任当前域名下的外部资源
nos.netease.com kaola.com:信任白名单域名下的资源站点请求协议升级(http -> https)
<meta http-equiv="Content-Secur****ity-Policy" content="upgrade-insecure-requests">
upgrade-insecure-requests:升级所有非安全请求
将http资源强制以https或wss或SSL加密形式发送请求而不报错,如果服务器不支持https等SSL加密,则资源不加载阻止 Mixed Content
<meta http-equiv="Content-Security-Policy" content="block-all-mixed-content">
浏览器对于可能对安全性造成较大威胁的资源类型的混合模式请求都会直接拦截报错,例如脚本资源,但对于图片、音频、视频等资源只会警告,但不会阻止其加载。
资源优先级计算
资源优先级分级:5级
网络层面:Highest、Medium、Low、Lowest、Idle
浏览器内核:VeryHigh、High、Medium、Low、VeryLow
用户端控制台显示:Highest、High、Medium、Low、Lowest
浏览器内核,资源优先级计算
资源类型设定默认优先级
- html、css、font 优先级最高
- preload 预加载、script、xhr
- 图片、语言、视频
- prefetch 预读取资源
根据实际规则,对优先级进行调整
- XHR资源请求:同步XHR请求优先级最高
- 图片资源:默认优先级 LOW ,现代浏览器为了提高首屏体验,会将首屏资源优先级提高到 High
- 脚本资源:
defer/async属性标签的脚本的优先级会全部降为Low
脚本位置是在第一张图片前,标记early,定为 High 优先级;之后标记late,设为 Medium 优先级
加载资源
关键请求链:Critical-Request-Chains,可视区域渲染完毕(首屏),并对于用户来说可用时,必须加载的资源请求队列
查找页面的关键请求链
- 首屏快照获取关键 image 资源
- LightHouse 插件获取关键 js、css资源
- 控制台查看各资源优先级
优化关键请求链
- preload 和 prefetch
Preload:某些资源可能将来会被使用
<link rel="preload" href="test.jpg">
prefetch:资源预加载、DNS预解析、http预连接和页面预渲染
资源预加载:<link rel="prefetch" href="test.css">
DNS预解析:<link rel="dns-prefetch" href="//haitao.nos.netease.com">
http预连接:<link rel="prefetch" href="//www.kaola.com"> 将建立对该域名的TCP链接
页面预渲染:<link rel="prerender" href="//m.kaola.com"> 将会预先加载链接文档的所有资源
兼容性:
除了 dns-prefetch ,其他的兼容性十分堪忧,尤其 Safari
- LocalStorage
资源本地缓存