Gatsby 图像优化 - 有没有办法减少页面数据文件夹中生成的 GraphQL json 文件的大小?

Gatsby Image Optimizations - Is there a way to reduce size of generated GraphQL json files in page-data folder?

我正在开发一个 Gatsby 站点,我想在将其上传到 Netlify 之前对其进行优化。除了 448kb 的 react_devtools_backend.js! (希望我可以通过切换到 Preact 摆脱...)查询)我创建了自己的图像组件如下:

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

const Image = props => {
  const data = useStaticQuery(graphql`
    {
      allFile(filter: { extension: { eq: "jpg" } }) {
        nodes {
          relativePath
          name
          childImageSharp {
            fluid(maxWidth: 1000, quality: 90, webpQuality: 90) {
              ...GatsbyImageSharpFluid_withWebp_tracedSVG
            }
          }
        }
      }
    }
  `);

  const image = data.allFile.nodes.find(img =>
    img.relativePath.includes(props.filename)
  );

  if (!image) {
    return null;
  }

  const imageFluid = image.childImageSharp.fluid;
  return (
    <Img
      className={props.className}
      alt={props.alt}
      fluid={imageFluid}
      imgStyle={props.style}
    />
  );
};

export default Image;

在 运行 gatsby 构建和服务之后,我可以看到在 public/page-data/sq/d 文件夹中生成了一些 json 文件,其名称类似于 63159454.json,看起来它们包含 graphQL浏览器正在进行的查询。这些文件之一是 43.3kb 本身。有谁知道我是否以次优方式使用 Gatsby,如果是,有没有办法减少这些 json 文件?

您是 运行 一个 GraphQL 查询,它为构建中的每个图像获取数据。是的,这是非常次优的。您试图避免的路径(您在页面查询中指定 image/images 所需的路径)是 Gatsby 推荐的解决方案。

另一种选择是使用托管和转换图像的外部服务(例如 CMS、Imgix、Cloudinary 等)。这将让您只获取构建 srcsrcset 属性所需的信息,这可能会减少数据量,并且在任何情况下都是您针对每张图像执行的操作——而不是在单个图像中- 在一个地方为每个图像获取数据的构思组件。

例如,使用 Sanity,我对页面的 GraphQL 查询如下所示:

{
  sanityPage (slug: { current: { eq: "/home/" } }) {
    title
    heroImage {
      asset {
        _id
      }
    }
  }
}

这提供了我需要的数据来呈现多种尺寸的完全响应图像,如下所示:

import Image from "gatsby-plugin-sanity-image"

export default ({ title, heroImage }) => 
  <div>
    <h1>{title}</h1>
    <Image {...heroImage} width={1440} height={400} alt="" />
  </div>

由于图像是与内容一起定义的,因此无需在 GraphQL 查询中显式创建该关联。