これは何
-
自分のポートフォリオサイトをGatsbyで作っていて、v2からv3へアップデートした際に行ったことをまとめた記事です
- あくまで個人の事例なので詳しいアップデート手順は公式のドキュメントよりどうぞ
- フロントエンド強化月間 - 開発する上で知っておくべき知見を共有しようイベントへの投稿記事でもあります
Gatsby v3とは?
ざっと特徴をまとめると以下のように変化しました。
- Incremental Builds in OSS
- 必要なときだけHTMLを再生成することで、ビルドの高速化を実現
- Fast Refresh
- 新しいホットリローディングエンジン、エラーリカバリー、より良いDX
-
gatsby-image
からgatsby-plugin-image
に -
gatsby-source-wordpress
がv5に -
gatsby-source-contentful
がv5に
これ以外にも、プラグインの各種変更があったり、依存関係がアップデートされたりしています。
詳しくはリリースノートに載っていました。
v2からv3へ
全体の流れとしては、まずはマイグレーション用のドキュメントに従い
その後にgatsby-image
をgatsby-plugin-image
へ変更しました1
※自分はyarnを使っているので、以下の説明は全てyarnでの内容です。npmを使っている方は適宜置き換えて読んでください。
package.jsonでのGatsbyのバージョンを上げる
$ yarn add gatsby@latest
gatsby-
から始まるパッケージをアップデートする
yarn upgrade-interactive --latest
本体のアップデートにあわせて、関連パッケージをアップデートする必要があります。
ただし、あくまでgatsbyjs/gatsby
のリポジトリで管理されているパッケージ(=公式のもの)だけが対象です。
Node.jsのバージョン変更
今回のアップデートで、12.13.0
以上が必須になったようです。
ただし私の場合は逆に16.0.0
を使っていた結果、以下のようなエラーが出てしまいました。
(node:32396) [DEP0148] DeprecationWarning: Use of deprecated folder mapping "./" in the "exports" field module resolution of the package at
/Path/To/Repository/node_modules/gatsby/node_modules/postcss/package.json.
Update this package.json to use a subpath pattern like "./*".
PostCSSの問題で、2021年4月30日現在は直っているようなのですが、Gatsbyの中で使っているバージョンがまだ古いようです。
記憶がおぼろげですが、何かを試してみたくてNode.jsのバージョンを16.0.0にしていただけだったはずなので、おとなしく推奨版である14.16.1に変えました。
変更する案内が出ているけど、自分の環境では問題なかったor使っていなかったものたち
作りとしてはかなり簡単なサイトなので、大半は変更なしで大丈夫でした。
単に列挙するだけになってしまいますが、こういったことが書いてありましたと紹介します。
- Webpackを4から5へバージョンアップ
- ESLintを6から7へバージョンアップ
-
gatsby-link
でのnavigateTo
,push
,replace
をnavigate
に変更 -
__experimentalThemes
を削除 -
pathContext
をpageContext
に変更 -
boundActionCreators
をactions
に変更 -
deleteNodes
の代わりにnodes
のループ処理でdeleteNode
を使用 -
createNodeField
でのfieldName
とfieldValue
をそれぞれname
とvalue
へ変更 -
hasNodeChanged
の削除 -
gatsby-image
でのsizes
とresolutions
をそれぞれfluid
とfixed
へ変更 -
touchNode
でnode.id
ではなくnode
を渡す -
deleteNode
でnode.id
ではなくnode
を渡す -
gatsby-browser
APIのうちいくつかの名前が変更 -
import { graphql } from "gatsby"
が必須に - CSS Modulesのimportの仕方が変更に
- アセットがES Modulesとしてimport可能に
- GraphQLで正規表現のエスケープが変更に
- GraphQLで
__typename
フィールドを明示的に追加する必要がある - スキーマのカスタマイズでの変更が色々
匿名のアロー関数をなくす
チュートリアルやサンプルでは使われていますが、
export default () => {}
匿名のアロー関数だと今回の大きな変更であるFast Refreshが上手く動かない原因になるそうです。
const Named = () => {}
export default Named
これでOK。
gatsby-image
をgatsby-plugin-image
へ変更
今までのgatsby-image
は便利は便利だったんですがクセも強い印象でした。
それが、StaticImage
コンポーネントを使うと、かなり軽減されると思います。
マイグレーションのためのドキュメントはこちらで、
gatsby-plugin-image
自体の説明はこちらです。
パッケージの追加
yarn add gatsby-plugin-image gatsby-plugin-sharp gatsby-transformer-sharp
※gatsby-plugin-sharp
とgatsby-transformer-sharp
は普通にGatsbyを使っていればインストールしていると思いますが、一応gatsby-plugin-image
を使うのには必須なのであえて記載しています。
gatsby-config.js
のアップデート
module.exports = {
plugins: [
`gatsby-plugin-image`,
`gatsby-plugin-sharp`,
`gatsby-transformer-sharp`,
],
}
コマンドを叩く
既存のgatsby-image
の書式で書かれたコードをgatsby-plugin-image
用に変換するコマンドを用意してくれています。
npx gatsby-codemods gatsby-plugin-image
ただし、全部が全部このコマンドで対応できるわけでもありません。
上手く変換できなかった分はターミナル上で教えてくれるので、手動で変更します。
私の場合は今までこのようなイメージのクエリを書いていました。
query MyQuery($id: String) {
mdx(id: { eq: $id }) {
frontmatter {
featuredImage {
childImageSharp {
fixed {
src
}
}
}
}
}
}
src
の取り方が変わったので、クエリを書き直し
query MyQuery($id: String) {
mdx(id: { eq: $id }) {
frontmatter {
featuredImage {
childImageSharp {
gatsbyImageData
}
}
}
}
}
パスの渡し方を変えました。
const WorkTemplatePage = ({ data: { mdx } }) => {
- const featuredImgPath = mdx.frontmatter.featuredImage.childImageSharp.fixed.src
+ const featuredImgPath = getSrc(mdx.frontmatter.featuredImage.childImageSharp.gatsbyImageData)
return (
<>
<Seo title={mdx.frontmatter.title} description={mdx.frontmatter.description} ogImagePath={featuredImgPath} />
{/* 省略 */}
</>
)
}
余談ですが、gatsby-image
は読み込み中はMeduimのように粗い画像をぼかして表示するのがデフォルトだったのが、gatsby-plugin-image
ではTwitterのようにベースになる1色で塗りつぶすようになっているみたいです。
-
gatsby-plugin-image
自体はGatsbyが2.24.78
以上であれば動きます。検証はできていませんが、先にgatsby-plugin-image
を導入してあとからv3へアップデートしても多分大丈夫です。 ↩