• JS的执行和加载(笔记)


    无论当前JS代码是内嵌还是在外链文件中,页面的下载和渲染都必须停下来等待脚本执行完成。JS执行过程耗时越久,浏览器等待响应用户输入的时间就越长。当浏览器遇到内嵌的JS代码时会停止处理页面,先执行JS代码,然后再继续解析和渲染页面。同样的情况也发生在外链的JS文件中,浏览器必须先花时间下载外链文件中的代码,然后解析并执行它,在这个过程中,页面的渲染和用户互交完全被阻塞。从IE8、Firefox3.5、Safari4和Chrome2开始都允许并行下载JS文件,因此<script>标签在下载外部资源时不会阻塞其他的<script>标签。遗憾的是JS下载过程仍然会阻塞其他资源的下载(优化:①由于脚本阻塞页面其他资源的下载,因此推荐将所有<script>标签尽可能放到<body>标签底部,以尽量减少对整个页面下载的影响)。由于每个<script>标签初始下载时都会阻塞页面渲染,并且外链JS文件还要考虑HTTP请求会带来额外的性能开销,所以(优化:②减少页面包含的<script>标签数量有助于改善这一情况,下载单个100KB的JS文件比下载5个20KB的JS文件更快)。

    使用XHR(XMLHttpRequest)对象下载JS代码并注入页面中可以做到无阻塞的下载JS脚本:首先创建一个XHR对象,然后下载JS文件,接着用一个动态<script>元素将JS代码注入页面。这个方法的主要优点是,你可以下载不立即执行的JS代码,由于代码返回在<script>标签之外,所以下载后不会自动执行,而且所有现代浏览器中都不会引发异常。最主要的限制是(JS文件必须与页面放置在同一个域内,不能从CDN下载)。

    //此代码向服务器发送一个获取script1.js文件的GET请求。
    //Onreadystatechange事件处理函数检查readyState是不是4,然后检查HTTP状态码是不是有效,如果有效,那么创建一个新的<script>元素,
    //将它的文本属性设置为从服务器接收到的responseText字符串,这样做实际上会创建一个带有内联代码的<script>元素。一旦新<script>元素被添加到文档,代码将被执行并准备使用。
    var xhr = new XMLHttpRequest(); xhr.open("get", "script1.js", true); xhr.onreadystatechange = function(){ if (xhr.readyState == 4){ if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){ var script = document.createElement ("script"); script.type = "text/javascript"; script.text = xhr.responseText; document.body.appendChild(script); } } }; xhr.send(null);
  • 相关阅读:
    spring全家桶的pom的基本配置
    springboot项目中的普通Session和使用redis存储session
    Springboot项目修改html后不需要重启---springboot项目的热部署
    springboot的异步调用
    最近5年183个Java面试问题列表及答案[最全]
    SpringBoot 之Spring Boot Starter依赖包及作用
    最近玩了下linux下的lampp注意一些使用
    关于dumper和mysqldump的
    python入门-python处理csv文件格式相关
    好久没玩docker了,温下手
  • 原文地址:https://www.cnblogs.com/zhuifeng/p/3757959.html
Copyright © 2020-2023  润新知