Gatsby + Contentful + Netlify - 如何在生产中渲染 tracedSVG 图像?

GBo*_*ard 2 fluid-images contentful gatsby netlify gatsby-image

我正在使用GatbsyContentful CMS 和Netlify构建一个网站。它看起来很棒并且可以在本地运行,但是我在使用tracedSVG选项制作流体图像时遇到了问题。Netlify 部署曾经偶尔工作,当我向项目添加更多图像时,现在经常因以下错误而中断(并不总是在同一页面中):

10:53:45 AM: The GraphQL query from /opt/build/repo/src/pages/index.js failed.
10:53:45 AM: Errors:
10:53:45 AM:   VipsJpeg: Corrupt JPEG data: premature end of data segment
10:53:45 AM:   VipsJpeg: out of order read at line 544
10:53:45 AM:   GraphQL request:54:3
10:53:45 AM:   53 | fragment GatsbyContentfulFluid_tracedSVG on ContentfulFluid {
10:53:45 AM:   54 |   tracedSVG
10:53:45 AM:      |   ^
10:53:45 AM:   55 |   aspectRatio
Run Code Online (Sandbox Code Playgroud)

或有时

error
The GraphQL query from /opt/build/repo/src/pages/index.js failed.
Errors: Input file contains unsupported image format
  GraphQL request:40:3
| fragment GatsbyContentfulFluid_tracedSVG on ContentfulFluid {
|   tracedSVG
|   ^
|   aspectRatio
Run Code Online (Sandbox Code Playgroud)

并且在极少数情况下

Errors:
  VipsJpeg: Empty input file
Run Code Online (Sandbox Code Playgroud)

(这最后一个没有意义,因为图像存在于 Contentful 和我的内容模型的必填字段中)

如前所述;GraphQL 查询从本地的 Contentful 工作中检索 tracedSVG 图像。我的代码如下:

import React from "react"
import { Link, graphql } from "gatsby"
import Img from "gatsby-image"

const IndexPage = ({ data: { allContentfulIndexPage }) => {
  const { myImage } = allContentfulIndexPage.edges[0].node

  return (
    <div>
      {...someIrrelevantCodeToTheQuestion}
      <Img fluid={myImage.fluid}/>
    </div>
  )
}

export default IndexPage

export const query = graphql`
  query IndexPageQuery {
    allContentfulIndexPage {
      edges {
        node {
          myImage {
            fluid {
              ...GatsbyContentfulFluid_tracedSVG
            }
          }
        }
      }
    }
  }
`
Run Code Online (Sandbox Code Playgroud)

通过使用 GraphiQL,我发现在本地使用tracedSVG而不是在...GatsbyContentfulFluid_tracedSVG本地也可以工作,但它在生产/Netlify 环境中崩溃是一样的。我考虑使用png图像而不是jpg因为错误表明文件本身有问题,尽管它们在本地渲染良好,但等效的 png 大小会减慢网站速度(100kB 的 jpg 图像在 png 中大约为 900kb)。

有没有人遇到过tracedSVG在生产中使用 jpg 图像进行渲染的相同问题,如果是这种情况,您是如何解决以阻止反复崩溃的?谢谢你。

GBo*_*ard 7

我发布这个问题已经一个月了,所以我想我应该发布我的非解决方案,但更像是一种解决方法,以防有人面临同样的问题。看起来GatsbyContentfulFluid_tracedSVG实际上在生产已被破坏,并且该错误迄今为止尚未解决。

我只是决定恢复使用fluid解决方案而不是tracedSVG因为它适用于开发和生产环境,因此将图像作为

<Img
  fluid={node.image.fluid} />
Run Code Online (Sandbox Code Playgroud)

并查询为

node {
  image {
    fluid {
      ...GatsbyContentfulFluid
    }
  }
}
Run Code Online (Sandbox Code Playgroud)