【问题标题】:Loading web page icons asynchronously - a cross-browser solution?异步加载网页图标 - 跨浏览器解决方案?
【发布时间】:2020-01-06 06:57:46
【问题描述】:

在当今支离破碎的网络图标环境中(令人惊讶的是).svg 图标尚未获得广泛支持,人们可能会想在头部添加大量元素指向任意数量的元素

  • favicons
  • icons
  • apple-touch-icons
  • safari-pinned-tabs
  • mstiles

等等

任何页面上的网站图标、图标、触摸图标、磁贴等的综合列表都会非常庞大​​。

这会影响页面初始化和加载时间,在某些情况下会非常显着。

金发姑娘的解决方案是能够根据需要添加尽可能多的图标 <link> 引用,而不会影响页面加载性能。

那么...异步加载这些元素是一种合法的方法吗?

例如。

const favIcon = {'rel' : 'icon', 'href' : 'favicon.ico'};
const appleTouchIcon = {'rel' : 'apple-touch-icon', 'href' : 'apple-touch-icon.png'};

const myIcons = [favIcon, appleTouchIcon];

for (let i = 0; i < myIcons.length; i++) {

  let myIcon = document.createElement('link');
  myIcon.rel = myIcons[i].rel;
  myIcon.href = myIcons[i].href;
  document.head.appendChild(myIcon);
}

或者在DOMContentLoaded 上异步加载这些&lt;link&gt; 元素意味着各种用户代理会错过他们正在寻找的图标?

【问题讨论】:

  • 仅仅因为它们被定义并不意味着它们被加载。例如,apple-touch-icon 文件只有在您将页面保存到主屏幕时才会被使用。

标签: javascript performance icons favicon apple-touch-icon


【解决方案1】:

从理论上讲,网站图标不应影响性能或加载速度,至少不会像您想的那样。如果设置正确,大多数浏览器只会寻找需要/支持的图标,这实际上是一个异步非阻塞操作。

此外,网站图标缓存策略默认情况下非常保守(它们几乎总是被缓存)。如果有时您看到多个不同格式/大小的请求,那是因为浏览器可能使用不同的图像(用于标签、书签、桌面快捷方式等)。

我的建议是将这一切留给浏览器,并专注于其他更关键的性能考虑因素。

请记住,如果您在本地使用 https 进行测试,大多数浏览器都会禁用缓存。

最后,我不知道您是如何准备网站图标的,但是网上有很多工具可以为您优化图像并编写正确的元数据。 (我记得 faviconit.com,但我敢肯定有更好的,不过效果很好)。

  • 最后注:

如果尽管如此,你仍然决定自己控制局面,你会遇到一些问题:

  1. 又名静态分析工具。爬虫/机器人很可能看不到您的网站图标,因为 99% 的时间它们不会运行 javascript。

  2. 按照您的建议按顺序插入每个链接可能会导致浏览器失败/难以决定获取哪个资产(浏览器应该等到函数结束,但没有这样的规则)

【讨论】:

  • 太好了,@Ernesto,谢谢。我会优先考虑这一点,并专注于速度/性能的其他领域。
  • @Rounin 欢迎您!我在网站加载策略方面有一些经验,我认为最容易实现的改进之一是在脚本上使用 async/defer 属性,小心地将它们放在样式表导入之后。
猜你喜欢
  • 1970-01-01
  • 2016-03-31
  • 2014-05-03
  • 2015-07-04
  • 2011-03-05
  • 2016-05-30
  • 2011-07-13
  • 2013-08-29
  • 1970-01-01
相关资源
最近更新 更多