Gatsbyからの移行
ここでは、移行を始める際に役立つ主要な概念と移行戦略を紹介します。詳しくはドキュメント全体やDiscordコミュニティをご活用ください。
GatsbyとAstroの類似点
セクションタイトル: GatsbyとAstroの類似点GatsbyとAstroには、プロジェクト移行を容易にするいくつかの共通点があります:
-
.astro
ファイルの構文はJSXとよく似ています。Astroの記法は馴染みがあるはずです。 -
AstroにはMarkdownのネイティブサポートがあり、MDXを利用するインテグレーションも用意されています。既存のMarkdownプラグインの多くをそのまま利用できます。
-
AstroにはReactコンポーネントを利用する公式インテグレーションがあります。AstroではReactファイルの拡張子を
.jsx
または.tsx
にする必要があります。 -
AstroはインストールNPMパッケージをサポートしており、Reactライブラリも含まれます。多くの既存の依存関係はAstroでも正常に動作します。
-
Gatsbyと同様に、AstroプロジェクトもSSGを選択できるほか、ページ単位の事前レンダリングを伴うSSRに対応しています。
GatsbyとAstroの主な相違点
セクションタイトル: GatsbyとAstroの主な相違点GatsbyサイトをAstroで再構築する際には、次のような重要な違いに気付くでしょう。
-
GatsbyプロジェクトはReactの単一ページアプリケーションで、
index.js
をプロジェクトのルートとして使用します。Astroプロジェクトはマルチページサイトで、index.astro
はホームページです。 -
Astroコンポーネントは、ページテンプレートを返すようにexportされた関数で書かれていません。代わりに、コードフェンス(
---
)でJavaScriptコードを区切って、生成するHTMLのためのコードを分けます。 -
ローカルファイルデータの取得: GatsbyはGraphQLを使用してプロジェクトファイルからデータを取得します。AstroではESMインポートとトップレベル
await
関数(例:import.meta.glob()
、getCollection()
)でファイルからデータをインポートします。必要ならAstroプロジェクトにGraphQLを手動で追加できますが、デフォルトでは含まれていません。
GatsbyプロジェクトをAstroに変換する
セクションタイトル: GatsbyプロジェクトをAstroに変換する各プロジェクトの移行手順は様々ですが、GatsbyからAstroへ変換する際に共通して行う作業があります。
新しいAstroプロジェクトの作成する
セクションタイトル: 新しいAstroプロジェクトの作成するパッケージマネージャでcreate astro
コマンドを実行してAstroのCLIウィザードを起動するか、Astro Theme Showcaseからコミュニティテーマを選択します。
create astro
コマンドに--template
引数を渡すと、公式スターター(例:docs
、blog
、portfolio
)のいずれかで新しいAstroプロジェクトを作成できます。また、GitHub上の既存Astroリポジトリから新規プロジェクトを開始することも可能です。
# Astro CLIウィザードを実行npm create astro@latest
# 公式スターターを指定して作成npm create astro@latest -- --template <example-name>
# Astro CLIウィザードを実行pnpm create astro@latest
# 公式スターターを指定して作成pnpm create astro@latest -- --template <example-name>
# Astro CLIウィザードを起動yarn create astro@latest
# 実際のスターターテンプレートを使用して新しいプロジェクトを開始yarn create astro@latest -- --template <example-name>
次に、既存のGatsbyプロジェクトのファイルをsrcの外側にある別フォルダーへコピーし、新しいAstroプロジェクトへ移行します。
公式スターターテンプレートの一覧は公式スターターテンプレートを参照してください。IDX、StackBlitz、CodeSandbox、またはGitpodで新規プロジェクトを開くためのリンクもあります。
インテグレーションのインストールする(任意)
セクションタイトル: インテグレーションのインストールする(任意)GatsbyプロジェクトをAstroへ変換する際、以下のようなAstroのオプションインテグレーションが役立つことがあります。
-
@astrojs/react: 新規Astroサイトで既存のReact UIコンポーネントを再利用するか、Reactコンポーネントで書き続けることができます。
-
@astrojs/mdx: Gatsbyプロジェクトの既存のMDXファイルを持ち込むか、新規AstroサイトでMDXを使用することができます。
ソースコードをsrc
に配置する
セクションタイトル: ソースコードをsrcに配置するAstroのプロジェクト構造に従って、次の手順でファイルを整理します。
-
削除 Gatsbyの
public/
フォルダ。Gatsbyはビルド出力を
public/
ディレクトリに生成しますが、Astroはデフォルトでdist/
を使用します。そのためpublic/
は安全に削除できます。 -
リネーム Gatsbyの
static/
フォルダをpublic/
、そしてAstroのpublic/
フォルダとして使用してください。Astroは静的アセット用に
public/
フォルダーを使用します。既存のAstropublic/
へstatic/
の内容をコピーしても構いません。 -
コピーまたは移動 Gatsbyの
components
、pages
などの他のファイルとフォルダを、必要に応じてAstroのsrc/
フォルダへ配置してください。Astroのプロジェクト構造を遵守して、ソースコードをsrc
に配置してください。Astroの
src/pages/
フォルダは、.astro
、.md
、.mdx
ファイルからサイトのページと記事を生成するための特殊なフォルダです。Astro、Markdown、MDXファイルのルーティングを設定する必要はありません。その他のフォルダは任意のため、
src/
フォルダの内容をどのように配置するかは任意です。Astroプロジェクトで一般的なフォルダにはsrc/layouts/
、src/components
、src/styles
、src/scripts
があります。
ヒント:JSXファイルから.astro
ファイルへの変換する
セクションタイトル: ヒント:JSXファイルから.astroファイルへの変換するここでは、Gatsbyの.js
コンポーネントを.astro
コンポーネントに変換するためのいくつかの手順を説明します。
-
既存Gatsbyコンポーネントの
return()
部分のみをHTMLテンプレートとして使用してください。 -
<Link to="">
・{children}
・className
などGatsby/JSX構文をAstro構文またはHTML標準に変換してください。 -
import
文を含んだ必要なJavaScriptは”コードフェンス” (---
)内へ移動してください。注意: 条件付きレンダリング用のJavaScriptは、AstroではHTMLテンプレート内に直接書くことが多いです。 -
Astro.props
(EN)を使用して、以前にGatsby関数に渡された追加のpropsを参照してください。 -
インポート済みコンポーネントをAstroに変換するか検討してください。公式Reactインテグレーションを使えばAstroファイル内で既存Reactコンポーネントを利用できますが、インタラクティブ性が不要なら
.astro
へ変換して軽量化できます。 -
GraphQLクエリは削除し、
import
やimport.meta.glob()でローカルファイルを読み込ます。
Gatsby Blogスターターを段階的に変換した例も参照してください。
.jsx
と.astro
の比較する
セクションタイトル: .jsxと.astroの比較する以下のGatsbyコンポーネントと対応するAstroコンポーネントを比較してください:
import * as React from "react"import { useStaticQuery, graphql } from "gatsby"import Header from "./header"import Footer from "./footer"import "./layout.css"
const Component = ({ message, children }) => { const data = useStaticQuery(graphql` query SiteTitleQuery { site { siteMetadata { title } } } `) return ( <> <Header siteTitle={data.site.siteMetadata.title} /> <div style={{ margin: `0`, maxWidth: `960`}}>{message}</div> <main>{children}</main> <Footer siteTitle={data.site.siteMetadata} /> </> )}
export default Component
---import Header from "./Header.astro"import Footer from "./Footer.astro"import "../styles/stylesheet.css"import { site } from "../data/siteMetaData.js"const { message } = Astro.props---<Header siteTitle={site.title} /> <div style="margin: 0; max-width: 960;">{message}</div> <main> <slot /> </main><Footer siteTitle={site.title} />
レイアウトファイル移行する
セクションタイトル: レイアウトファイル移行するレイアウトファイルをAstroレイアウトコンポーネントに変換するには、Gatsbyのレイアウトやテンプレートから始めてみてください。
Astroの各ページには必ず <html>
・<head>
・<body>
タグが必要なため、複数ページで同じレイアウトファイルを再利用するのが一般的です。Astroではページコンテンツ差し込みに Reactの {children}
ではなく <slot />
を使用し、import
文も不要です。Gatsbyのlayout.js
やテンプレートにはこれらが含まれていません。
標準的なHTMLテンプレートと<head>
タグへの直接アクセスする例:
<html lang="en"> <head> <meta charset="utf-8" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <meta name="viewport" content="width=device-width" /> <title>Astro</title> </head> <body> <!-- 既存のレイアウトテンプレートで`<slot />`要素を囲んでください。--> <slot /> </body></html>