javascript - Gatsby statisk bild (gatsby-plugin-image) inuti MDX
Nyligen har jag börjat arbeta med Gatsby och just nu testar jag saker med MDX. I min MDX-fil kan jag arbeta med Gatsby Image genom GraphQL, men jag vill använda Static Image från gatsby-plugin-image och jag får felmeddelanden som detta:
react_devtools_backend.js:2557 Bild laddades inte https://images.unsplash.com/photo-1597305877032-0668b3c6413a?w=1300
När jag försöker implementera denna bild i .tsx fungerar det, så jag undrar om det är möjligt eller inte.
gatsby-konfig
"gatsby-remark-images",
{
resolve: "gatsby-plugin-mdx",
options: {
defaultLayouts: {
default: require.resolve("./src/components/common/Layout.tsx")
},
gatsbyRemarkPlugins: [
{
resolve: `gatsby-remark-images`,
options: {},
},
],
}
},
{
resolve: "gatsby-source-filesystem",
options: {
name: "images",
path: `${__dirname}/src/images/`,
},
__key: "images",
},
Sedan i test.mdx försöker jag använda Static Image på det här sättet:
<StaticImage
src={'https://images.unsplash.com/photo-1597305877032-0668b3c6413a?w=1300'}
alt={''}
width={3840}
height={1000}
layout={'constrained'}
/>
Svar #1
Du kan inte använda gatsby-plugin-image direkt i ett MDX-dokument. Detta inlägg på Gatsby-bloggen förklarar hur man använder det indirekt genom att skicka in bildreferensgenskaper via din Frontmatter.
Personligen har jag kunnat göra det så här:
Detta exempel laddar bara lokala bilder, se blogginlägget för hur man refererar till fjärrbilder eftersom det är mer komplicerat.
Mallkomponent
import React from "react";
import { graphql } from "gatsby";
import { MDXRenderer } from "gatsby-plugin-mdx";
import Layout from "../components/layout";
const Game = ({ data }) => {
const { mdx } = data;
const { frontmatter, body } = mdx;
return (
<Layout title={frontmatter.title}>
<span className="date">{frontmatter.date}</span>
<MDXRenderer localImages={frontmatter.embeddedImagesLocal}>
{body}
</MDXRenderer>
</Layout>
);
};
export const pageQuery = graphql`
query($slug: String!) {
mdx(slug: { eq: $slug }) {
slug
body
frontmatter {
date(formatString: "MMMM DD, YYYY")
title
embeddedImagesLocal {
childImageSharp {
gatsbyImageData
}
}
}
}
}
`;
export default Game;
MDX-dokument
---
title: Death Stranding
author: Hideo Kojima
date: 2021-05-06
template: game
embeddedImagesLocal:
- '../images/20210513035720_1.jpg'
---
import { getImage, GatsbyImage } from 'gatsby-plugin-image';
A great game from Hideo Kojima.
<GatsbyImage alt='Sam in a destroyed mall' image={getImage(props.localImages[0])} />
Svar #2
Du kan använda gatsby-remark-images-pluginen med gatsby-plugin-mdx och den hanterar bilderna åt dig.
Installera pluginet, sedan i gatsby-config.js, uppdatera gatsby-plugin-mdx till något liknande detta:
{
resolve: 'gatsby-plugin-mdx',
options: {
gatsbyRemarkPlugins: [
{
resolve: `gatsby-remark-images`,
options: {
maxWidth: 900,
},
},
],
plugins: [`gatsby-remark-images`]
},
},
Då fungerar bilder som förväntat med -markdownformatet.
Tyvärr är maxWidth fast över hela webbplatsen vilket inte var idealiskt för mig. Jag använder @bonobolabs/gatsby-remark-images-custom-widths-forken som låter dig specificera bildens bredd i MDX-filen med en HTML-stil img-tagg:
<img src="./image.jpg" alt="My image" width="500px"/>
Jag tror att det bara är 'width' som är den extra egenskapen detta ger dig.
