阅读《JavaScript高级程序设计(第4版)》第二章及视频讲解
script
src
-
没有这个属性,表示包含行内js代码
-
有这个属性,用于指定要加载的外部js
type
- 在浏览器中,值始终是text/javascript
- 如果值为module,则代码会被当做ES6模块
- 如果值为nomodule,兼容不支持ES6的浏览器,主要是IE11
crossorigin
-
配置相关请求的CORS(跨域资源共享)设置。
-
基本概念
可以请求外部资源的标签:script,link,img,oudio,video
域的三部分:协议,域名,端口号
凭据:cookies,证书,用户名密码等
-
跨域请求(CORS)设置凭据模式
corssorigin="anonymous" 默认,表示不包含凭据
corssorigin="user-credentials", 表示包含凭据
integrity
-
确认引用外部资源(CDN等)不会存在恶意内容。
-
integrity=“散列值算法-散列值(Base64编码)”
<script integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC" ></script> -
浏览器在加载带有integrity属相的script和link时,在加载完文件后,会先比较自己计算的散列值与integrity属性的值,如果不相等,则返回网络错误。
脚本加载时间
绿色表示HTML文本解析器时间,蓝色表示获取资源时间,红色色表示代码执行时间
默认
- 碰见script标签后停止解析,进行资源获取,获取完成立即执行脚本,继续解析
- 会中断HTML文本解析,中断包括获取和执行
- script一般放在底部,之前
defer 推迟
- 碰见script标签后,异步进行资源获取,不会中断解析,等HTML文本解析完成后,执行脚本
- 在DOMContentLoaded事件之前执行
async 异步
- 碰见script标签后,异步进行资源获取,不会中断解析,获取资源完成后中断解析,立即执行脚本,继续解析
- 一般不会操作文档,不依赖文档
- 在load事件之前执行,可能在DOMContentLoaded之前或之后
type="module"
- 默认 defer 模式
- 从入口文件开始,异步加载所有的依赖,等待文档解析结束后执行
type="module" async
- async模式
- 从入口文件开始,异步加载所有的依赖,中断解析,执行脚本,继续解析
跨域获取资源的原理
script 元素一个最为强大、同时也备受争议的特性是,它可以包含来自外部域的JavaScript文件。同时拥有此功能的有script,link,img,oudio,video。src属性可以是一个完整的url。而且这个url指向的资源可以根包含它的HTML页面不在同一个域中。
浏览器在解析这个资源时,会向src属性指定的路径发送一个get请求,以取得相应的资源。这个初始的请求不受浏览器同源策略限制,但返回并被执行的JavaScript则受限制。当然这个请求仍然受到父页面HTTP/HTTPS协议限制。
来自外部的代码会被当成加载它的页面的一部分来加载和解释。