【问题标题】:Gatsbyjs image with Webp and fallback to jpg using picture tag not workingGatsbyjs 图像与 Webp 并使用图片标签回退到 jpg 不起作用
【发布时间】:2020-09-22 02:36:37
【问题描述】:

我在我的反应网站中使用 Gatsbyjs 图像我尝试使用图片标签添加回退到 jpg 但它不起作用,它只是加载 jpg 文件这里是代码

                     <Box {...portfolioImage}>
                        <picture>
                          <source
                            srcset={
                              (portfolioItem.image !== null) | undefined
                                ? portfolioItem.image.childImageSharp.fluid
                                : {}
                            }
                            type="image/webp"
                            alt={`PortfolioImage-${index + 1}`}
                          />
                          <Image
                            fluid={
                              (portfolioItem.imageFallback !== null) |
                              undefined
                                ? portfolioItem.imageFallback
                                    .childImageSharp.fluid
                                : {}
                            }
                            alt={`PortfolioImage-${index + 1}`}
                          />
                        </picture>
                      </Box>

数据

image {
              childImageSharp {
                fluid(quality: 100) {
                  ...GatsbyImageSharpFluid_withWebp
                }
              }
            }
            imageFallback {
              childImageSharp {
                fluid(quality: 100) {
                  ...GatsbyImageSharpFluid
                }
              }
            }

【问题讨论】:

    标签: reactjs gatsby gatsby-image


    【解决方案1】:

    盖茨比图像本身是一个组件,而不是要放置在srcSet 属性中的数据。在您的情况下,您应该根据 portfolioItem.image.childImageSharp.fluid 数据呈现一个或另一个组件,具体取决于是否存在。此外,这些三元条件对我来说似乎很奇怪。

    假设您的 GraphQL 查询按预期工作并且正在检索数据。我建议更简单一些:

    {portfolioItem.imageFallback.childImageSharp.fluid
      ? <Image fluid={portfolioItem.imageFallback.childImageSharp.fluid} alt={`PortfolioImage-${index + 1}`} />
      : <picture><source srcSet={portfolioItem.imageFallback} alt={`PortfolioImage-${index + 1}`} /></picture>
    }
    

    使用上面的 sn-p,您只需在数据存在时渲染 &lt;Image&gt;(来自 Gatsby 图像),如果不存在则渲染 &lt;picture&gt; 后备图像。

    将 Gatsby 图像包装在 &lt;picture&gt; 标记内并不像您想象的那么有用,因为图像组件内部将是一堆嵌套的 &lt;div&gt;s,具有自己的 JavaScript 回退和模糊。这将更改您的 &lt;picture&gt; 标记的默认子项,从而导致潜在问题或布局错误。


    检查数据不是重点,我设置了我需要检查的数据 浏览器支持 webp 图像格式,这就是图片标签 应该做,但它似乎不适用于动态图像或 从 JSON/grahql 加载的图像

    Gatsby Image 会自动处理它。来自their documentation

    如果你想在浏览器支持的时候自动使用WebP images 文件格式,使用withWebp 片段。如果浏览器没有 支持WebP,gatsby-image会回退到默认图片格式。


    需要再次测试,但它在 safari 上不起作用

    Safari(或 MacOS 设备)中存在一个触发交叉点观察器的已知错误。填充它:

    yarn add intersection-observer
    

    在你的gatsby-browser.js:

    export const onClientEntry = async () => {
      if (typeof IntersectionObserver === "undefined") {
        await import("intersection-observer");
        console.log("IntersectionObserver polyfilled ;)");
      }
    };
    

    【讨论】:

    • 检查数据不是重点,我设置了我需要检查浏览器是否支持 webp 图像格式的数据,这是图片标签应该做的,但它似乎不适用于动态从 JSON/grahql 加载的图像或图像
    • Gatsbi Image 会自动处理这个问题。您可以查看:gatsbyjs.com/docs/gatsby-image/#about-withwebp
    • 需要再次测试,但它在 safari 上不起作用
    • 您可以在屏幕截图中看到它不起作用 - dropbox.com/s/xbipylzqomvckea/…
    • 好的,我能够解决这个问题,我相信仍在测试中
    猜你喜欢
    • 1970-01-01
    • 2023-01-03
    • 2018-05-16
    • 2019-07-26
    • 2019-11-25
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多