图片优化方案:css
弊端:html
正常网页的加载流程:java
<script>
元素,就暂停解析,把网页渲染的控制权转交给 JavaScript 引擎。<script>
元素引用了外部脚本,就下载该脚本再执行,不然就直接执行代码。上述加载方式为同步加载,会阻塞浏览器的解析html文档。故而咱们常将script元素放置于body的底部webpack
三种实现方式:动态脚本、async、deferweb
动态建立script标签gulp
var scriptEle = document.createElement("script"); scriptEle.type = "text/javasctipt"; scriptEle.async = true; scriptEle.src = "http://xxxxxxx"; var x = document.getElementsByTagName("head")[0]; x.insertBefore(scriptEle, x.firstChild);
async
属性和defer
属性相似,也是会开启一个线程去下载js文件,但和defer
不一样的时,它会在下载完成后马上执行,而不是会等到DOM加载完成以后再执行,因此仍是有可能会形成阻塞。后端
且不会按照顺序执行,哪一个js文件先下载完就先执行哪一个浏览器
对于内联脚本无做用 (即没有src属性的脚本)。缓存
当浏览器遇到带有defer
属性的<script>
标签时,再开启一个线程去下载js文件,同时继续解析HTML文档,等等HTML所有解析完毕DOM加载完成以后,再按照出现顺序依次执行加载好的js文件。服务器
对于内联脚本无做用 (即没有src属性的脚本)。
通常来讲,是看脚本之间是否有依赖关系,有依赖的话应当要保证执行顺序,应当使用defer
没有依赖的话使用async
,同时使用的话defer
失效。要注意的是二者都不该该使用document.write,这个致使整个页面被清除。
https://juejin.im/post/5c4179...
优势:
浏览器缓存分为强缓存和协商缓存
若是资源没过时,就取缓存,若是过时了,则请求服务器。
cache-control:max-age = xxx
声明该资源在加载后的xxx秒内都直接使用缓存 使用的是相对时间 即加载文件本机的时间
Cache-Control 的几个取值含义:
若是在Cache-Control
响应头设置了 "max-age" 或者 "s-max-age" 指令,那么 Expires
头会被忽略。
强缓存步骤:
触发条件:
也就是说,无论怎样,均可能最后要进行协商缓存(no-store除外)
ETag:每一个文件有一个,改动文件了就变了,能够看似md5
Last-Modified:文件的修改时间
每次http返回来 responseheader 中的 ETag和 Last-Modified,在下次请求时在 requestheader 就把这两个带上(可是名字变了ETag-->If-None-Match,Last-Modified-->If-Modified-Since ),服务端把你带过来的标识,资源目前的标识,进行对比,而后判断资源是否更改了。
协商缓存步骤总结:
预解析的实现:
用meta信息来告知浏览器, 当前页面要作DNS预解析:
<meta http-equiv="x-dns-prefetch-control" content="on" />
在页面header中使用link标签来强制对DNS预解析:
<link rel="dns-prefetch" href="http://bdimg.share.baidu.com" />
注:dns-prefetch需慎用,多页面重复DNS预解析会增长重复DNS查询次数。
若是须要禁止隐式的 DNS Prefetch,可使用如下的标签:
<meta http-equiv="x-dns-prefetch-control" content="off">
在浏览器中a标签默认打开DNS预解析,可是在HTTPS中默认关闭
网络请求的过程走最近的网络环境,解决网络拥堵。