如何让Angular CLI允许我使用内容哈希来加载网站图标?

3
我想要像缓存CSS/JS/PNG一样缓存我的网站Favicon,例如使用远期过期头,但是我不知道如何实现。所有我在Favicon和Angular方面找到的文章都建议在HTML页面中使用链接,在assets中放置favicon.ico文件,并使用assets构建器选项进行复制。
<link rel="icon" type="image/x-icon" href="favicon.ico">

这并不能达到我的目的,因为该文件名为“favicon.ico”。 我希望它被称为“favicon。[content hash] .ico”,就像所有js、css和png文件一样。
我找到了这篇文章如何更改Angular CLI网站图标,并尝试了其中一个评论中提到的faviconInitFactory方法。 我认为这是解决此问题的“正确”方法,但对我无效。
如果我只使用这行代码,则Angular会抱怨不知道如何加载ico文件。
const favicon = require('../assets/favicon.ico');


ERROR in ./src/assets/favicon.ico
Module parse failed: Unexpected character ' ' (1:0)
You may need an appropriate loader to handle this file type.

作为替代方案,我尝试使用以下导入方式。
import favicon from '!raw-loader!../assets/favicon.ico';

我随后使用了“custom-webpack:browser”和一个Webpack文件。
module.exports = {
  module: {
    rules: [
      {
        test: /\..ico$/,
        use: [
          {
            loader: 'file-loader',
          }
        ]
      }
    ]
  }
}

这使我进一步了解了情况,但当我运行应用并加载页面时,尝试使用以下方式记录它们,但无法成功:

console.log(`setting favicon to ${favicon}`);

我收到了“设置网站图标为”和一些Unicode符号。我认为这意味着文件已经被二进制加载,而不是base64内联。我明白这是因为文件内容很小(6kb),所以加载器正在将它们内联。但是它们确实被作为二进制加载,而不是base64。
因此,简要概括一下,我不想提供一个名为“favicon.ico”的文件,我想提供一个名为“favicon.[content hash].ico”的文件。本文展示了如何动态引用此文件,但我看不到如何配置Angular CLI的加载器以作为base64或URL加载。

为什么要缓存它,浏览器默认情况下会自动缓存它? - Zze
1
如上所述,我希望将网站图标与所有页面资源(如css、js和png)一样进行处理,即浏览器只会获取它们一次,并且每个资源都设置了过期头,以便不再重新获取。对于使用内容哈希的css、js和png,这种方法是有效的,因此我也希望将相同的处理方式应用于网站图标。 - chrisderham
1个回答

0
没有人提出答案,我也没有找到。我能想到的最好方法是手动执行这个过程,即计算图标的md5值,然后更新页面以查找它。如果图标发生变化,那么我们可以更改名称,它就可以正常工作了。
CertUtil -hashfile .\favicon.ico MD5
MD5 hash of .\favicon.ico:
b9aa7c338693424aae99599bec875b5f

然后我们将文件重命名为“favicon.b9aa7c338693424aae99599bec875b5f.ico”,并更新HTML页面以引用它。

<link rel="icon" type="image/x-icon" href="favicon.b9aa7c338693424aae99599bec875b5f.ico">

你是手动更新HTML文件吗? - Victor Zakharov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接