見出し画像

GatsbyのMDXブログ記事に画像を追加する

前回の記事で、Gatsbyのブログ記事を作成しました。

これでブログが完成!…でもまだ文章しかないですよね。いまどき文章しかないブログは、ちょっと読みにくいですよね。

ブログ記事に画像や動画を追加して、少し華やかにしてあげましょう。

ブログ記事のアイキャッチ/サムネイル画像の追加

アイキャッチはブログ記事の一番最初に表示される画像です。

アイキャッチ=サムネイルというわけではありませんが、今回は同じ画像を使うことにします。この辺りはあなたの好みに合わせて変えてください。

アイキャッチ画像は、ブログ記事内の画像とは違って、ブログ記事以外の場所で使えるようにしておきます。つまり、ブログ記事のfrontmatterにサムネイルの情報を追加するのがわかりやすい方法です。

ブログ記事のMDXファイルの最初に書いているfrontmatterに、thumbnailという項目を追加します。altテキストも追加したい場合は、thumbnail_altなどの属性をさらに追加しましょう。

ここにアイキャッチに使いたい画像のpathを指定しておきます。

# blogs/blog1.js

---
title: "これは最初の記事です"
date: "2021-10-05"
category: "マーケティング"
thumbnail: "../src/images/cat.jpg"
thumbnail_alt: "猫ねこネコ"
---

はじめまして!
これは僕の初めてのブログ記事です

こうやって**強調**することもできますよ。

ブログ記事側で追加するべき情報はこれだけです。次に必要なプラグインをインストールしていきます。

gatsby-transformer-sharpのインストール

上記の記事では画像を表示する時に、StaticImageを使いました。でも今回はGraphQLから画像を持ってくる必要があるため、StaticImageは使えません。

その代わりにGatsbyImageを利用します。

そのためのプラグインとしてgatsby-transformer-sharpをインストールします。

npm install gatsby-transformer-sharp

いつものように、gatsby-config.jsにもgatsby-transformer-sharp忘れずに書いておきます。

# gatsby-config.js
module.exports = {
 ...中略...
 
 plugins: [
   "gatsby-transformer-sharp",
   
   ...中略...

これでGatsbyImageを使う準備が整いました。

あとは、ブログ記事のテンプレートで画像を表示するように設定します。

GatsbyImageの基本的な使い方

GraphQLで先ほどfrontmatterで設定したthumbnailの情報を受け取るには、以下のようなクエリーを用意します。

export const query = graphql`
 query ($id: String) {
   mdx(id: {eq: $id}) {
     frontmatter {
       title
       date(formatString: "MMMM D, YYYY")
       thumbnail{
         childImageSharp {
           gatsbyImageData
         }
       }
       thumbnail_alt
     }
     body
   }
 }
`

この情報を使うために、2つの関数をインポートしておきます。

import { GatsbyImage, getImage } from 'gatsby-plugin-image'

まず画像データを取得するためにgetImageを使います。getImageを使うことで、thumbnailの後のchildImageSharp.gatsbyImageDataを省略できるので、少しだけコードが短くなります。


  const thumbnail = getImage(data.mdx.frontmatter.thumbnail) 

取得した画像を、以下のようにGatsbyImageに渡すことで、画像が表示されるようになります。

      <GatsbyImage
       image={thumbnail}
       alt={thumbnail_alt}
     />

Gatsbyブログ記事のアイキャッチを設定する

ブログ記事のアイキャッチでは、thumbnailで画像が指定されている場合にはその画像を使い、特に指定がない場合にはデフォルトの画像を使うことにします。

デフォルトの画像を使う場合は、StaticImageで良いので、thumbnailが空の時は、StaticImageを利用しています。デフォルト画像は、src/imagesにdefault_thumbnail.pngとして保存しています。

# src/pages/blogs/{mdx.slug}.js

import * as React from 'react'
import Layout from '../../components/layout'
import { graphql } from 'gatsby'
import { MDXRenderer } from 'gatsby-plugin-mdx'
import { StaticImage, GatsbyImage, getImage } from 'gatsby-plugin-image'

const BlogPost = ( {data} ) => {

 const thumbnail = getImage(data.mdx.frontmatter.thumbnail)
 const thumbnail_alt = data.mdx.frontmatter.thumbnail_alt

 return (
   <Layout pageTitle={data.mdx.frontmatter.title}>
     
     {thumbnail 
     ? <GatsbyImage
       image={thumbnail}
       alt={thumbnail_alt}
     />
     : <StaticImage
         alt=""
         src="../../../images/default_thumbnail.png"
     />
     }
     <MDXRenderer>
       {data.mdx.body}
     </MDXRenderer>
   </Layout>
 )
}

export const query = graphql`
 query ($id: String) {
   mdx(id: {eq: $id}) {
     frontmatter {
       title
       date(formatString: "MMMM D, YYYY")
       thumbnail{
         childImageSharp {
           gatsbyImageData
         }
       }
       thumbnail_alt
     }
     body
   }
 }
`

export default BlogPost

これでローカル開発環境を起動し、ブログ記事のページを閲覧してみます。

http://localhost:8000/tutorial/blogs/blog1

スクリーンショット 2021-11-13 18.20.01

http://localhost:8000/tutorial/blogs/blog2

スクリーンショット 2021-11-13 18.20.51

thumbnailを設定したblog1では猫の画像が表示され、それ以外の記事ではデフォルトの画像が表示されました。

実行結果

Gatsbyブログ記事の内部で画像を表示する

では、ブログ記事の中に画像を追加するには、どうしたら良いのでしょうか?

簡単に実装するには、gatsby-remark-imagesというプラグインを利用します。また、画像処理にgatsby-plugin-sharpが必要になるので、以前の記事でまだ追加していない方は追加しておきましょう。

npm install gatsby-remark-images gatsby-plugin-sharp

続いて、gatsby-config.jsにプラグインを追加していきます。

まずはgatsby-plugin-sharpプラグインを記載。

 # gatsby-config.js 
 
 module.exports = {
   ...中略...

 plugins: [
   "gatsby-plugin-sharp",
   
   ...中略...

gatsby-source-filesystemプラグインのオプションに、画像を保存しているフォルダを追加しておきましょう。

 # gatsby-config.js 
 
 module.exports = {
   ...中略...

 plugins: [
   "gatsby-plugin-sharp",
   "gatsby-remark-images",
    {
     resolve: "gatsby-source-filesystem",
     options: {
       name: `blog`,
       path: `${__dirname}/blogs`,
     }
   },
   {
     resolve: "gatsby-source-filesystem",
     options: {
       name: `images`,
       path: `${__dirname}/src/images`,
     }
   },

最後にgatsby-plugin-mdxプラグインのオプションに、gaysby-remark-imagesを追加します。

"gatsby-plugin-mdx"と書いていた部分を、以下のオプション形式に変更します。

   {
     resolve: `gatsby-plugin-mdx`,
     options: {
       gatsbyRemarkPlugins: [
         {
           resolve: `gatsby-remark-images`,
           options: {
             maxWidth: 1200,
           },
         },
       ],
     },
   },

これで後はMDXファイルで画像を指定すれば、表示することができます。

gatsby-remark-imagesの使い方

画像を表示するためには、ブログ記事のMDXファイルで、以下のようにaltテキスト、画像へのパス、画像タイトルを指定します。

![猫の集合写真](../src/images/cat2.jpg 'ねこ猫ネコ')

blog2.mdxにこのコードを追加して、画像を表示させてみましょう。

# blogs/blog2.mdx

---
title: "2番目の記事じゃダメですか?"
date: "2021-10-07"
category: "マーケティング"
---
1番目じゃなくて2番目の記事です。

![猫の集合写真](../src/images/cat2.jpg 'ねこ猫ネコ')

猫たちの写真が表示されました。

スクリーンショット 2021-11-13 19.00.55

画像にマウスカーソルを当てると、画像タイトルの文字が浮かんできます。altテキストと、表示される文字を変更したい時には便利です。

まとめ

やっぱり画像があると、見栄えがだいぶ変わってきますね!


ここまで読んでいただけたなら、”スキ”ボタンを押していただけると励みになります!(*´ー`*)ワクワク

この記事が気に入ったらサポートをしてみませんか?