最终更新
在大多数实践中,此问题已过时,因为Firefox和chrome都通过标准图片html标签(其源标记为type =“image / avif”)对avif进行了本地支持。参见https://reachlightspeed.com/blog/using-the-new-high-performance-avif-image-format-on-the-web-today/。 Firefox仍然喜欢挂起,并经常强制控件F5绕过缓存,并要求从服务器发送正确的内容类型。希望很快会修复。
这是我获得avif支持的提交:https://github.com/quackack/quackack-comics/commit/f1a98ed1f40b6a22584d61bc338bd91df3232fa5#diff-e25b0950ce48f4e928f98e0a6fbb694c。请注意,它包含许多不相关的更改,实际上几乎没有提及avif,只是将其作为内容类型和文件扩展名。
原始问题
我正在尝试将托管网络漫画的网站从使用jpegs更改为较新的avif图像格式。它小得多,似乎是获得最广泛支持的新图像格式。不幸的是,网络浏览器尚不正确支持新格式。因此,我打算使用以下程序包:https://github.com/Kagami/avif.js以允许渲染我的漫画。一些基本测试表明,AVIF可以在不到一半空间的情况下提供与jpeg相同的质量。
不幸的是,在花了5个小时以上的时间之后,我无法使它与我的react框架一起使用。在撰写本文时,您可以在“https://github.com/quackack/quackack-comics/tree/cda4c3893d8477192c4ff3aa78d00096b7621ff7”看到我的网站。
我尝试使用npm install安装avif.js,然后添加了
require("avif.js").register("/avif-sw.js");
到index.js。但是我得到了错误Failed to register/update a ServiceWorker for scope ‘http://localhost:3000/’: Bad Content-Type of ‘text/html’ received for script ‘http://localhost:3000/avif-sw.js’. Must be a JavaScript MIME type
而且avif文件仍然无法加载。我认为请求已被重新路由到index.html而不是javascript包。似乎合适的事情是import * as avif from 'avif.js';
avif.register('avif.js/avif-sw.js');
但这也会因相同的错误而失败,就像许多其他类似的变体一样。此时,我倾向于等待适当的浏览器对avif的支持,因为无论如何我没有足够的流量来担心数据成本。如果可以轻松解决此问题,那么我希望从avif获得改进。我只想要较小的文件大小和广泛的浏览器支持。
更新
好的,我发现,如果我从默认的React Bundle(我相信是webpack)更改为Parcel,我可以使它正常工作。然后它会按照您的预期工作,直到我尝试部署该项目为止。
有一个问题,当我尝试将单页Web应用程序作为单页Web应用程序部署到AWS时,我无法加载Service Worker。在那里,它使用avif-sw.js向我的网址发出请求,而实际上没有js文件。我相信这个问题与https://github.com/parcel-bundler/parcel/issues/670密切相关
因此,第一个关键是使用Parcel构建您的Web应用程序。但是,Parcel似乎在部署方面还是有问题。几天后,我将继续对此进行调查。
这是使用包裹的几乎可以使用的版本:https://github.com/quackack/quackack-comics/tree/parcel
更新2
我先前的更新不正确。我只是认为它在工作是因为有一个缓存的服务人员。我的最终解决方案是在下面的答案中。
最佳答案
现在看来似乎不是问题。只需使用https://avif.io/之类的工具将图像转换为avif,然后通过典型的CSS将它们用作图像源或背景源。由于Chrome和Firefox现在都支持它(即使用户仍然必须在Firefox上启用它),所以一切都很好。现在甚至可以在移动设备上使用! :)