GatsbyでHP作成 その15:MDX対応
ブログの記事をMDXで記述できるようにします。
MDX対応
【GatsbyJS製ブログ】MDXを使えるようにする!あと書き方とか! | Bear-Fruit
こちらのサイトを参考に対応しました。
gatsby-plugin-mdxとgatsby-plugin-feed-mdxをインストール
$ yarn add gatsby-plugin-mdx gatsby-plugin-feed-mdx @mdx-js/mdx@v1 @mdx-js/react@v1
gatsby-config.jsのgatsby-transformer-remarkをgatsby-plugin-mdxに変えていく
gatsby-config.js
{
resolve: `gatsby-plugin-mdx`, //←`gatsby-transformer-remark`から変更 options: {
extensions: [`.mdx`, `.md`], //←追加 gatsbyRemarkPlugins: [ //←pluginsから変更 {
resolve: `gatsby-remark-images`,
options: {
maxWidth: 630,
},
},
{
resolve: `gatsby-remark-responsive-iframe`,
options: {
wrapperStyle: `margin-bottom: 1.0725rem`,
},
},
`gatsby-remark-prismjs-title`,
`gatsby-remark-prismjs`,
`gatsby-remark-copy-linked-files`,
`gatsby-remark-smartypants`,
],
},
:
:
{
resolve: `gatsby-plugin-feed-mdx`, //←`gatsby-plugin-feed`から変更 :
:
GraphQLのクエリを変更していく
gatsby-node.js、blog-post.js、などのクエリ部分を以下のように書き換えていきます。
- allMarkdownRemark → allMdx
- MarkdownRemark → Mdx
- markdownRemark → mdx
- html → body
MDXを展開する部分(blog-post.jsなど)をMDXRendererに書き換える
blog-post.jsなど、マークダウンファイルを読み込む以下の部分を変更します。
blog-post.js
<section
dangerouslySetInnerHTML={{ __html: post.html }}
itemProp="articleBody"
/>
↓
blog-post.js
import { MDXRenderer } from "gatsby-plugin-mdx"
:
:
<MDXRenderer
frontmatter={post.frontmatter} //※
itemProp="articleBody"
>
{post.body}
</MDXRenderer>
自作のpost-grid.js,top-crad.jsは、そのままでOKでした。
(MDXRenderer使うとエラーになる)
post-grid.js
<p className={styles.p}
dangerouslySetInnerHTML={{
__html: post.frontmatter.description || post.excerpt,
}}
itemProp="description"
/>
MDXの書き方
import
Reactコンポーネントをimportして、利用することができます。
GatsbyのLinkコンポーネントを使ってみる
Gatsbyのページ遷移は通常のリンクでなく<Link>
コンポーネントで遷移することで必要なデータのみを読み込んで高速なページ遷移を行っています。
まずは通常のリンク(再読み込みになって遅い)
index.mdx
* [home](/)
* [VSCodeのRemoteContainerが激遅だったので対処してみた | ガンバラナイ](/tech-blog/vscode-devcontainer-mount/)
<Link>
コンポーネントを使ったリンク(再読み込みなしで早い)
index.mdx
import { Link } from "gatsby"
* <Link to="/">Home</Link>
* <Link to="/tech-blog/vscode-devcontainer-mount/">VSCodeのRemoteContainerが激遅だったので対処してみた | ガンバラナイ]</Link>
MDX Embed
プラグインでいろいろなサービスを埋め込むこともできます。
プラグインインストール
$ yarn add mdx-embed gatsby-plugin-mdx-embed
gatsby-config.js
:
plugins: [
:
`gatsby-plugin-mdx-embed`,
:
]
:
ツイッターの埋め込み
いろいろなサービスの埋め込みができますが、以下のようにツイッターの埋め込みをしてみました。
index.mdx
<Tweet tweetLink="ganbaranai_tech/status/1549377905704452096"/>