如何为小图标保存另一个宝贵的 HTTP 请求?

IT技术 javascript html css performance favicon
2021-02-21 03:30:48

每个人都知道如何在他们的 HTML 中设置 favicon.ico 链接:

<link rel="shortcut icon" href="http://hi.org/icon.ico" type="image/x-icon">

但是对于一个只有几个字节的小图标,我们还需要另一个可能会降低速度的 HTTP 请求,这很愚蠢

所以我想知道,我怎样才能使网站图标成为可用精灵(例如,background-position=0px -200px;)的一部分,它可以兼作网站其余部分的标志,以加快网站速度并保存宝贵的 HTTP 请求。我们如何才能将其与我们的徽标和其他艺术品一起放入现有的精灵图像中?

6个回答

我认为在大多数情况下它不会导致另一个 HTTP 请求,因为它们通常在第一次访问后转储到浏览器的缓存中。

这实际上比任何提议的“解决方案”更有效。

这是唯一合理的答案。这是一个不需要修复的非问题。
2021-04-27 03:30:48
其实一切都取决于浏览器。他们中的大多数人总是会在某些位置寻找图标,即使页面没有提到它,并且每次刷新都会调用 HEAD。
2021-04-30 03:30:48
詹姆斯,我的解决方案实际上只是一种可能性,但我永远不会真正推荐给某人。但是,似乎大多数浏览器都会在新的浏览器会话开始时为网站图标发出新的 HTTP 请求。而且,它并不总是返回 304。
2021-05-02 03:30:48
网站图标需要一个很长的过期标头,就像任何好的静态资源一样。这样,即使是 HEAD 调用也被抑制了。
2021-05-06 03:30:48
即使它在浏览器缓存中,浏览器仍然会进行 HEAD 调用,因此您仍然会有 HTTP 请求的开销。
2021-05-12 03:30:48

@yc 的回答的一个小改进是从通常会使用和缓存的 JavaScript 文件中注入 Base64 编码的图标,并且还favicon.ico通过在相关标签中提供数据 URI抑制请求的标准浏览器行为meta

这种技术避免了额外的 http 请求,并被确认在 Windows 7 上的最新版本的 Chrome、Firefox 和 Opera 中工作。但是它似乎至少在 Internet Explorer 9 中不起作用。

文件index.html

<!doctype html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <!-- Suppress browser request for favicon.ico -->
        <link rel="shortcut icon"type="image/x-icon" href="data:image/x-icon;,">
        <script src="script.js"></script>
...

文件script.js

var favIcon = "\
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABrUlEQVR42mNkwAOepOgxMTD9mwhk\
[...truncated for brevity...]
IALgNIBUQBUDAFi2whGNUZ3eAAAAAElFTkSuQmCC";

var docHead = document.getElementsByTagName('head')[0];
var newLink = document.createElement('link');
newLink.rel = 'shortcut icon';
newLink.href = 'data:image/png;base64,'+favIcon;
docHead.appendChild(newLink);

/* Other JavaScript code would normally be in here too. */

演示:turi.co/up/favicon.html

+1 漂亮的缓存突破@Marcel。PSHTTP Headers Response我的.ico文件中的字符几乎和我的图标一样大!!你觉得如何?
2021-04-23 03:30:48
@Sam:我注意到Stack Overflow favicon.ico文件PNG 等价物的 base64大小只有一半。好看又紧凑。
2021-04-25 03:30:48
@Sam:我正在将这个 PNG的 base64 与这个ICO 文件的 base64进行比较在我上面的示例代码中使用的 PNG 版本是大小的一半。
2021-04-29 03:30:48
哦,我明白了,这使您的 base64 答案和一般使用 base64 PNG 格式成为首选,对吗?
2021-05-06 03:30:48
eeehm 我不确定我是否理解你的意思:'文件是......的一半大小?PNG 文件像 icon.png 吗?或者你的意思是当它的 png 格式而不是图标格式或 gif 格式时,它的 base64 等价物更小?好奇的。队友的欢呼声!
2021-05-11 03:30:48

您可以尝试使用数据 URI没有 HTTP 请求!

<link id="favicon" rel="shortcut icon" type="image/png" href="data:image/png;base64,....==">

除非您的页面具有静态缓存,否则您的网站图标将无法被缓存,并且根据您的网站图标图像的大小,您的源代码可能会因此变得臃肿。

数据 URI 图标似乎适用于大多数现代浏览器;我让它在 Mac 上的 Chrome、Firefox 和 Safari 的最新版本中运行。似乎无法在 Internet Explorer 中工作,也可能在某些版本的 Opera 中无法使用。

如果您担心旧的 Internet Explorer 版本(现在您可能不应该担心),您可以包含一个 Internet Explorer 条件注释,以传统方式加载实际的favicon.ico,因为似乎旧的 Internet Explorer不支持数据 URI 图标。

`<!--[if IE ]><link rel="shortcut icon" href="http://example.com/favicon.ico"  type="image/x-icon" /><![endif]--> `
  1. 将 favicon.ico 文件包含在您的根目录中,以覆盖以任何一种方式请求它的浏览器,因为对于这些浏览器,如果无论您做什么,它们都已经在检查,您最好不要浪费带有 404 响应的 HTTP 请求.

您也可以只使用另一个流行网站的图标,该网站的图标可能已被缓存,例如http://google.com/favicon.ico,以便从缓存中提供服务。

正如评论者指出的那样,仅仅因为您可以这样做并不意味着您应该这样做,因为无论我们设计什么技巧,某些浏览器都会请求 favicon.ico。与通过执行 gzip 压缩、使用远未来的静态内容过期标头、缩小 JavaScript 文件、将背景图像放入 sprite 或数据 URI 等操作所节省的开销相比,您通过这样做节省的开销是微不足道的,从CDN提供静态文件等。

@Pekka,我明白了。PS,这是一个令人难以置信的游戏!让我的整个屏幕房地产都感到羞耻,因为您只需要 16x16 像素哈哈。此超链接开启了有关该网站图标实际可能实现的功能的一些可能性。
2021-04-20 03:30:48
只需使用 favicon.ico 来存储您的透明 gif :)
2021-04-21 03:30:48
@Sam 对不起,我现在明白 @yc 的意思了,我的错误。当然你可以完美的<link rel>通过JavaScript访问浏览器中元素,应该是可以的。我什至见过这样编程的游戏……但是它似乎也不能在 IE 中运行,而且它可能不会阻止默认/favicon.ico查找请求
2021-04-29 03:30:48
@Pekka 是的,这不是一个真正实用的解决方案,因为未缓存页面上的数据 URI 额外字节权重可能会超过该 HTTP 请求的权重。也许 OP 可以将 favicon 异步注入 DOM。
2021-05-06 03:30:48
如果缺少 favicon 声明,所有浏览器将自动请求默认 URL/favicon.ico以盲目尝试定位。因此,如果您省略了网站图标<link>(稍后通过 Javascript 添加),您可能只会让事情变得更糟。
2021-05-12 03:30:48

2020年杀手级解决方案

这个解决方案必然是在最初提出这个问题九年后提出的,因为直到最近,大多数浏览器还不能处理.svg格式的网站图标

现在已经不是这样了。

请参阅:https : //caniuse.com/#feat=link-icon-svg


1) 选择 SVG 作为 Favicon 格式

现在,在 2020 年 6 月,这些浏览器可以处理SVG Favicon

  • 铬合金
  • 火狐
  • 边缘
  • 歌剧
  • 安卓版 Chrome
  • KaiOS浏览器

请注意,这些浏览器仍然不能:

  • 苹果浏览器
  • iOS Safari
  • 火狐安卓版

尽管如此,考虑到上述情况,我们现在可以以合理的信心使用SVG Favicon


2) 将 SVG 显示为数据 URL

这里的主要目标是避免 HTTP 请求。

正如此页面上的其他解决方案所提到的,一个非常聪明的方法是使用Data URL而不是HTTP URL

SVG(尤其是小型 SVG)非常适合 Data URL,因为后者只是纯文本(带有任何潜在的歧义字符百分比编码),而前者是 XML,可以写成一长行纯文本(带有少量百分比代码)非常简单。


3)整个SVG 是一个单独的 Emoji

注意这一步是可选的。您的 SVG可以是单个表情符号,但也可以很容易地成为更复杂的 SVG。

2019 年 12 月,Leandro Linares是第一个意识到自从 Chrome 加入 Firefox 支持 SVG Favicon 以来,值得尝试看看是否可以从表情符号中创建一个 favicon:

https://lean8086.com/articles/using-an-emoji-as-favicon-with-svg/

利纳雷斯的预感是对的。

几个月后(2020 年 3 月),Code Pirate Lea Verou意识到了同样的事情:

https://twitter.com/leaverou/status/1241619866475474946

收藏夹图标再也不会一样了。


4)自己实施解决方案:

这是一个简单的 SVG:

<svg
  xmlns="http://www.w3.org/2000/svg"
  viewBox="0 0 16 16">

  <text x="0" y="14">🦄</text>
</svg>

这是与数据 URL相同的 SVG

data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2016%2016'%3E%3Ctext%20x='0'%20y='14'%3E🦄%3C/text%3E%3C/svg%3E

最后,这是作为 Favicon 的数据 URL

<link rel="icon" href="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2016%2016'%3E%3Ctext%20x='0'%20y='14'%3E🦄%3C/text%3E%3C/svg%3E" type="image/svg+xml" />

5)更多技巧(......这些不是你父母的收藏夹!)

由于 Favicon 是 SVG,因此可以对其应用任意数量的滤镜效果(SVG 和 CSS)。

例如,除了上面白色独角兽图标,我们可以通过应用过滤器轻松制作黑色独角兽图标

style="filter: invert(100%);"

黑色独角兽图标:

<link rel="icon" href="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2016%2016'%3E%3Ctext%20x='0'%20y='14'%20style='filter:%20invert(100%);'%3E🦄%3C/text%3E%3C/svg%3E" type="image/svg+xml" />
谢谢鲁宁!杰出的!SVG 也可以调整大小,因此在接下来的 9 年中,我们将可以选择我们希望网页浏览器选项卡上的网站图标有多大。选择: 16x16 32x32 64x64 128x128 作为原始海报,令人振奋的是,9 年后人们仍然关心让生活更美丽、更愉快、更活泼或更优雅的小事!:)
2021-04-18 03:30:48
你的问题完全有先见之明,@Sam。当你在 2011 年提出这个问题时,Steve Souders早就确定应该尽可能消除到服务器的往返。但在此后的几年里,网站图标顽固地要求自己进行专门的往返。幸运的是,由于浏览器制造商对基于 SVG 的图标的集体支持(迟来但非常受欢迎),情况不再如此。(我只是在我的努力中遇到了这个问题 - 仍在进行中,但我很快就会回到它 - 创建一个单文件Progressive Web App
2021-05-01 03:30:48
很好的贡献,@Danny'365CSI'Engelman,谢谢。我不知道它xlink:href现在已被弃用,但我已经将它从上面出现的任何地方删除了,因为它在图标 SVG 中没有业务。另外,我看到你%20用空白文字替换的论点,但我不情愿......因为,由外行复制粘贴和编辑,空白文字可以成为换行文字等。
2021-05-05 03:30:48
<IMG src="data:image/svg...">已经工作多年,我在52 PlayingCards Custom Element 中使用它,我认为它们对 favicon 使用相同的解析代码。无需为 DataURI 转义所有内容,只需转义#使用单引号。xlink 已被弃用,不是必需的。将数据 URI 降为:(data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><text x='0' y='14'>🦄</text></svg>在 Chrome 中测试)
2021-05-10 03:30:48
在对 viewBox20x20和 x,y 位置进行一些调整后-1,15.5我会说这是使用表情符号字符时开始的游乐场:(href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'><rect width='100%' height='100%' fill='hotpink'/><text x='-1' y='15.5' stroke='red'>😎</text></svg>"在 Chrome 和 FireFox 上测试)Firefox 尊重表情符号图标颜色设计,Chrome 没有。
2021-05-14 03:30:48

您可以使用 Base64 编码的图标,例如:

<link href="data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAACbUlEQVRIx7WUsU/qUBTGv96WSlWeEBZijJggxrREdwYixMnByYEyOvgfsBAMG0xuDsZ/QGc3NDFhgTioiYsmkhBYGLSBkLYR0va8gSjvQXiIT7/l5ibfOd/v3pN7gSmVSMTj8ThRfzdYk8lkMpl83/+AVFVVVXU0eHiVJEmSpB8DIcpkMplsdhCYz+fzhQJROBwOh8PDQN+oQCAQCASIRFEURZHI45GkP0/e7Xa73e70AMJnjel0Op1OA6oaDB4eAkAw6PcDvZ5t6zrw/Hx2trAw/cHYZ426ruu6DtzcGEYuBzQa19etFvD4WKtls4AoRqMPDwBjjLGPrt84ilgsFovF6EOapmmaRiP6O/jbAIguL4vFYpHGqlKpVCoVomq1Wq1Wibxer9fn+w+Q9+cUiUQikQhNrfdgWZZlWf4yyGhj27Zt254MUK/X6/X6F0aiKIqiKIOCYRmGYRjGZADLsizLIgqFQqHV1SkAnp5OTn79ItK0qyuPZ7SxaZqmaU4GKJfPzxmbfAPc/f3pqaIQLS8vLtZqgOP0bYyJoiAARC5Xrwf4/Vtbb2+Th1YqlUqlErC01GgkEkCz2WxyHLC+LsuiCAiCJLlcgM+3vd3pcBzXaJTLR0dEs7Ptdv+D4TiOG/A6DsBxQKvV621sAGtru7vl8ngAjuvXv7xcXIgiwNjMjCj2h+k4fQfPA4LA8xwHCO323V2hABiG223bwPy8xwMAbvfcHGMAY32j47y+3t4OAsZpZ2dzEwAsy7IcBxAExhwHMIxOx3GAlZVUyjT/1WFIudzenstFlEpFo9M8o+Pj/X2eJzo4SCR4fnzdb2N4Pyv9cduVAAAAAElFTkSuQmCC" rel="icon" type="image/x-icon" />
提示:此答案中使用的 base64 编码字符串是一个 PNG 文件,不适用于 IE10 或更早版本。
2021-04-27 03:30:48
如果有人想知道它是 linux penguin。
2021-05-10 03:30:48