2021-01-02
下記記事にある通り、Amazonのリンクなどをいい感じにするために gatsby-remark-component
を使って、マークダウン内にスニペットを配置する方法を取っていた。
マークダウン内に下記のように記述すると、下記のような表示になる。ちなみに、 gatsby-remark-component
の制約で <alink code="B01EJ7AK5O" />
とは記述できない。
<alink code="B01EJ7AK5O"></alink>
鬼滅の刃 1 (ジャンプコミックスDIGITAL)
¥418(2020年12月27日時点)
amazon.co.jp
しかし、記事の初回の読み込み時に上手く表示されなかったり、リンクを複数張るとリンク先のURLが別のURLになっていたり、スーパーリロードだと再現するけどリロードすると直ったり、と挙動が怪しい部分があった。調査してみたところ、どうやら、 gatsby-remark-component
が原因だったようだ。
やりたいこととしては、マークダウン内で、用意したReactコンポーネントを呼び出せれば良いので、MDXを使うアプローチに切り替えた。
公式プラグインだし、安心感がある。ブログを作る際に gatsby-starter-blog
のスターターなどを使っている場合、 gatsby-transformer-remark
を使っているケースが多いと思うが、 gatsby-transformer-remark
から移行する形で gatsby-plugin-mdx
を導入する必要がある。移行用のドキュメントが用意されているので、こちらのドキュメントに従って、移行を行った。
Migrating Remark to MDX | Gatsby
gatsby-config.js
で言うと、
resolve: "gatsby-transformer-remark",
options: {
plugins: [
{
resolve: "gatsby-remark-component",
options: {
components: ["rlink", "alink"],
},
},
...
上記を下記に置き換える感じになる。 gatsby-transformer-remark
に噛ましていたplugin達は gatsbyRemarkPlugins
にそのまま渡してあげることで動作する。
resolve: "gatsby-plugin-mdx",
options: {
extensions: [".md"],
gatsbyRemarkPlugins: [
...
記事用のテンプレートファイルの中で、予めコンポーネントを読み込んでおくと、マークダウンファイル内で import
せずともそのまま記述できる。
const shortcodes = { AmazonLink, RichLink }
...
<MDXProvider components={shortcodes}>
<MDXRenderer>{post.body}</MDXRenderer>
</MDXProvider>
<AmazonLink code="B01EJ7AK5O" />
移行後に、動作確認をしてみたところ、上述していたバグが解消された。
下記の置き換えをする際に、VSCodeの置換の正規表現が役に立った。便利。
<alink code="B01EJ7AK5O"></alink>
<AmazonLink code="B01EJ7AK5O" />
<alink code="(.+)"></alink>
<AmazonLink code="$1" />
マークダウン内でReactコンポーネントを呼び出したいとなった場合に、 gatsby-remark-component
を使う方法を紹介している記事がよく出てくるが、上述した通り、挙動が怪しい部分があるので、MDXを使うアプローチの方が良さそうに思う。