js 延迟加载的⽅式有哪些

JavaScript延迟加载(也称为懒加载或按需加载)是优化网页性能的一种重要技术,尤其是在处理大量脚本或资源时最简单的办法是我们⼀般采⽤的是将 js 脚本放在⽂档的底部,来使 js 脚本尽可能的在最后来加载执⾏。。下面列举了几种常见的JavaScript延迟加载的方式:

使用async属性

async属性允许浏览器异步地加载和执行脚本,而不会阻塞页面的解析。这意味着浏览器会在遇到脚本标签时开始下载脚本,但脚本的下载和执行不会阻塞页面的其他部分。

html

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

使用defer属性

defer属性会告诉浏览器,脚本应该在文档完全解析后,但在DOMContentLoaded事件触发前执行。使用defer可以确保脚本在DOM准备好之后执行,但不会阻塞页面的渲染。

html

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

动态创建脚本

通过JavaScript动态创建<script>元素并添加到DOM中,可以实现更精细的控制。这允许你在需要的时候加载脚本,比如某个用户交互之后。

javascript

var script = document.createElement('script');

script.src = 'script.js';

script.async = true; // 或者使用 script.defer = true;

document.head.appendChild(script);

Intersection Observer API

对于图片或其他媒体资源,可以使用Intersection Observer API来检测元素是否进入视口,然后按需加载资源。这是一种常见的懒加载技术。

javascript

const observer = new IntersectionObserver((entries, observer) => {

  entries.forEach(entry => {

    if (entry.isIntersecting) {

      const lazyImage = entry.target;

      lazyImage.src = lazyImage.dataset.src;

      lazyImage.classList.remove('lazy');

      observer.unobserve(lazyImage);

    }

  });

});

const lazyImages = [].slice.call(document.querySelectorAll('img.lazy'));

if ('IntersectionObserver' in window) {

  lazyImages.forEach(image => {

    observer.observe(image);

  });

} else {

  // Fallback for browsers that don't support Intersection Observer

  lazyImages.forEach(image => {

    image.src = image.dataset.src;

    image.classList.remove('lazy');

  });

}

请求动画帧(requestAnimationFrame)

虽然requestAnimationFrame通常用于动画,但也可以用于延迟脚本的执行,以便在浏览器下一次重绘之前执行。这不是传统意义上的懒加载,但它可以帮助你控制何时执行可能影响性能的代码。

使用加载器或模块打包器

现代前端工作流程(如使用Webpa*ck、Rollup等)通常包含代码分割和动态导入功能,这些功能允许你按需加载JavaScript模块。

javascript

// 使用动态导入语法

button.addEventListener('click', event => {

  import('./dynamic-module.js')

    .then(module => {

      // 使用module中导出的功能

    })

    .catch(err => {

      // 处理加载失败

    });

});

 

使用第三方库

还有许多第三方库(如loadjs, RequireJS, SystemJS等)可以帮助你实现延迟加载和代码分割。

请注意,在选择延迟加载策略时,需要考虑你的特定用例和性能目标。有些策略可能更适合某些情况,而不适合其他情况。

 

相关推荐

  1. js 延迟哪些

    2024-04-28 08:56:02       13 阅读
  2. MyBatis延迟(懒

    2024-04-28 08:56:02       45 阅读
  3. 同步、异步延迟、预区别

    2024-04-28 08:56:02       41 阅读
  4. MyBatis中延迟与分步查询总结

    2024-04-28 08:56:02       7 阅读
  5. js事件哪些

    2024-04-28 08:56:02       20 阅读
  6. Next.js 页面及流渲染(Streaming)

    2024-04-28 08:56:02       4 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-28 08:56:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-28 08:56:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-28 08:56:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-28 08:56:02       20 阅读

热门阅读

  1. 最短路(Dijkstra, Bellman-Ford, SPFA, Floyd)

    2024-04-28 08:56:02       11 阅读
  2. 数据结构与算法-图论-DFS/BFS

    2024-04-28 08:56:02       13 阅读
  3. 【笔记】 - Git

    2024-04-28 08:56:02       12 阅读
  4. isort库,一款超级神奇排序和格式化Python工具

    2024-04-28 08:56:02       15 阅读
  5. 解决eureka服务注册名报错

    2024-04-28 08:56:02       13 阅读
  6. 数字化转型之路:企业信息化建设的关键步骤

    2024-04-28 08:56:02       14 阅读
  7. HTML实体编码

    2024-04-28 08:56:02       11 阅读
  8. 多进程控制

    2024-04-28 08:56:02       21 阅读
  9. C++ 如何高效的使用 STL 容器?

    2024-04-28 08:56:02       17 阅读
  10. 数据库系统工程师之数据结构

    2024-04-28 08:56:02       17 阅读