浏览器原理篇
浏览器缓存
浏览器解析HTML
::: TODO
script标签中async和defer属性有什么区别
async
(异步) 并行下载script
脚本(不会中断HTML
解析过程),下载完毕之后中断HTML
解析,执行脚本内容.
defer
(延迟) 并行下载script
脚本(不会中断HTML
解析过程),在执行DOMContentLoaded
事件之前,将下载好的script
内容执行。
默认行为是 在下载script脚本时会中断HTML解析,如果脚本内容比较大时,会导致加载时间较久,无法很快渲染出整个页面
动态添加
还有一种情况,通过createElement
方法创建script
标签,默认async
属性为true
如果你想要按照script
标签添加的顺序执行,请script.async=false
html
<script>
console.log('script1')
const script1 = document.createElement('script');
script.async = false;
script.src = 'foo.js';
document.body.appendChild(script1);
const script2 = document.createElement('script');
script2.async = false;
script2.src = 'bar.js';
document.body.appendChild(script2);
</script>
<script>console.log('script2')</script>
<!--
script1
script2
foo
bar
-->
script tag module模式
html
<script type="module"></script>
设置了module属性后,浏览器会对内部发起http请求,获取模块中的内容,此时script
会在后台下载,不会阻塞html
解析,等html
加载完成后根据标签顺序执行
Load和DOMContentLoad区别
- 页面中的DOM元素,CSS,JS,包含图片加载完成后触发Load事件
- 当HTML被加载解析完成之后,触发DOMContentLoad事件(比Load事件先触发,无需其他事件,如图片加载,CSS...)
在需要操作DOM的时候可以在DOMContentLoaded操作,如果涉及到图片这类资源内容需要在load事件中处理
浏览器自动填充
很多浏览器会会在DOMContentLoaded中自动填充表单,例如上一次您在某个网页上输入了账号密码并在浏览器保存了这一份数据,那么下一次在加载这个网页时浏览器就会在DOMContentLoaded事件中自动填充保存的数据
link tag preload
用于提前加载一些需要的依赖,并且这些资源会被优先加载
需要搭配as属性使用
html
<link rel="preload" href="main.css" as="style" />
link tag prefetch
利用浏览器空闲时间,用于提前加载一些后续需要资源,例如其他页面,后续打开将提高加载速度 用
html
<link rel="prefetch" as="document" href="other.html">