当前位置: 首页 > news >正文

外部引入的 JavaScript 放置位置

部引入的 JavaScript 通常有两种常见的放置位置,每个位置都有其优缺点,具体取决于页面的需求和性能优化目标:

1. 放在页面的 <head> 标签中

  • 这种方式在 HTML 文档的 <head> 部分引入 JavaScript 文件。
<head><script src="example.js"></script>
</head>
<body><div id="myDiv">Hello World</div>
</body>
优点:
  • 在页面加载前执行 JavaScript,确保页面初始化时所有的脚本都已经加载完毕。
  • 适合一些需要在页面渲染之前就初始化的 JavaScript,比如追踪代码或检测设备信息。
缺点:
  • JavaScript 会阻塞 HTML 的解析,导致页面内容显示延迟,影响用户体验,尤其是当 JavaScript 文件较大或网络速度较慢时。
  • 不推荐用于非关键脚本。

2. 放在页面的 <body> 底部(推荐做法)

  • 这种方式将 JavaScript 文件放在页面的最后,即 <body> 标签的末尾。
<body><div id="myDiv">Hello World</div><script src="example.js"></script>
</body>
优点:
  • HTML 先解析并显示页面内容,用户可以快速看到页面内容,提升用户体验。
  • JavaScript 不会阻塞 HTML 解析,尤其对于较大文件或复杂脚本,页面的初始加载速度会更快。
  • 对于需要操作 DOM 的 JavaScript,这种方式可以保证页面元素已解析完毕,避免找不到 DOM 元素的问题。
缺点:
  • 脚本执行较晚,可能会推迟某些交互行为的初始化。
  • 如果页面的交互依赖 JavaScript,用户可能会在 JavaScript 执行前无法使用页面上的功能。

3. 使用 deferasync 属性(优化方案)

如果希望在 <head> 中引入 JavaScript 文件,但不想阻塞 HTML 的解析,可以使用以下两种属性:

defer 属性
  • JavaScript 文件会与 HTML 并行加载,但会在 HTML 完全解析完毕后才执行。
  • 推荐使用 defer,因为它不会阻塞 HTML 解析,并且会按照脚本的引入顺序依次执行。
<head><script src="example.js" defer></script>
</head>
优点:
  • 不阻塞 HTML 解析,提升页面加载性能。
  • JavaScript 执行时,所有 DOM 元素已经被解析完毕,避免找不到 DOM 的问题。
  • 执行顺序保持一致(按顺序执行)。
async 属性
  • JavaScript 文件也会与 HTML 并行加载,但一旦文件加载完毕,就立即执行,而不等待 HTML 完全解析。
  • 适合独立、不依赖其他脚本或 DOM 操作的 JavaScript 文件,如分析工具或广告脚本。
<head><script src="example.js" async></script>
</head>
优点:
  • 不阻塞 HTML 解析,提升页面性能。
  • 适合不依赖 DOM 的脚本。
缺点:
  • 执行顺序不确定,因为脚本会根据其加载完成的时间执行,可能打乱多文件的执行顺序。

总结:

  • 最佳实践是将 外部 JavaScript 文件放在 <body> 底部,以确保页面内容快速加载,避免阻塞 HTML 解析。
  • 如果希望放在 <head> 中,可以使用 defer 属性 来确保 JavaScript 不阻塞页面加载,同时保证脚本在 DOM 完全解析后才执行。
  • 使用 async 属性 适合不依赖 DOM 或其他脚本的独立脚本,能够进一步优化页面加载性能。
http://www.lryc.cn/news/450818.html

相关文章:

  • 【tbNick专享】虚拟机域控、成员服务器、降级等管理
  • Raspberry Pi3B+之Rpanion(gst)和ffmpeg验证
  • 数据结构编程实践20讲(Python版)—04队列
  • Ubuntu开机进入紧急模式处理
  • 解决无网条件下离线安装缺失的python包
  • 海外媒体投稿:如何运用3种国内外媒体套餐发稿突出重围?
  • Spring DI 笔记
  • psutil库的使用说明
  • PMP--三模--解题--71-80
  • iTextPDF 一个功能强大的 Java PDF 库
  • QT C++ 自学积累 『非技术文』
  • 浅谈虚拟内存(操作系统、Redis)
  • 【LeetCode HOT 100】详细题解之链表篇
  • 二叉树的递归遍历
  • 国内访问OpenAI API
  • 深入 Spring RestTemplate 源码:掌握 HTTP 通信核心技术
  • 计算机网络:计算机网络概述 —— 初识计算机网络
  • set和map结构的使用
  • 2. qt_c++反射实例
  • 卷积神经网络(CNN)的计算量和参数怎么准确估计?
  • Ruby基础语法
  • 插入排序C++
  • 修改ID不能用关键字作为ID校验器-elementPlus
  • 一文详解WebRTC、RTSP、RTMP、SRT
  • 全国职业院校技能大赛(大数据赛项)-平台搭建Zookeeper笔记
  • 不同领域神经网络一般选择什么模型作为baseline(基准模型)
  • 华为-IPv6与IPv4网络互通的6to4自动隧道配置实验
  • 【spring中event】事件简单使用
  • leetcode每日一题day19(24.9.29)——买票需要的时间
  • 智源研究院推出全球首个中文大模型辩论平台FlagEval Debate