最佳实践:head里面标签的顺序

渲染页面时为了保证最佳效果和可靠性,你应该小心放置head里面的元素。首先,我来解释下最佳顺序,然后解释为什么。

最佳head顺序

<doctype>
    <html>
        <head>
            <meta http-equiv content-type charset>
            <meta http-equiv x-ua-compatible>
            <base>
            <title, favicon, comments, script blocks, etc>

为什么顺序很重要

为来理解head里元素重要,先理解浏览器怎么解析页面的以及每个元素在解析时的作用。

当欧兰奇开始解析一个页面,它首先读http response body里面的内容。如果response里面的content-Type heade 指定里charset属性,这些body内容立即用指定的字符编码解析成文本。然而,如果charset没有定义,浏览器必须开始浏览response body里面的字节,同时在顶部确定一个unicode 字节顺序标记或者查找一个指定里字符集的meta http-equiv元素。当这些声明获取里,解析器需要重启,为里保证预先被读的字节是正确的。当重启时,F12开发者工具会显示如下:

这个重启会影响展现,我们现在来解释。

如果一个字符集声明没有找到,浏览器会强制自动识别,所以就造成来开发者的目的和浏览器的解析不一致的现象。这种不一致会导致一个乱码的页面。所以通过http response指定字符编码很重要。如果你处于某种原因只能通过meta来指定字符集,meta是head里的第一个元素至关重要。

IE8及以后的版本允许页面开发者指定用于渲染页面的文档模式,为了能是网站用建议的ie版本来渲染。因为文档模式会影响浏览器如何解析页面,IE会重新解析页面如果找到指定X-UA-Compatible值的meta元素。F12开发者当需要重启是会给出提示:

因为这个原因,所以设置X-UA-Compatible的最佳实践是放在http response header里。如果你必须在meta标签里指定,这个元素必须在所有的script blocks前面,并且应该尽可能的在前面。在一些例子里,X-UA-Compatible meta标签会被忽略(可能因为文档模式已经在之前被解析里)。当发生这个事情时,F12开发者工具会给出一下信息:

基础元素控制了一些相对路径怎么被引用成绝对路径的。通常,相对路径结合了当前页面的路径。然而,当一个基础标签出现时,指定的href用于路径整合,页面的路径没有用到。因为基础元素影响了所有的相对路径的整合,它应该在任何一个相对路径出现前出现。对于IE7,基础元素必须在head里,如果在body里会被忽略。通过document.write的方式指定一个base元素,这种做法时不鼓励的。

当你指定了charset,X-UA-Compatible,base ,接着就是title。

预解析的理解

为了减少js,css,img,其它资源的加载时间,IE需要尽可能的在加载页面时下载这些资源。当浏览器遇到一个non-async/non-defer script 元素浏览器解析会暂停,为了按顺序执行script。这种暂停会导致解析其它元素时延时。

为了缓解这种现象,当主解析器被暂停时,IE开启了第二个解析器主要负责寻找需要下载的资源。这种模式被称为超前的预解析,因为它看起来在主解析器之前。这种被超前触发的下载请求被成为speculative,因为这是可能的主解析器执行的script可能会改变最终的标签,从而造成了speculative请求的浪费。

当解析器强制解析文档模式或者charset,IE终止页面上所有的请求并且开始重新解析,再一次查找需要下载的资源。除了CPU的耗费,还有网络流浪。

例如,假设一个页面从IE9标准模式切换到极速模式。F12会显示重启:

你也会看到speculative 请求被终止。

因为这些请求开始的很早。

翻译原文:https://blogs.msdn.microsoft.com/ieinternals/2011/07/18/best-practice-get-your-head-in-order/

原文地址:https://www.cnblogs.com/tianmuxi/p/8954553.html

时间: 2024-10-16 11:49:56

最佳实践:head里面标签的顺序的相关文章

标签&lt;a&gt;的最佳实践

什么是标签 <a> 官方定义是这样的: The HTML <a> element (or anchor element) creates a hyperlink to other web pages, files, locations within the same page, email addresses, or any other URL. 也就是 <a></a>, 我们需要关注的就是<a>中的属性,以及标签之间的内容(content).

Dockerfile 最佳实践

之前 一篇文章介绍 docker 的镜像基本原理和概念 ,主要介绍在编写 docker 镜像的时候一些需要注意的事项和推荐的做法. 虽然 Dockerfile 简化了镜像构建的过程,并且把这个过程可以进行版本控制,但是不正当的 Dockerfile 使用也会导致很多问题: docker 镜像太大.如果你经常使用镜像或者构建镜像,一定会遇到那种很大的镜像,甚至有些能达到 2G 以上 docker 镜像的构建时间过长.每个 build 都会耗费很长时间,对于需要经常构建镜像(比如单元测试)的地方这可

Web前端优化最佳实践及工具集锦

前端的性能对于一个Web应用来说非常重要,如果一个Web应用的页面加载速度非常快.对于用户的操作可以及时响应,那么产品的用户体验将会极大地提升.下图显示了页面加载速度对于用户体验的影响. 你的Web页面的速度是否已经足够快了?其实可能还有很多可以提升的地方.Google和雅虎也提出了一些Web应用的前端优化建议,并发布了一些工具,你可以逐一检验你的Web应用,以便达到更高的性能. 这些优化不仅仅可以给用户提供更好的体验,从开发者角度来说,进行优化还可以减少页面的请求数.降低请求所占的带宽.减少资

WEB前端开发最佳实践(2)

样式和结构分离 HTML页面链接一个CSS(最优),提高加载速度 HTML内嵌CSS(单一页面最佳,减少加载CSS样式文件的请求数目,加快加载速度 内联CSS样式,可以使用JS动态来统一修改,很少使用,JQ中使用其实现动画效果 在CSS样式文件中引用CSS文件,避免使用 添加JS禁用提示信息 使用noscrpt,HTML4只在body中起作用,HTML5中可以出现在head中,支持HTML,不支持XHTML 最好使用noscript,采用渐进增强的模式,平稳降级 添加必要的meta的标签 met

给javascript初学者的24条最佳实践

1.使用 === 代替 == JavaScript 使用2种不同的等值运算符:===|!== 和 ==|!=,在比较操作中使用前者是最佳实践. “如果两边的操作数具有相同的类型和值,===返回true,!==返回false.”——JavaScript:语言精粹 然而,当使用==和!=时,你可能会遇到类型不同的情况,这种情况下,操作数的类型会被强制转换成一样的再做比较,这可能不是你想要的结果. 2.Eval=邪恶 起初不太熟悉时,“eval”让我们能够访问JavaScript的编译器(译注:这看起

JavaScript 刚開始学习的人应知的 24 条最佳实践

原文:24 JavaScript Best Practices for Beginners (注:阅读原文的时候没有注意公布日期,认为不错就翻译了,翻译到 JSON.parse 那一节认为有点不正确路才发现是 2009 年公布的文章,只是还是不错的啦. 另外,文章虽说 24 条最佳实践,事实上仅仅有 23 条.不知道原作者怎么漏了一条. ) 1. 优先使用 ===.而不是 == JavaScript 使用两种相等性操作符:===,!== 和 ==,!=. 通常觉得做比較的最佳实践是使用前一组操作

提高 Web 站点性能的最佳实践

本文内容 提高 Web 站点性能的最佳实践 最大限度减少 HTTP 请求 使用内容分发网络(CDN) 添加 Expires 或 Cache – Control 头 Gzip 组件 CSS 放在页面顶部 JavaScript 放在页面底部 避免 CSS 表达式 使用外部 JavaScript 和 CSS 减少 DNS 查询 精简 JavaScript 和 CSS 避免重定向 删除重复的脚本 配置 ETags 使得 Ajax 可缓存 尽早强制地发送缓冲给客户端 用 GET 发送 Ajax 请求 延迟

Android最佳实践之高效的应用导航

设计(一)- 规划Screens和他们之间的关系 原文地址:http://developer.android.com/training/design-navigation/screen-planning.html#beyond-simplistic-design 设计和开发Android应用程序的第一个步骤是确定用户能够查看和处理应用.一旦你知道用户与之交互的应用程序之间交互什么数据,下一步就是设计交互,允许用户导航到app的不同部分,进入和退出应用程序中的界面. 这篇文章开始向你展示如何规划高

Canvas 最佳实践(性能篇)

Canvas 想必前端同学们都不陌生,它是 HTML5 新增的「画布」元素,允许我们使用 JavaScript 来绘制图形.目前,所有的主流浏览器都支持 Canvas. Canvas 最常见的用途是渲染动画.渲染动画的基本原理,无非是反复地擦除和重绘.为了动画的流畅,留给我渲染一帧的时间,只有短短的 16ms.在这 16ms 中,我不仅需要处理一些游戏逻辑,计算每个对象的位置.状态,还需要把它们都画出来.如果消耗的时间稍稍多了一些,用户就会感受到「卡顿」.所以,在编写动画(和游戏)的时候,我无时