重新认识 script 标签:不只是写 JavaScript 那么简单

更新日期: 2025-09-19 阅读: 714 标签: 标签

很多人以为 script 标签只是用来写 JavaScript 代码的地方。这种理解没错,但并不完整。实际上,这个看似简单的标签背后隐藏着许多值得探索的细节。


脚本加载的两种方式:async 与 defer

浏览器解析 html 文档时,是从上到下一边解析一边渲染的。当遇到普通的 script 标签时,它会暂停解析,直到脚本下载并执行完成后才会继续。这就是为什么我们通常把脚本放在 body 底部的原因。

不过,async 和 defer 属性提供了更好的解决方案。

使用 defer 属性的脚本会异步下载,但会等到整个页面解析完成后,按照它们在文档中出现的顺序执行。这意味着它不会阻塞页面解析,又能保证执行顺序。

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

async 属性的脚本也是异步下载,但它会在下载完成后立即执行,不保证执行顺序。这意味着如果多个脚本有依赖关系,使用 async 可能会导致错误。

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

简单来说,defer 适合需要按顺序执行且不急于执行的脚本,而 async 适合独立且需要尽快执行的脚本,比如网站统计分析代码。


跨域脚本处理:crossorigin 属性

script 标签可以加载跨域资源,JSONP 技术就是利用了这个特性。但随着网络安全要求的提高,crossorigin 属性变得越来越重要。

设置 crossorigin 属性后,浏览器会启用 CORS(跨域资源共享)检查。如果服务器没有正确配置 CORS 响应头,浏览器会拒绝执行脚本。

<script src="https://fly63.com/script.js" crossorigin="anonymous"></script>

crossorigin 有两个可选值:

  • anonymous:启用 CORS 但不发送凭据

  • use-credentials:启用 CORS 并发送凭据(如 cookies)

使用 crossorigin 的主要好处是:

  1. 配合 integrity 属性可以验证资源完整性,防止脚本被篡改

  2. 能够获取更详细的脚本错误信息

  3. 符合内容安全策略(CSP)的要求


模块化脚本:type="module"

现代浏览器已经支持 ES 模块,只需设置 type="module" 即可使用 import 和 export 语法

<script type="module">
  import { utils } from './utils.js';
  // 使用导入的模块
</script>

使用模块化脚本有几个特点:

  1. 自动启用严格模式

  2. 支持顶级 await

  3. 默认具有 defer 的行为(异步加载不阻塞页面)

  4. 支持按需导入

对于需要导入映射的情况,可以使用 importmap:

<script type="importmap">
{
  "imports": {
    "vue": "https://unpkg.com/vue@3/dist/vue.esm-browser.js"
  }
}
</script>

这样在代码中就可以直接使用 import Vue from 'vue',而不需要写完整的 URL。


安全增强:nonce 属性

除了上述属性,nonce 也是一个重要的安全特性。它通常与内容安全策略(CSP)一起使用,防止跨站脚本攻击(XSS)。

nonce 是一个随机生成的字符串,只有匹配 CSP 头中指定的 nonce 值的脚本才会被执行。

服务器端设置 CSP 头:

Content-Security-Policy: script-src 'nonce-abc123'

HTML 中使用:

<script nonce="abc123">
  // 只有 nonce 值匹配的脚本才会执行
</script>

这种方式可以有效防止恶意脚本注入,提高网站安全性。


实际应用建议

  1. 对于主要功能脚本,优先使用 defer 而不是将脚本放在 body 底部

  2. 加载第三方资源时,总是使用 crossorigin 属性

  3. 在现代项目中,可以考虑使用 type="module" 利用浏览器原生模块支持

  4. 对于重要网站,实施 CSP 策略并使用 nonce 增强安全性

理解这些属性和它们的用途,不仅能优化页面加载性能,还能提高网站的安全性。虽然有些细节看起来复杂,但掌握它们对于前端开发者来说是非常有价值的。

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/12923

相关推荐

js动态添加html标签和属性_手动插入meta、script、div、img等标签

web网页是由 html标签一层层组成的,js也可以动态添加对应的标签,比如mate标签、script标签、div标签、img标签等,动态创建的方法基本都差不多,下面将简单介绍下如何实现

Html中a标签用法总结:创建email,电话,描点链接等。以及防止链接被搜索引擎收录

a标签是我们常用的一个标签之一,这篇文章主要讲解如何使用a来创建email,电话,描点链接等。以及防止链接被搜索引擎收录。

关于v-if和v-for不能一起使用在同一个标签上

遍历object的所有value(即li中的v-for),当拿到testData的第一个元素TESTOBJECT时,执行div中的v-for,此时的item对应T E S T O B J E C T这10个元素,于是循环10次,每一次都判断当前元素是否是array,很显然每次判断都是object

<script>标签的属性

src定义引用外部脚本的URI,这可以用来代替直接在文档中嵌入脚本。指定了 src 属性的script元素标签内不应该再有嵌入的脚本。type该属性定义script元素包含或src引用的脚本语言。

用css设置a标签无效,让链接跳转失效

这个代码有个坑,就是如果a标签里面放了一个图片,然后给a标签设置这个样式,这个时候是不起效果的,只能在a标签外面包一个div,然后给div设置这个样式

html的title和alt的区别

alt标签是html标签的属性,而title即使标签,又是标签的属性。 当title作为属性时,用来为元素提供额外的说明信息。当鼠标移入变迁内会显示title的内容,以达到补充说明或提示的效果。

video标签的属性

HTML5是下一代HTML,新增了许多新的标签,这些标签实现了许多新的功能。并且还减少了对外部插件的要求同时也可以更好的处理错误。比如HTML5中的video标签就可以很好的实现了在页面上播放视频的效果。

HTML中<base>标签的正确使用

<base> 标签必须位于 <head> 元素内部,在一个文档中,最多能使用一个 <base> 标签,使用了<base>标签的链接后,其他链接必须在<base>标签的链接里面,不然将无法找到。

html富文本的 ↵ 转为</br>标签

‘↵’是回车符/n,这段内容是通过textarea人为编辑,提交给后端保存的。编辑框中可以识别的字符,在普通的标签里面没办法识别到,所以要转换成可以识别的<br/>

web标签语义化的理解_web语义化是什么意思

Web语义化,使用语义恰当的标签,可以让页面具有良好的结构,页面元素具有良好的含义,从而让人和机器都能快速理解。语义化的web页面一方面可以让机器在更少的人类干预情况下收集并研究网页的信息,从而可以读懂网页的内容

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!