Gatsbyでブログのフロントエンドを作る

techbloggatsbystrapidocker


今回のバージョン

Gatsby: v4.19.2
Strapi: v4.2.3

Gatsby をセットアップする

基本的には、Strapiのブログに書かれているチュートリアルを見ながらやっていく。 書かれていないが、Strapiの管理画面から APIトークンを発行しておく。

https://strapi.io/blog/build-a-static-blog-with-gatsby-and-strapi

また、 gatsby-source-strapi のREADMEも参考にしてセットアップする。

https://github.com/strapi/gatsby-source-strapi

いったん、わたしのプラグインはこんな感じになった。

"gatsby-plugin-emotion"
"gatsby-plugin-react-helmet"
"gatsby-plugin-sitemap"
"gatsby-source-strapi"
"gatsby-plugin-image"
"gatsby-plugin-sharp"
"gatsby-transformer-remark"
"gatsby-transformer-sharp"

コードは全体的にTypeScript(tsx)で書いている。

CSSには、emotionを使う。 emotionそのものはgatsby-pluginが無くても動くように見えるが、これはクライアントサイドで動いているだけだ。 gatsby-plugin-emotion を使うことで、スタティックに書き出される。

画像処理に gatsby-plugin-sharp を使う。 今回のアーキテクチャではCMSはパブリックアクセス不可能と定めているので、画像を公開可能ディレクトリに書き出す必要があるのだ。Strapiにもサイズバリエーションを生成する機能があるが、そちらは利用しない。

ローカルでだいたい動くようになるので、いじってみる。

Gatsby への理解を深める

GatsbyはGraphQLを使う。GraphQLに慣れていないと抵抗がある。このような冗長な手法を使わず自分で自由にHTTPリクエストを投げたい気持ちになってくる。 しかし、使ってみると、GatsbyはGraphQLをうまく取り込んで調和しているように見える。

GraphQLには、よく言われるように、クライアント・ファーストである利点がある。ふつうREST API では、過剰なAPIリクエストや、過小なAPIリクエスト問題になるが、GraphQLでは、クライアントが求めるデータを求めるかたちで要求できる。 リクエスト回数については、理想論では「1発ですべてのデータが取れる」のだが、実務レベルでは、けっきょく何度もクエリを発行することも珍しくは無いのだが・・・。 このクエリが、データソースだけでなく、プラグインへのアクセス窓口にもなる。 GatsbyにおいてのGraphQLは、抽象化レイヤーのような役割をこなす。いろいろなデータソース(CMS)やプラグインのアクセス手順を抽象化してくれる。GraphQLがクッションのような役割をすることで、バックエンドとフロントエンドを疎結合にできる。

GatsbyはGraphiQLによるクエリ・ブラウザを提供しているので、__graphql にアクセスすることでGraphQLを簡単に試すことができる。

Gatsbyをビルドする

今回は、GatsbyをARM64 Linux のDockerコンテナでビルドすることにした。 GatsbyはNode.jsなのだからコンテナもNode.jsを選びたくなるが、Gatsbyが依存するいくつかのパッケージは node-gyp に依存している。それには Python が必要となる。Pythonが動かない環境では、 npm installyarn install がエラーになるだろう。

以下のようなNode.js と Pythonが動くDockerイメージを作りそこでビルドすることにした。

gist:itoudium/880b27af447be6ecbd9310baf0a478f6

ベースにPythonを使いつつ、Node.jsやYarnのインストールスクリプトを実行しているだけの内容。 これでコンテナ上でビルドできるようになった。 このコンテナを使って、CIパイプラインやプレビュー環境を作る。