浏览器加载资源顺序?

预先知识:

浏览器加载的时候是自上而下的,加载和渲染为同步进行

加载不会阻塞下载,解析会阻塞下载

js解析的时候会阻塞其他的加载

一般浏览器会在后面解析js文件,因为js中的代码很有可能改变dom树的结构

 

浏览器的加载一般顺序为:

  1. 将资源分类
  2. 安全策略检查
  3. 资源优先级计算
  4. 根据优先级下载资源

 

资源分类:

  • 主资源 html
  • 图片
  • css
  • js
  • 字体
  • ajax
  • svg
  • 引入的html资源
  • 多媒体资源,视频等

 

浏览器加载资源的顺序:

  • 最高级:html,css,font
  • 然后:js,xhr
  • 然后是多媒体:图片-语音-视频
  • 最后:prefetch预加载的资源

根据实际的规则,浏览器会对加载的资源顺序有所调整:

  • 同步的xhr请求优先级最高
  • 如果图片的视图在可见范围之内,优先加载图片

 

测试:

<!DOCTYPE html>

<head>
  <link rel="stylesheet" type="text/css" href="./index.css">
  <script type="text/javascript"></script>
</head>

<body>
  <embed height="100" width="100" src="./img/music/1.mp3"></embed>
  <img src="./img/1.png">
  <img src="./img/2.png">
  <img src="./img/3.png">
  <img src="./img/4.png">
  <img src="./img/5.png">
  <img src="./img/6.png">
  <img src="./img/7.png">
  <img src="./img/8.png">
  <img src="./img/9.png">
  <script type="text/javascript" src="./index.js"></script>
  <script type="text/javascript">
  </script>
</body>

</html>

chrome浏览器中查看解析执行的顺序:

 

虽然mp3文件放在了img的前面,但是解析的时候还是优先解析了图片资源。此时的图片在可视的视图之内。

由此可见,浏览器解析资源的一般顺序为:

html → css → 可视化图片 → js → 媒体 → ...

 

待续...

 

 

浏览器加载网页资源时,会根据资源的类型、位置以及开发者指定的方式决定其加载顺序。为了优化页面性能和用户体验,可以通过多种方式控制资源加载顺序,包括使用HTML标签属性、JavaScript脚本以及HTTP头信息等手段。 ### 资源加载顺序控制方法 #### 1. 使用 `<link rel="preload">` 提前加载关键资源 通过在 `<head>` 中添加 `<link rel="preload">` 标签,可以告诉浏览器某些资源是当前页面必需的,应以高优先级尽快下载[^2]。例如,预加载字体文件或关键的 JavaScript 文件: ```html <link rel="preload" href="styles.css" as="style"> <link rel="preload" href="main.js" as="script"> ``` 这种方式可以让浏览器提前知道哪些资源是关键路径上的,并优先加载这些资源。 #### 2. 使用 `async` 和 `defer` 控制脚本执行顺序 对于外部 JavaScript 文件,可以通过 `async` 或 `defer` 属性来控制其加载和执行行为: - **`async`**:脚本将异步加载,不会阻塞 HTML 解析,加载完成后立即执行,适用于不依赖页面 DOM 的脚本。 - **`defer`**:脚本会异步加载,但会在 HTML 文档解析完成之后、`DOMContentLoaded` 事件之前执行,适用于需要访问完整 DOM 的脚本。 ```html <script src="script1.js" async></script> <script src="script2.js" defer></script> ``` #### 3. 使用 `loading="lazy"` 延迟加载非关键资源 图片和 iframe 可以使用 `loading="lazy"` 属性实现延迟加载,即当用户滚动到接近该资源的位置时才开始加载: ```html <img src="image.jpg" loading="lazy" alt="Lazy loaded image"> <iframe src="video.html" loading="lazy"></iframe> ``` 此方法可显著减少初始加载时的资源请求量,提升首屏加载速度。 #### 4. 利用 HTTP/2 Server Push 推送关键资源 在支持 HTTP/2 的服务器上,可以通过 Server Push 主动推送关键资源(如 CSS、JS)给客户端,避免等待浏览器发起请求。这通常通过服务器配置实现,例如在 Nginx 或 Apache 中设置推送策略。 #### 5. 使用内联关键资源 将关键 CSS 或 JavaScript 直接写入 HTML 中,可以避免额外的网络请求,加快渲染速度。例如: ```html <style> /* Critical CSS */ body { font-family: Arial; } </style> <script> // Inline critical JS document.addEventListener('DOMContentLoaded', function () { console.log('DOM is ready'); }); </script> ``` #### 6. 控制资源加载优先级 浏览器会根据资源类型自动分配加载优先级,但也可以通过 `<link>` 标签的 `as` 和 `media` 属性影响这一过程。例如,加载打印样式表时可以将其优先级设为较低: ```html <link rel="stylesheet" href="print.css" media="print"> ``` #### 7. 使用 JavaScript 动态加载资源 通过脚本动态创建 `<script>` 或 `<link>` 元素,可以在运行时决定何时加载资源。例如: ```javascript const script = document.createElement('script'); script.src = 'dynamic.js'; document.head.appendChild(script); ``` 这种方法常用于按需加载模块或根据用户行为触发资源加载。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值