首页 > 其他分享 >怎样做到js无阻塞加载?

怎样做到js无阻塞加载?

时间:2024-12-09 09:59:19浏览次数:5  
标签:JavaScript 阻塞 js HTML async 解析 加载

在前端开发中,JavaScript 的阻塞加载会严重影响网页的性能和用户体验。当浏览器解析 HTML 遇到 <script> 标签时,会停止解析 HTML,优先下载并执行 JavaScript 代码,然后再继续解析 HTML。如果 JavaScript 代码执行时间过长,就会导致页面渲染延迟,出现“白屏”现象。

为了避免 JavaScript 阻塞加载,可以采用以下几种方法:

1. 使用 <script async> 属性:

async 属性告诉浏览器在下载 JavaScript 文件的同时继续解析 HTML。JavaScript 文件下载完成后会立即执行,不会阻塞 HTML 解析。多个带有 async 属性的脚本的执行顺序是不确定的,哪个先下载完哪个先执行。

<script async src="script1.js"></script>
<script async src="script2.js"></script>

2. 使用 <script defer> 属性:

defer 属性也告诉浏览器在下载 JavaScript 文件的同时继续解析 HTML。与 async 不同的是,带有 defer 属性的脚本会在 HTML 解析完成后,DOMContentLoaded 事件触发之前执行。多个带有 defer 属性的脚本会按照它们在 HTML 中出现的顺序执行。

<script defer src="script1.js"></script>
<script defer src="script2.js"></script>

3. 将 <script> 标签放在 <body> 的底部:

<script> 标签放在 <body> 的底部,可以确保在执行 JavaScript 代码之前,HTML 的主体内容已经解析完成并渲染出来。这样可以避免 JavaScript 阻塞 HTML 解析,提高用户体验。

<body>
  <!-- HTML content -->

  <script src="script.js"></script>
</body>

4. 使用动态脚本插入:

通过 JavaScript 动态创建 <script> 元素并将其添加到文档中,可以实现异步加载 JavaScript 文件。

function loadScript(src) {
  const script = document.createElement('script');
  script.src = src;
  script.async = true; // 可选,添加 async 属性
  document.head.appendChild(script);
}

loadScript('script1.js');
loadScript('script2.js');

5. 使用 import() 动态导入 (ES Modules):

对于使用 ES Modules 的项目,可以使用 import() 动态导入模块。这允许按需加载 JavaScript 模块,并且是异步的。

import('./myModule.js').then(module => {
  // 使用导入的模块
  module.doSomething();
});

选择哪种方法?

  • 如果脚本之间没有依赖关系,并且不需要访问 DOM,可以使用 async
  • 如果脚本之间有依赖关系,或者需要访问 DOM,并且需要在 DOMContentLoaded 事件触发之前执行,可以使用 defer
  • <script> 标签放在 <body> 底部是一种简单且有效的方法,适用于小型项目或对性能要求不高的场景。
  • 动态脚本插入和 import() 动态导入提供了更大的灵活性,适用于需要按需加载 JavaScript 模块的场景。

通过以上方法,可以有效避免 JavaScript 阻塞加载,提高网页的性能和用户体验。 选择哪种方法取决于你的具体需求和项目规模。 对于现代浏览器,asyncdefer 以及 import() 都是很好的选择。

标签:JavaScript,阻塞,js,HTML,async,解析,加载
From: https://www.cnblogs.com/ai888/p/18594290

相关文章

  • 使用js实现变态跳台阶
    /***变态跳台阶问题:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。**@param{number}n台阶数*@returns{number}跳法总数*/functionjumpFloor(n){//特殊情况处理:0级或1级台阶if(n<=1)......
  • 在 Vue 项目中,通常有两种方式来放置 JSON 文件
       放在public目录:如果你的JSON文件是静态的,不会经过任何处理,只是作为前端资源来读取(例如:一些配置文件、静态数据等),可以放在public目录中。这样做的好处是,文件不会被webpack处理,直接暴露在静态资源中。例如,你可以将JSON文件放在public/data/myfile.json,然后......
  • 什么情况下会出现css阻塞?
    CSS阻塞指的是浏览器在渲染页面时,为了避免出现内容闪现(FlashofUnstyledContent,简称FOUC),会等待CSS文件下载和解析完成后,才会渲染页面内容。这会导致页面在CSS加载完成之前呈现空白或无样式状态。出现CSS阻塞主要有以下几种情况:外部样式表:当使用<link>标签引入外部CSS文件......
  • 什么情况下会出现js阻塞?
    JavaScript阻塞会发生在浏览器的主线程被JavaScript代码长时间占用,导致无法及时响应其他任务,例如渲染页面、处理用户输入等。这会导致页面加载缓慢,卡顿,甚至假死,严重影响用户体验。以下几种情况会导致JavaScript阻塞:长时间运行的JavaScript代码:复杂的计算、大量的......
  • 一般习惯把js写在`</body>`前,但有例外的情况吗?说说看
    是的,一般习惯把JavaScript代码放在</body>结束标签之前,这是为了确保在执行JavaScript代码之前,HTML文档的结构已经完全加载完毕。这样可以避免JavaScript代码操作尚未加载的DOM元素,从而导致错误。然而,确实存在一些例外情况,在这些情况下,将JavaScript代码放在<head>......
  • python之IO并发-阻塞IO 非阻塞IO IO多路复用 异步IO(协程)
    阻塞IO即为之前正常使用的IO逻辑简单非阻塞IO可以把阻塞IO设置为非阻塞IO,例如sockfd.setblocking(false)。如果设置成了非阻塞,无客户端连接时就会报BlockingIOError错误,通过try来捕获。通过循环来接受客户端连接还可以设置超时检测,settimeout---sockfd.settimeout(5)超时报错......
  • 使用js写一个批量上传文件的组件
    importReact,{useState}from'react';functionBulkUpload(){const[selectedFiles,setSelectedFiles]=useState([]);const[uploadProgress,setUploadProgress]=useState({});const[uploadStatus,setUploadStatus]=useState({});co......
  • 在H5中如何预加载音频?
    在H5中预加载音频,你可以使用HTML5的<audio>元素,并结合JavaScript来实现。以下是几种常见的方法:1.使用preload属性:这是最简单的方法,直接在<audio>标签中设置preload属性。preload属性有三个值:auto:浏览器会尝试立即下载整个音频文件。这是最积极的预加载方......
  • 动态加载的li如何绑定事件?
    动态加载的<li>元素无法通过在HTML中直接绑定事件的方式进行处理,因为绑定事件的代码在动态加载<li>之前就已经执行完毕了。你需要使用事件委托机制。事件委托的核心思想是将事件监听器绑定到父元素上,利用事件冒泡机制,当子元素触发事件时,事件会冒泡到父元素,从而触发父元素上......
  • 基于Java+SSM+JSP高校宿舍管理系统(源码+LW+调试文档+讲解等)/大学宿舍管理系统/高校
    博主介绍......