diff --git a/src/content/docs/ja/basics/astro-components.mdx b/src/content/docs/ja/basics/astro-components.mdx index 7429d51531739..dd890d5e37b30 100644 --- a/src/content/docs/ja/basics/astro-components.mdx +++ b/src/content/docs/ja/basics/astro-components.mdx @@ -17,7 +17,7 @@ Astroコンポーネントは非常に柔軟です。多くの場合、Astroコ Astroコンポーネントについて知っておくべきもっとも重要なことは、**クライアント上でレンダリングされない**ということです。コンポーネントはビルド時または[サーバーサイドレンダリング(SSR)](/ja/guides/on-demand-rendering/)によりオンデマンドにレンダリングされます。コンポーネントのフロントマターの内部にJavaScriptコードを含められますが、それらはすべて、ユーザーのブラウザに送られる最終的なページからは取り除かれます。その結果、デフォルトではJavaScriptが含められることはなく、より高速なサイトが実現します。 -Astroコンポーネントがクライアントサイドでインタラクティビティを必要とする場合は、[標準のHTML` -``` - -### 最初のアクションを書いてみる - -以下の手順でアクションを定義し、Astroページの`script`タグから呼び出します。 - - - -1. `src/actions/index.ts`を作成し、`server`オブジェクトをエクスポートします。 - - ```ts title="src/actions/index.ts" - export const server = { - // アクションをここに宣言 - } - ``` - -2. `defineAction()`ユーティリティを`astro:actions`から、`z`オブジェクトを`astro:schema`からインポートします。 - - ```ts ins={1-2} title="src/actions/index.ts" - import { defineAction } from 'astro:actions'; - import { z } from 'astro:schema'; - - export const server = { - // アクションをここに宣言 - } - ``` - -3. `defineAction()`で`getGreeting`アクションを定義します。`input`プロパティは[Zod](https://zod.dev)スキーマで入力を検証し、`handler()`がサーバーで実行されるバックエンドロジックです。 - - ```ts ins={5-12} title="src/actions/index.ts" - import { defineAction } from 'astro:actions'; - import { z } from 'astro:schema'; - - export const server = { - getGreeting: defineAction({ - input: z.object({ - name: z.string(), - }), - handler: async (input) => { - return `Hello, ${input.name}!` - } - }) - } - ``` - -4. ボタンをクリックすると`getGreeting`アクションで挨拶を取得するAstroコンポーネントを作成します。 - - ```astro title="src/pages/index.astro" - --- - --- - - - - - ``` - -5. `actions`を`astro:actions`からインポートし、クリックハンドラ内で`actions.getGreeting()`を呼び出します。`name`オプションがサーバー側の`handler()`に渡され、エラーがなければ結果が`data`として返ります。 - - ```astro title="src/pages/index.astro" ins={7, 12-13} - --- - --- - - - - - ``` - - - -[`defineAction()`](/ja/reference/modules/astro-actions/#)の全プロパティはAPIリファレンスを参照してください。 - -## アクションの整理方法 - -すべてのアクションは`src/actions/index.ts`の`server`オブジェクトからエクスポートする必要があります。定義をそのまま書いても、別ファイルへ切り出してインポートしても構いません。関連する関数をネストしてまとめることもできます。 - -たとえば、ユーザー関連のアクションをまとめる場合、`src/actions/user.ts`に`getUser`と`createUser`をまとめた`user`オブジェクトを作成します。 - -```ts -// src/actions/user.ts -import { defineAction } from 'astro:actions'; - -export const user = { - getUser: defineAction(/* ... */), - createUser: defineAction(/* ... */), -} -``` - -その後、`src/actions/index.ts`でインポートし、他のアクションと並べてトップレベルに追加します。 - -```ts title="src/actions/index.ts" ins={1,5} -import { user } from './user'; - -export const server = { - myAction: defineAction({ /* ... */ }), - user, -} -``` - -これでユーザー関連アクションは`actions.user`から呼び出せます。 - -* `actions.user.getUser()` -* `actions.user.createUser()` - -## 返り値の扱い - -アクションは`handler()`の型安全な戻り値を持つ`data`、またはバックエンドエラーを持つ`error`を返します。`error`は`input`のバリデーションエラーや`handler()`内でスローされたエラーです。 - -アクションはDates、Maps、Sets、URLsを扱える独自フォーマットで返します([Devalueライブラリ](https://github.com/Rich-Harris/devalue)使用)。そのため通常のJSONのようにネットワークレスポンスを簡単に検査できません。デバッグ時はアクションが返す`data`オブジェクトを確認してください。 - -[`handler()`のAPIリファレンス](/ja/reference/modules/astro-actions/)を参照。 - -### エラーの有無を確認 - -`data`を使う前に`error`があるか確認するのがベストです。これにより事前にエラーを処理でき、`data`の`undefined`チェックが不要になります。 - -```ts -const { data, error } = await actions.example(); - -if (error) { - // エラー処理 - return; -} -// dataを利用 -``` - -### エラーチェックを行わずに`data`へ直接アクセスする - -プロトタイピング中、またはエラーを自動的に捕捉してくれるライブラリを使用している場合など、エラー処理を省きたい場合は、アクション呼び出しに`.orThrow()`プロパティを付与します。`error`を返す代わりに例外をスローし、アクションの`data`を直接返します。 - -以下の例では`likePost()`アクションを呼び出し、ハンドラーから返された更新後のいいね数を`number`型として受け取ります。 - -```ts ins="orThrow" -const updatedLikes = await actions.likePost.orThrow({ postId: 'example' }); -// ^ 型: number -``` - -### アクション内でバックエンドエラーを処理する - -データベースエントリが存在しない場合の"not found"や、ユーザーがログインしていない場合の"unauthorized"など、アクションの`handler()`からエラーをスローするには、`ActionError`を使用します。`undefined`を返す方法と比べて、次の2点がメリットです。 - -- `404 - Not found`や`401 - Unauthorized`のようにステータスコードを設定できます。これにより開発環境・本番環境の両方でリクエストごとのステータスを確認しやすくなります。 - -- アプリケーション側では、すべてのエラーがアクション結果の`error`オブジェクトにまとめられるため、`undefined`チェックが不要になり、原因に応じたフィードバックをユーザーに表示できます。 - -#### `ActionError`を作成する - -エラーをスローするには、`astro:actions`モジュールから`ActionError`クラスをインポートします。人が読める`code`(例:`"NOT_FOUND"`や`"BAD_REQUEST"`)と、任意で詳細を示す`message`を渡します。 - -次の例では、認証用Cookie「user-session」が存在しない場合に、`likePost`アクションから`UNAUTHORIZED`エラーをスローしています。 - -```ts title="src/actions/index.ts" ins=/ActionError(?= )/ ins={9-12} -import { defineAction, ActionError } from "astro:actions"; -import { z } from "astro:schema"; - -export const server = { - likePost: defineAction({ - input: z.object({ postId: z.string() }), - handler: async (input, ctx) => { - if (!ctx.cookies.has('user-session')) { - throw new ActionError({ - code: "UNAUTHORIZED", - message: "User must be logged in.", - }); - } - // ここで投稿に「いいね」を付与 - }, - }), -}; -``` - -#### `ActionError`を処理する - -アプリケーションからアクションを呼び出し、`error`プロパティの有無をチェックします。このプロパティは`ActionError`型で、`code`と`message`を含みます。 - -次の例では`LikeButton.tsx`コンポーネントがクリック時に`likePost()`を呼び出し、認証エラーならログインリンクを表示します。 - -```tsx title=src/components/LikeButton.tsx ins="if (error?.code === 'UNAUTHORIZED') setShowLogin(true);" -import { actions } from 'astro:actions'; -import { useState } from 'preact/hooks'; - -export function LikeButton({ postId }: { postId: string }) { - const [showLogin, setShowLogin] = useState(false); - return ( - <> - { - showLogin && Log in to like a post. - } - - - ) -} -``` - -### クライアントリダイレクトを処理する - -クライアント側からアクションを呼び出す場合、`react-router`のようなライブラリと連携するか、Astroの[`navigate()`関数](/ja/guides/view-transitions/)を使用して、アクション成功時に新しいページへリダイレクトできます。 - -以下の例では、`logout`アクションが成功した後、ホームページへ遷移します。 - -```tsx title=src/pages/LogoutButton.tsx {2,7-8} -import { actions } from 'astro:actions'; -import { navigate } from 'astro:transitions/client'; - -export function LogoutButton() { - return ( - - ); -} -``` - -## アクションでフォームデータを受け取る - -アクションはデフォルトでJSONデータを受け取ります。HTMLフォームのデータを扱いたい場合は、`defineAction()`で`accept: 'form'`を指定します。 - -```ts title="src/actions/index.ts" ins={6} -import { defineAction } from 'astro:actions'; -import { z } from 'astro:schema'; - -export const server = { - comment: defineAction({ - accept: 'form', - input: z.object(/* ... */), - handler: async (input) => { /* ... */ }, - }) -} -``` - -### フォームデータのバリデーション - -アクションは送信されたフォームデータを、各入力の`name`属性をキーとするオブジェクトへ変換します。たとえば``を含むフォームは`{ search: 'user input' }`のように解析されます。このオブジェクトはアクションの`input`スキーマで検証されます。 - -ハンドラーで生の`FormData`オブジェクトを扱いたい場合は、アクション定義から`input`プロパティを省略してください。 - -以下は、メールアドレス入力と「利用規約に同意」チェックボックスを検証するニュースレター登録フォームの例です。 - - - -1. 各入力に一意の`name`属性を持つHTMLフォームコンポーネントを作成します。 - - ```astro title="src/components/Newsletter.astro" /name="\w+"/ -
- - - - -
- ``` - -2. 送信されたフォームを処理する`newsletter`アクションを定義します。`email`フィールドは`z.string().email()`で、`terms`チェックボックスは`z.boolean()`で検証します。 - - ```ts title="src/actions/index.ts" ins={5-12} - import { defineAction } from 'astro:actions'; - import { z } from 'astro:schema'; - - export const server = { - newsletter: defineAction({ - accept: 'form', - input: z.object({ - email: z.string().email(), - terms: z.boolean(), - }), - handler: async ({ email, terms }) => { /* ... */ }, - }) - } - ``` - - `input`で利用できるすべてのフォームバリデータは[`input` APIリファレンス](/ja/reference/modules/astro-actions/#input-validator)を参照してください。 - -3. フォームに` - ``` - - フォームデータを送信する別の方法は[「HTMLフォームの`action`からアクションを呼び出す」](#htmlフォームのactionからアクションを呼び出す)を参照してください。 - -
- -### フォーム入力エラーを表示する - -`required`、`type="email"`、`pattern`などの[ネイティブHTMLフォームバリデーション属性](https://developer.mozilla.org/en-US/docs/Learn/Forms/Form_validation#using_built-in_form_validation)で送信前に検証できます。バックエンドでより複雑な`input`検証を行う場合は、[`isInputError()`](/ja/reference/modules/astro-actions/#isinputerror)ユーティリティを使用します。 - -入力エラーを取得するには、`isInputError()`でエラー原因が入力不正か確認します。入力エラーは`fields`オブジェクトに検証に失敗した各入力名のメッセージを持ちます。これらのメッセージを使ってユーザーに修正を促せます。 - -次の例では`isInputError()`でエラーを確認し、メールフィールドにエラーがあるかをチェックしてメッセージを生成しています。DOM操作や任意のUIフレームワークでユーザーに表示してください。 - -```js /isInputError(?= )/ {5-12} -import { actions, isInputError } from 'astro:actions'; - -const form = document.querySelector('form'); -const formData = new FormData(form); -const { error } = await actions.newsletter(formData); -if (isInputError(error)) { - // 入力エラーを処理 - if (error.fields.email) { - const message = error.fields.email.join(', '); - } -} -``` - -## HTMLフォームの`action`からアクションを呼び出す - -:::note -フォームの`action`でアクションを呼び出すページはオンデマンドレンダリングが必要です。このAPIを使用する前に、[そのページで事前レンダリングを無効化してください](/ja/guides/on-demand-rendering/)。 -::: - -任意の`
`要素に標準属性を追加するだけで、ゼロJS(JavaScript不要)のフォーム送信を実現できます。クライアント側JavaScriptが読み込まれなかった場合のフォールバックとして、あるいはフォーム処理を完全にサーバーに任せたい場合に便利です。 - -サーバーで[Astro.getActionResult()](/ja/reference/api-reference/)を呼び出すと、フォーム送信の結果(`data`または`error`)を取得できます。これを使ってリダイレクトやエラーハンドリング、UI更新などを動的に行えます。 - -HTMLフォームからアクションを呼び出すには、``に`method="POST"`を追加し、`action`属性にアクションを設定します。たとえば`action={actions.logout}`とすると、サーバー側で自動処理されるクエリ文字列が`action`属性へ設定されます。 - -次のAstroコンポーネントは、ボタンをクリックすると`logout`アクションを呼び出し、現在のページを再読み込みします。 - -```astro title="src/components/LogoutButton.astro" ---- -import { actions } from 'astro:actions'; ---- - - - -
-``` - -### アクション成功時にリダイレクトする - -アクション成功後に新しいルートへリダイレクトしたい場合は、サーバー側でアクション結果を利用します。よくある例として、商品レコードを作成した後に`/products/[id]`へリダイレクトするパターンがあります。 - -たとえば、生成された商品IDを返す`createProduct`アクションがあるとします。 - -```ts title="src/actions/index.ts" mark={10} -import { defineAction } from 'astro:actions'; -import { z } from 'astro:schema'; - -export const server = { - createProduct: defineAction({ - accept: 'form', - input: z.object({ /* ... */ }), - handler: async (input) => { - const product = await persistToDatabase(input); - return { id: product.id }; - }, - }) -} -``` - -Astroコンポーネントで`Astro.getActionResult()`を呼び出してアクション結果を取得します。アクションが呼び出されていない場合は`undefined`、呼び出されていれば`data`または`error`を含むオブジェクトが返ります。 - -`data`プロパティを使ってURLを作成し、`Astro.redirect()`でリダイレクトします。 - -```astro title="src/pages/products/create.astro" {4-7} ---- -import { actions } from 'astro:actions'; - -const result = Astro.getActionResult(actions.createProduct); -if (result && !result.error) { - return Astro.redirect(`/products/${result.data.id}`); -} ---- - -
- -
-``` - -### フォーム`action`のエラーを処理する - -フォームを含むAstroコンポーネント内で`Astro.getActionResult()`を呼び出すと、カスタムエラーハンドリング用に`data`と`error`へアクセスできます。 - -次の例では、`newsletter`アクションが失敗したときに一般的なエラーメッセージを表示します。 - -```astro title="src/pages/index.astro" {4,7-9} ---- -import { actions } from 'astro:actions'; - -const result = Astro.getActionResult(actions.newsletter); ---- - -{result?.error && ( -

Unable to sign up. Please try again later.

-)} -
- - -
-``` - -より細かい制御を行う場合は、[ `isInputError()`ユーティリティ](#フォーム入力エラーを表示する)を使って入力不正が原因かどうかを判定できます。 - -次の例は、無効なメールアドレスが送信されたときに`email`入力欄の下へエラーバナーを表示します。 - -```astro title="src/pages/index.astro" ins={5,13} ins='aria-describedby="error"' ---- -import { actions, isInputError } from 'astro:actions'; - -const result = Astro.getActionResult(actions.newsletter); -const inputErrors = isInputError(result?.error) ? result.error.fields : {}; ---- - -
- - {inputErrors.email &&

{inputErrors.email.join(',')}

} - -
-``` - -#### エラー時に入力値を保持する - -フォーム送信時、入力値はクリアされます。値を保持したい場合は、ページで[ビュートランジションを有効化](/ja/guides/view-transitions/ -)し、各入力に`transition:persist`ディレクティブを追加します。 - -```astro ins="transition:persist" - -``` - -### フォームアクション結果でUIを更新する - -アクションの戻り値を用いて成功時に通知を表示するには、アクションを`Astro.getActionResult()`へ渡し、返された`data`で必要なUIをレンダリングします。 - -次の例では、`addToCart`アクションが返す`productName`を使い、成功メッセージを表示しています。 - -```astro title="src/pages/products/[slug].astro" ---- -import { actions } from 'astro:actions'; - -const result = Astro.getActionResult(actions.addToCart); ---- - -{result && !result.error && ( -

Added {result.data.productName} to cart

-)} - - -``` - -### 上級編: セッションにアクション結果を保持する - -

- -アクション結果はPOST送信として表示されるため、ユーザーがページを閉じて再訪問すると結果は`undefined`に戻ります。また、ページをリロードしようとすると「フォームの再送信を確認しますか?」ダイアログが表示されます。 - -この挙動をカスタマイズするには、ミドルウェアを追加してアクション結果を手動で処理します。Cookieやセッションストレージを用いて結果を保持する方法を選択できます。 - -まず[ミドルウェアファイルを作成](/ja/guides/middleware/)し、`astro:actions`の[getActionContext()](/ja/reference/modules/astro-actions/)ユーティリティをインポートします。この関数はアクションハンドラーや呼び出し元(HTMLフォームかどうか)などの情報を含む`action`オブジェクトを返します。また、`setActionResult()`と`serializeActionResult()`を返し、`Astro.getActionResult()`で参照する値をプログラム的に設定できます。 - -```ts title="src/middleware.ts" {2,5} -import { defineMiddleware } from 'astro:middleware'; -import { getActionContext } from 'astro:actions'; - -export const onRequest = defineMiddleware(async (context, next) => { - const { action, setActionResult, serializeActionResult } = getActionContext(context); - if (action?.calledFrom === 'form') { - const result = await action.handler(); - // ... アクション結果を処理 - setActionResult(action.name, serializeActionResult(result)); - } - return next(); -}); -``` - -HTMLフォーム結果を保持する一般的な手法は[POST / Redirect / GETパターン](https://en.wikipedia.org/wiki/Post/Redirect/Get)です。これによりリロード時の再送信ダイアログが消え、アクション結果をセッション全体で維持できます。 - -以下の例では、[Netlifyサーバーアダプター](/ja/guides/integrations-guide/netlify/)を使用し、セッションストレージにPOST / Redirect / GETを適用しています。アクション結果を[Netlify Blob](https://docs.netlify.com/blobs/overview/)へ保存し、リダイレクト後にセッションIDで取得しています。 - -```ts title="src/middleware.ts" -import { defineMiddleware } from 'astro:middleware'; -import { getActionContext } from 'astro:actions'; -import { randomUUID } from "node:crypto"; -import { getStore } from "@netlify/blobs"; - -export const onRequest = defineMiddleware(async (context, next) => { - // プリレンダーページのリクエストはスキップ - if (context.isPrerendered) return next(); - - const { action, setActionResult, serializeActionResult } = - getActionContext(context); - // Netlify Blobでアクション結果を保持するストアを作成 - const actionStore = getStore("action-session"); - - // Cookie経由で結果が渡された場合、Astro.getActionResult()で参照できるよう設定 - const sessionId = context.cookies.get("action-session-id")?.value; - const session = sessionId - ? await actionStore.get(sessionId, { type: "json" }) - : undefined; - - if (session) { - setActionResult(session.actionName, session.actionResult); - // 必要なら描画後にセッションを削除 - await actionStore.delete(sessionId); - context.cookies.delete("action-session-id"); - return next(); - } - - // HTMLフォームのactionから呼び出された場合 - if (action?.calledFrom === "form") { - const actionResult = await action.handler(); - - // アクション結果をセッションストレージへ保持 - const newSessionId = randomUUID(); - await actionStore.setJSON(newSessionId, { - actionName: action.name, - actionResult: serializeActionResult(actionResult), - }); - - // リダイレクト後に取得できるようCookieへセッションIDを設定 - context.cookies.set("action-session-id", newSessionId); - - // エラー時は前のページへリダイレクト - if (actionResult.error) { - const referer = context.request.headers.get("Referer"); - if (!referer) { - throw new Error( - "Internal: Referer unexpectedly missing from Action POST request.", - ); - } - return context.redirect(referer); - } - // 成功時は現在のパスへリダイレクト - return context.redirect(context.originPathname); - } - - return next(); -}); -``` - -## アクション利用時のセキュリティ - -アクションはアクション名に基づくパブリックエンドポイントとして公開されます。たとえば`blog.like()`アクションは`/_actions/blog.like`からアクセス可能です。これはユニットテストや本番エラーのデバッグに便利ですが、**APIエンドポイントやオンデマンドレンダリングページと同じ認可チェックを必ず実装する必要があります。** - -### アクションハンドラー内でユーザーを認可する - -アクションリクエストを認可するには、アクションの`handler()`に認証チェックを追加します。セッション管理やユーザー情報の取得には[認証ライブラリ](/ja/guides/authentication/)の利用を検討してください。 - -アクションではミドルウェアから渡された値にアクセスできる`APIContext`全体が利用できます。ユーザーが認可されていない場合は、`UNAUTHORIZED`コードで`ActionError`をスローします。 - -```ts title="src/actions/index.ts" {6-8} -import { defineAction, ActionError } from 'astro:actions'; - -export const server = { - getUserSettings: defineAction({ - handler: async (_input, context) => { - if (!context.locals.user) { - throw new ActionError({ code: 'UNAUTHORIZED' }); - } - return { /* 成功時のデータ */ }; - } - }) -} -``` - -### ミドルウェアでアクションを制限する - -

- -Astroでは、各アクションの`handler()`内でユーザーセッションを認可し、パーミッションやレート制限をアクションごとに設定することを推奨しています。しかし、ミドルウェアから一括で(または一部の)アクションリクエストを制御することも可能です。 - -ミドルウェアで`getActionContext()`を使用して、受信したアクションリクエストの情報(アクション名や呼び出し元がRPCかHTMLフォームかなど)を取得します。 - -次の例では、有効なセッショントークンがないすべてのアクションリクエストを拒否します。チェックに失敗すると`403 Forbidden`を返します。**この方法はセッションが存在する場合のみアクセスを許可しますが、安全な認可の代替にはなりません。** - -```ts title="src/middleware.ts" -import { defineMiddleware } from 'astro:middleware'; -import { getActionContext } from 'astro:actions'; - -export const onRequest = defineMiddleware(async (context, next) => { - const { action } = getActionContext(context); - // クライアントサイドRPCから呼び出されたアクションか確認 - if (action?.calledFrom === 'rpc') { - // セッショントークンをチェック - if (!context.cookies.has('user-session')) { - return new Response('Forbidden', { status: 403 }); - } - } - - context.cookies.set('user-session', /* セッショントークン */); - return next(); -}); -``` - -## Astroコンポーネントやサーバーエンドポイントからアクションを呼び出す - -`Astro.callAction()`(サーバーエンドポイントでは`context.callAction()`)ラッパーを使用して、Astroコンポーネント内のスクリプトや他のサーバーコードからアクションを直接呼び出せます。アクションのロジックを再利用する際によく使われます。 - -第1引数にアクション、第2引数に入力パラメータを渡します。返り値はクライアント側と同様に`data`と`error`を含むオブジェクトです。 - -```astro title="src/pages/products.astro" {6} ---- -import { actions } from 'astro:actions'; - -const searchQuery = Astro.url.searchParams.get('search'); -if (searchQuery) { - const { data, error } = await Astro.callAction(actions.findProduct, { query: searchQuery }); - // 結果を処理 -} ---- -``` diff --git a/src/content/docs/ja/guides/astro-db.mdx b/src/content/docs/ja/guides/astro-db.mdx deleted file mode 100644 index 2fab5ff9b3824..0000000000000 --- a/src/content/docs/ja/guides/astro-db.mdx +++ /dev/null @@ -1,774 +0,0 @@ ---- -title: 'Astro DB' -description: Astro専用に設計された完全管理型SQLデータベース、Astro DBの使い方を学びましょう。 -githubIntegrationURL: '[https://github.com/withastro/astro/tree/main/packages/db/](https://github.com/withastro/astro/tree/main/packages/db/)' -i18nReady: true ---- - -import { FileTree } from '@astrojs/starlight/components'; -import PackageManagerTabs from '~/components/tabs/PackageManagerTabs.astro'; -import ReadMore from '~/components/ReadMore.astro'; -import Since from '~/components/Since.astro'; -import { Steps } from '@astrojs/starlight/components'; - -Astro DBは、Astroエコシステム向けに設計された完全管理型のSQLデータベースです。Astro内でローカル開発を行い、libSQL互換のデータベースへデプロイできます。 - -Astro DBは、データの設定、開発、クエリ実行をまとめて行える完全なソリューションです。`astro dev`を実行すると、`.astro/content.db`内にローカルデータベースが作成され、Dockerやネットワーク接続なしでデータを管理できます。 - -## インストール - -組み込みの`astro add`コマンドを使って[`@astrojs/db`インテグレーション](/ja/guides/integrations-guide/db/)をインストールします。 - - - - ```sh - npx astro add db - ``` - - - ```sh - pnpm astro add db - ``` - - - ```sh - yarn astro add db - ``` - - - -## データベースを定義する - -`astro add`コマンドで`@astrojs/db`をインストールすると、プロジェクト内に`db/config.ts`ファイルが自動作成され、ここでデータベーステーブルを定義します。 - -```ts title="db/config.ts" -import { defineDb } from 'astro:db'; - -export default defineDb({ - tables: { }, -}) -``` - -### テーブル - -Astro DBでは、データはSQLテーブルを使って保存されます。テーブルはデータを行と列で構造化し、各列は行の値の型を制約します。 - -既存のlibSQLデータベース内のデータ、または新規データベースで収集するデータの構造を`db/config.ts`ファイル内で定義します。これにより、Astroはそのテーブルにクエリを投げるためのTypeScriptインターフェースを生成します。結果として、プロパティの自動補完や型チェック付きでデータへアクセスでき、完全なTypeScriptサポートが得られます。 - -データベーステーブルを設定するには、`astro:db`から`defineTable()`と`column`ユーティリティをインポートして使用します。その後、テーブルの名前(大文字小文字を区別)と各列に入るデータの型を定義します。 - -以下は、`author`と`body`という必須のテキスト列を持つ`Comment`テーブルを設定し、それを`defineDb()`のエクスポートでプロジェクト内で利用可能にする例です。 - -```ts title="db/config.ts" "Comment" -import { defineDb, defineTable, column } from 'astro:db'; - -const Comment = defineTable({ - columns: { - author: column.text(), - body: column.text(), - } -}) - -export default defineDb({ - tables: { Comment }, -}) -``` - -[テーブル構成](/ja/guides/integrations-guide/db/#テーブル構成の参照)を参照してください。 - -### 列(カラム) - -Astro DBは以下の列タイプをサポートしています。 - -```ts title="db/config.ts" "column.text()" "column.number()" "column.boolean()" "column.date()" "column.json()" -import { defineTable, column } from 'astro:db'; - -const Comment = defineTable({ - columns: { - // テキスト文字列。 - author: column.text(), - // 整数値。 - likes: column.number(), - // 真偽値。 - flagged: column.boolean(), - // JavaScriptのDateオブジェクトとしてクエリされる日時値。 - published: column.date(), - // 型指定されていないJSONオブジェクト。 - metadata: column.json(), - } -}); -``` - -[テーブル構成](/ja/guides/integrations-guide/db/#テーブル構成の参照)を参照してください。 - -### テーブル参照 - -テーブル間のリレーションは、データベース設計における一般的なパターンです。たとえば、`Blog`テーブルは`Comment`、`Author`、`Category`といった他のテーブルと密接に関連する場合があります。 - -テーブル間の関係は**参照カラム**を使って定義し、データベーススキーマ内に保存できます。リレーションを確立するには、以下が必要です。 - -- 参照される側のテーブルに**識別子カラム**(通常は`primaryKey`プロパティを持つ`id`カラム)があること。 -- 基本テーブルに**参照する`id`を保存するカラム**を設置すること。このカラムは`references`プロパティを使用して関係を確立します。 - -以下は、`Comment`テーブルの`authorId`カラムが`Author`テーブルの`id`カラムを参照している例です。 - -```ts title="db/config.ts" {3, 10} -const Author = defineTable({ - columns: { - id: column.number({ primaryKey: true }), - name: column.text(), - } -}); - -const Comment = defineTable({ - columns: { - authorId: column.number({ references: () => Author.columns.id }), - body: column.text(), - } -}); -``` - -## 開発用データベースのシード - -開発環境では、AstroはDB設定を使用してスキーマに基づいたローカル型を生成します。これらの型は開発サーバー起動時に毎回シードファイルから新しく生成され、型安全性とオートコンプリート付きでデータのクエリや操作ができます。 - -開発中に[リモートデータベースへ接続](#リモートデータベースへの接続)しない限り、本番データへアクセスすることはできません。これによりデータを保護しつつ、型安全性のある動作データベースを用いたテスト・開発が可能になります。 - -テストやデバッグ用の開発データをAstroプロジェクトにシードするには、`db/seed.ts`ファイルを作成します。`astro:db`から定義済みの`db`オブジェクトやテーブルをインポートし、各テーブルに初期データを`insert`します。この開発用データは、データベーススキーマおよび本番データの形式と一致させる必要があります。 - -以下の例では、`Comment`テーブルと`Author`テーブルにそれぞれ2行の開発用データを定義しています。 - -```ts title="db/seed.ts" -import { db, Comment, Author } from 'astro:db'; - -export default async function() { - await db.insert(Author).values([ - { id: 1, name: "Kasim" }, - { id: 2, name: "Mina" }, - ]); - - await db.insert(Comment).values([ - { authorId: 1, body: 'Hope you like Astro DB!' }, - { authorId: 2, body: 'Enjoy!'}, - ]) -} -``` - -開発サーバーはこのファイルの変更を検知すると自動的にデータベースを再起動し、型を再生成し、`seed.ts`から新たに開発データをシードします。 - -## 本番用のlibSQLデータベースに接続する - -Astro DBは、ローカルのlibSQLデータベース、またはlibSQLリモートプロトコルを公開しているマネージド・セルフホスト型サーバーのどちらにも接続できます。 - -Astro DBをlibSQLデータベースに接続するには、データベースプロバイダーから取得した以下の環境変数を設定します。 - -- `ASTRO_DB_REMOTE_URL`: ローカルまたはリモートlibSQL DBの接続URL。このURLには、同期や暗号化などの[URL設定オプション](#リモートurl設定オプション)をパラメータとして含めることができます。 -- `ASTRO_DB_APP_TOKEN`: libSQLサーバーの認証トークン。これはリモートデータベースに必要であり、[ローカルDB(ファイルまたはメモリ内)](#urlスキームとホスト)には不要です。 - -サービスによってはCLIやWeb UIを使ってこれらの値を取得できます。以下では、例としてTursoを使用し、この値を設定する手順を示しますが、他のプロバイダーも自由に利用できます。 - -### Tursoの始め方 - -Tursoは、Astro DBを支えるオープンソースのSQLiteフォーク[libSQL](https://github.com/tursodatabase/libsql)の開発元です。完全管理型のlibSQLデータベースプラットフォームを提供し、Astroと完全互換です。 - -以下の手順では、Turso CLIのインストール、ログイン(またはサインアップ)、新しいデータベースの作成、必要な環境変数の取得、スキーマのリモートデータベースへのプッシュ方法を案内します。 - - - -1. [Turso CLI](https://docs.turso.tech/cli/installation)をインストールします。 - -2. Tursoに[ログインまたはサインアップ](https://docs.turso.tech/cli/authentication)します。 - -3. 新しいデータベースを作成します。例として、データベース名を`andromeda`とします。 - - ```sh "andromeda" - turso db create andromeda - ``` - -4. `show`コマンドを実行して、新しく作成したデータベースの情報を確認します。 - - ```sh "andromeda" - turso db show andromeda - ``` - - 出力される`URL`値をコピーし、`ASTRO_DB_REMOTE_URL`に設定します。 - - ```dotenv title=".env" "libsql://andromeda-houston.turso.io" - ASTRO_DB_REMOTE_URL=libsql://andromeda-houston.turso.io - ``` - -5. データベースへのリクエストを認証する新しいトークンを作成します。 - - ```sh "andromeda" - turso db tokens create andromeda - ``` - - コマンド出力をコピーし、`ASTRO_DB_APP_TOKEN`に設定します。 - - ```dotenv title=".env" add={2} "eyJhbGciOiJF...3ahJpTkKDw" - ASTRO_DB_REMOTE_URL=libsql://andromeda-houston.turso.io - ASTRO_DB_APP_TOKEN=eyJhbGciOiJF...3ahJpTkKDw - ``` - -6. DBスキーマとメタデータを新しいTursoデータベースにプッシュします。 - - ```sh - astro db push --remote - ``` - -7. 接続が完了しました!少し休憩しましょう。👾 - - ```sh - turso relax - ``` - - - -Tursoの詳細機能については、[Tursoドキュメント](https://docs.turso.tech)を参照してください。 - -### リモートデータベースへの接続 - -Astro DBでは、ローカルおよびリモートのデータベースへの接続が可能です。デフォルトでは、Astroは`dev`および`build`コマンド用にローカルデータベースファイルを使用し、毎回テーブルを再作成して開発用のシードデータを挿入します。 - -ホスティングされたリモートデータベースに接続するには、`--remote`フラグを使用します。このフラグにより、リモートデータベースへの読み取りおよび書き込みアクセスが有効化され、本番環境で[ユーザーデータを受け取り、永続化](#インサート)できます。 - -:::note -静的レンダリングまたはサーバーレンダリングモードを使用する任意のデプロイメントプラットフォームで、リモート接続は一般的に可能ですが、現在いくつかの制限があります。CloudflareやDenoのようなNode.js以外のランタイムでは、libSQLを使用する場合にサーバーレンダリングルートでのデータベース接続がサポートされていません。これらのプラットフォームへの対応は、今後の実装計画に含まれています。 -::: - -ビルドコマンドに`--remote`フラグを追加して構成します。 - -```json title="package.json" "--remote" -{ - "scripts": { - "build": "astro build --remote" - } -} -``` - -また、コマンドラインで直接フラグを使用することもできます。 - -```bash -# リモート接続でビルド -astro build --remote - -# リモート接続で開発 -astro dev --remote -``` - -:::caution -開発時に `--remote` フラグを使うと、**本番データベースに対して直接操作**が行われます。誤ってデータを追加、上書きや削除するリスクがあるため、十分注意してください。 -::: - -`--remote`フラグは、ローカルのビルド中およびサーバー上の両方でリモートDBへの接続を使用します。ローカル開発環境とデプロイメントプラットフォームの両方に必要な環境変数を必ず設定してください。 - -Astro DBプロジェクトをデプロイする際は、デプロイメントプラットフォームのビルドコマンドを`npm run build`(または使用するパッケージマネージャーの同等のコマンド)に設定し、`package.json`内で構成済みの`--remote`フラグを利用できるようにしてください。 - -### リモートURL設定オプション - -`ASTRO_DB_REMOTE_URL`環境変数は、データベースの場所および同期や暗号化などの他のオプションを構成します。 - -#### URLスキームとホスト - -libSQLは、リモートサーバー用のトランスポートプロトコルとしてHTTPおよびWebSocketの両方をサポートしています。また、ローカルファイルやインメモリDBの使用も可能です。これらは接続URL内の以下のスキームで構成できます。 - -- `memory:` → インメモリDBを使用(この場合ホストは空)。 -- `file:` → ローカルファイルを使用(ホストはファイルへのパス例:`file:path/to/file.db`)。 -- `libsql:` → ライブラリが推奨するプロトコルでリモートサーバーを使用(バージョンによって異なる場合あり)。ホストはサーバーのアドレス(例:`libsql://your.server.io`)。 -- `http:` → HTTP経由でリモートサーバーを使用。`https:`を使用するとセキュアな接続が可能。ホストは`libsql:`と同じ。 -- `ws:` → WebSocket経由でリモートサーバーを使用。`wss:`を使用するとセキュアな接続が可能。ホストは`libsql:`と同じ。 - -libSQL接続の詳細(例:暗号化キー、レプリケーション、同期間隔)は、リモート接続URL内のクエリパラメータとして構成できます。 - -たとえば、暗号化されたローカルファイルをlibSQLサーバーの埋め込みレプリカとして使用する場合、以下の環境変数を設定します。 - -```dotenv title=".env" -ASTRO_DB_REMOTE_URL=file://local-copy.db?encryptionKey=your-encryption-key&syncInterval=60&syncUrl=libsql%3A%2F%2Fyour.server.io -ASTRO_DB_APP_TOKEN=token-to-your-remote-url -``` - -#### `encryptionKey` - -libSQLは暗号化データベースをネイティブにサポートしています。この検索パラメータを渡すことで、指定したキーを使用して暗号化が有効になります。 - -```dotenv title=".env" -ASTRO_DB_REMOTE_URL=file:path/to/file.db?encryptionKey=your-encryption-key -``` - -#### `syncUrl` - -埋め込みレプリカは、libSQLクライアントの機能で、ローカルファイルまたはインメモリ上に完全に同期されたデータベースのコピーを作成し、超高速読み取りを実現します。書き込みは`syncUrl`で定義されたリモートデータベースに送信され、ローカルコピーと同期されます。 - -このプロパティを使用して、別のデータベースの埋め込みレプリカに変換するための接続URLを渡します。使用できるのは`file:`および`memory:`スキームのみです。パラメータはURLエンコードする必要があります。 - -たとえば、`libsql://your.server.io`上のデータベースのインメモリ埋め込みレプリカを作成する場合、次のように接続URLを設定します。 - -```dotenv title=".env" -ASTRO_DB_REMOTE_URL=memory:?syncUrl=libsql%3A%2F%2Fyour.server.io -``` - -#### `syncInterval` - -埋め込みレプリカの同期間隔(秒単位)。デフォルトでは起動時と書き込み後のみ同期されます。 - -このプロパティは`syncUrl`が設定されている場合のみ使用されます。たとえば、1分ごとに同期するインメモリ埋め込みレプリカを設定するには、次の環境変数を指定します。 - -```dotenv title=".env" -ASTRO_DB_REMOTE_URL=memory:?syncUrl=libsql%3A%2F%2Fyour.server.io&syncInterval=60 -``` - -## データベースをクエリする - -プロジェクト内の任意の[Astroページ](/ja/basics/astro-pages/#astroページ)、[エンドポイント](/ja/guides/endpoints/)、または[アクション](/ja/guides/actions/)から、提供されている`db` ORMおよびクエリビルダーを使用してデータベースをクエリできます。 - -### Drizzle ORM - -```ts -import { db } from 'astro:db'; -``` - -Astro DBには組み込みの[Drizzle ORM](https://orm.drizzle.team/)クライアントが含まれています。クライアントを使うために特別なセットアップや手動設定は不要です。Astroを実行すると、Astro DBの`db`クライアントはローカル・リモート両方のデータベースと通信するよう自動的に設定されます。データベーススキーマ定義を基に、存在しない列やテーブルを参照した際にはTypeScriptエラーを出す型安全なSQLクエリが実行されます。 - -### Select - -次の例は`Comment`テーブルの全行を選択します。これは`db/seed.ts`からシードされた開発データの完全な配列を返し、ページテンプレート内で使用できます。 - -```astro title="src/pages/index.astro" ---- -import { db, Comment } from 'astro:db'; - -const comments = await db.select().from(Comment); ---- - -

Comments

- -{ - comments.map(({ author, body }) => ( -
-

Author: {author}

-

{body}

-
- )) -} -``` - -[Drizzleの`select()` APIリファレンス](https://orm.drizzle.team/docs/select)を参照してください。 - -### インサート - -フォームリクエストの処理やリモートデータベースへのデータ挿入など、ユーザー入力を受け付けるには、Astroプロジェクトを[オンデマンドレンダリング](/ja/guides/on-demand-rendering/)用に設定し、[デプロイ環境に応じたアダプター](/ja/guides/on-demand-rendering/#アダプターを追加する)を追加します。 - -次の例は、パースされたフォームのPOSTリクエストに基づき`Comment`テーブルに行を挿入する例です。 - -```astro ---- -// src/pages/index.astro -import { db, Comment } from 'astro:db'; - -if (Astro.request.method === 'POST') { - // POSTリクエストのフォームデータを解析します。 - const formData = await Astro.request.formData(); - const author = formData.get('author'); - const body = formData.get('body'); - - if (typeof author === 'string' && typeof body === 'string') { - // Commentテーブルに行を挿入します。 - await db.insert(Comment).values({ author, body }); - } -} - -// 新しいコメントリストを各リクエストでレンダリングします。 -const comments = await db.select().from(Comment); ---- - -
- - - - - - - -
- - -``` - -また、[Astroアクション](/ja/guides/actions/)を使用してAstro DBテーブルにデータを挿入することもできます。次の例はアクションを使用して`Comment`テーブルに行を挿入する例です。 - -```ts -// src/actions/index.ts -import { db, Comment } from 'astro:db'; -import { defineAction } from 'astro:actions'; -import { z } from 'astro:schema'; - -export const server = { - addComment: defineAction({ - // Zodを使用して型安全性を提供します。 - // Astroページでtypeof {value} === 'string'をチェックする必要がありません。 - input: z.object({ - author: z.string(), - body: z.string(), - }), - handler: async (input) => { - const updatedComments = await db - .insert(Comment) - .values(input) - .returning(); // 更新されたコメントを返します。 - return updatedComments; - }, - }), -}; -``` - -[Drizzleの`insert()` APIリファレンス](https://orm.drizzle.team/docs/insert)を参照してください。 - -### Delete - -APIエンドポイントからデータベースをクエリすることもできます。次の例は、`id`パラメータに基づいて`Comment`テーブルから行を削除する例です。 - -```ts -// src/pages/api/comments/[id].ts -import type { APIRoute } from "astro"; -import { db, Comment, eq } from 'astro:db'; - -export const DELETE: APIRoute = async (ctx) => { - await db.delete(Comment).where(eq(Comment.id, ctx.params.id )); - return new Response(null, { status: 204 }); -} -``` - -[Drizzleの`delete()` APIリファレンス](https://orm.drizzle.team/docs/delete)を参照してください。 - -### フィルタリング - -特定のプロパティに基づいてテーブル結果をクエリするには、[Drizzleの部分選択用オプション](https://orm.drizzle.team/docs/select#partial-select)を使用します。たとえば、`select()`クエリに[`.where()`呼び出し](https://orm.drizzle.team/docs/select#filtering)を追加し、比較条件を渡します。 - -以下の例では、`Comment`テーブル内の`body`に"Astro DB"というフレーズを含む全行をクエリしています。[`like()`演算子](https://orm.drizzle.team/docs/operators#like)を使用して、フレーズが含まれているかを確認します。 - -```astro title="src/pages/index.astro" ---- -import { db, Comment, like } from 'astro:db'; - -const comments = await db.select().from(Comment).where( - like(Comment.body, '%Astro DB%') -); ---- -``` - -### Drizzleユーティリティ - -クエリ構築用のすべてのDrizzleユーティリティは`astro:db`モジュールから提供されます。これには以下が含まれます。 - -- `eq()`や`gt()`のような[フィルタ演算子](https://orm.drizzle.team/docs/operators) -- `count()`のような[集約ヘルパー](https://orm.drizzle.team/docs/select#aggregations-helpers) -- 生のSQLクエリを書くための[`sql`ヘルパー](https://orm.drizzle.team/docs/sql) - -```ts -import { eq, gt, count, sql } from 'astro:db'; -``` - -### リレーション - -SQLのjoinを使って複数のテーブルから関連データをクエリできます。joinクエリを作成するには、`db.select()`ステートメントにjoin演算子を追加します。各関数は結合するテーブルと、2つのテーブル間で行を一致させる条件を受け取ります。 - -以下の例では、`innerJoin()`関数を使用し、`Comment`の著者と、それに関連する`Author`情報を`authorId`列を基に結合しています。これにより、各`Author`および`Comment`行がトップレベルのプロパティとして含まれるオブジェクトの配列が返されます。 - -```astro title="src/pages/index.astro" ---- -import { db, eq, Comment, Author } from 'astro:db'; - -const comments = await db.select() - .from(Comment) - .innerJoin(Author, eq(Comment.authorId, Author.id)); ---- - -

Comments

- -{ - comments.map(({ Author, Comment }) => ( -
-

Author: {Author.name}

-

{Comment.body}

-
- )) -} -``` - -[Drizzleのjoinリファレンス](https://orm.drizzle.team/docs/joins#join-types)ですべての利用可能なjoin演算子や設定オプションを確認できます。 - -### バッチトランザクション - -すべてのリモートデータベースクエリはネットワークリクエストとして行われます。大量のクエリをまとめて単一のトランザクションにまとめたい場合や、クエリの一部が失敗した際に自動ロールバックを行いたい場合があります。 - -以下の例では、`db.batch()`メソッドを使って単一のリクエストで複数の行をシードしています。 - -```ts -// db/seed.ts -import { db, Author, Comment } from 'astro:db'; - -export default async function () { - const queries = []; - // 100件のサンプルコメントをリモートデータベースにシードします。 - // これは単一のネットワークリクエストで行われます。 - for (let i = 0; i < 100; i++) { - queries.push(db.insert(Comment).values({ body: `Test comment ${i}` })); - } - await db.batch(queries); -} -``` - -[Drizzleの`db.batch()`ドキュメント](https://orm.drizzle.team/docs/batch-api)で詳細を確認してください。 - -## データベースへの変更をプッシュする - -開発中に行った変更をデータベースにプッシュできます。 - -### テーブルスキーマをプッシュする - -プロジェクトが成長するにつれて、テーブルスキーマは変化する可能性があります。設定変更をローカルで安全にテストし、デプロイ時にリモートデータベースへプッシュできます。 - -ローカルのスキーマ変更をリモートデータベースにプッシュするには、CLIで`astro db push --remote`コマンドを使用します。 - - - - ```sh - npm run astro db push --remote - ``` - - - ```sh - pnpm astro db push --remote - ``` - - - ```sh - yarn astro db push --remote - ``` - - - -このコマンドは、ローカルの変更がデータ損失なしに適用できるか検証し、必要に応じて安全にスキーマ変更を行う方法を提案します。 - -#### 互換性のないスキーマ変更をプッシュする - -リモートデータベース上の既存データと互換性のない形でテーブルスキーマを変更する場合は、本番データベースをリセットする必要があります。 - -互換性のないスキーマ更新をプッシュするには、`--force-reset`フラグを追加して本番データをすべてリセットします。 - - - - ```sh - npm run astro db push --remote --force-reset - ``` - - - ```sh - pnpm astro db push --remote --force-reset - ``` - - - ```sh - yarn astro db push --remote --force-reset - ``` - - - -### テーブルの名前変更 - -スキーマをリモートデータベースにプッシュした後でもテーブル名を変更できます。 - -**重要な本番データがない場合**は、`--force-reset`フラグを使用して[データベースをリセット](#データベースへの変更をプッシュする)できます。このフラグはデータベース内のすべてのテーブルを削除し、新しいスキーマに基づいて再作成します。 - -本番データを保持したままテーブル名を変更する場合は、非破壊的な変更を段階的に行う必要があります。 - -以下は`Comment`テーブルを`Feedback`に名前を変え、古いテーブルを非推奨にする例です。 - - - -1. データベース設定ファイル内で、リネーム対象のテーブルに`deprecated: true`プロパティを追加します。 - - ```ts title="db/config.ts" ins={2} - const Comment = defineTable({ - deprecated: true, - columns: { - author: column.text(), - body: column.text(), - } - }); - ``` - -2. 既存テーブルのプロパティと完全に一致する新しい名前のテーブルスキーマを追加します。 - - ```ts title="db/config.ts" ins={8-14} - const Comment = defineTable({ - deprecated: true, - columns: { - author: column.text(), - body: column.text(), - } - }); - const Feedback = defineTable({ - columns: { - author: column.text(), - body: column.text(), - } - }); - ``` - -3. `astro db push --remote`で[リモートデータベースへプッシュ](#テーブルスキーマをプッシュする)します。これにより、新しいテーブルが追加され、古いテーブルが非推奨としてマークされます。 - -4. プロジェクト内のコードをすべて新しいテーブルを使用するよう更新します。必要に応じてデータ移行も行います。 - -5. 古いテーブルがプロジェクト内で完全に使用されなくなったことを確認したら、`config.ts`からスキーマを削除します。 - ```ts title="db/config.ts" del={1-7} - const Comment = defineTable({ - deprecated: true, - columns: { - author: column.text(), - body: column.text(), - } - }); - - const Feedback = defineTable({ - columns: { - author: column.text(), - body: column.text(), - } - }); - ``` - -6. 再度`astro db push --remote`でリモートデータベースにプッシュします。古いテーブルは削除され、新しい名前のテーブルだけが残ります。 - - - -### テーブルデータをプッシュする - -シードやデータマイグレーションのためにリモートデータベースにデータをプッシュする必要がある場合があります。`astro:db`モジュールを使って型安全なクエリを記述した`.ts`ファイルを作成し、`astro db execute <ファイルパス> --remote`コマンドで実行します。 - -以下のコメントは、`astro db execute db/seed.ts --remote`コマンドでシードできます。 - -```ts -// db/seed.ts g -import { Comment } from 'astro:db'; - -export default async function () { - await db.insert(Comment).values([ - { authorId: 1, body: 'Hope you like Astro DB!' }, - { authorId: 2, body: 'Enjoy!' }, - ]) -} -``` - -[CLIリファレンス](/ja/guides/integrations-guide/db/#astro-db-cli-レファレンス)ですべてのコマンドを確認できます。 - -## Astro DBインテグレーションを構築する - -[Astroインテグレーション](/ja/reference/integrations-reference/)を使って、追加のAstro DBテーブルやシードデータをユーザープロジェクトに拡張できます。 - -`astro:db:setup`フック内の`extendDb()`メソッドを使用して、追加のAstro DB設定やシードファイルを登録します。`defineDbIntegration()`ヘルパーを使うと、`astro:db:setup`フック内でTypeScriptサポートとオートコンプリートが利用できます。 - -```js {8-13} -// my-integration/index.ts -import { defineDbIntegration } from '@astrojs/db/utils'; - -export default function MyIntegration() { - return defineDbIntegration({ - name: 'my-astro-db-powered-integration', - hooks: { - 'astro:db:setup': ({ extendDb }) => { - extendDb({ - configEntrypoint: '@astronaut/my-package/config', - seedEntrypoint: '@astronaut/my-package/seed', - }); - }, - // その他のインテグレーションフック... - }, - }); -} -``` - -インテグレーションの[設定](#データベースを定義する)および[シード](#開発用データベースのシード)ファイルは、ユーザー定義のものと同じ形式です。 - -### インテグレーション内の型安全な操作 - -インテグレーション開発中は、`astro:db`からエクスポートされるAstro生成のテーブル型を利用できない場合があります。完全な型安全性を確保するためには、`asDrizzleTable()`ユーティリティを使い、データベース操作用のテーブル参照オブジェクトを作成します。 - -たとえば、以下のように`Pets`データベーステーブルをセットアップするインテグレーションの場合: - -```js -// my-integration/config.ts -import { defineDb, defineTable, column } from 'astro:db'; - -export const Pets = defineTable({ - columns: { - name: column.text(), - species: column.text(), - }, -}); - -export default defineDb({ tables: { Pets } }); -``` - -シードファイルでは`Pets`をインポートし、`asDrizzleTable()`を使って型チェック付きで行を挿入できます。 - -```js {2,7} /typeSafePets(?! )/ -// my-integration/seed.ts -import { asDrizzleTable } from '@astrojs/db/utils'; -import { db } from 'astro:db'; -import { Pets } from './config'; - -export default async function() { - const typeSafePets = asDrizzleTable('Pets', Pets); - - await db.insert(typeSafePets).values([ - { name: 'Palomita', species: 'cat' }, - { name: 'Pan', species: 'dog' }, - ]); -} -``` - -`asDrizzleTable('Pets', Pets)`で返される値は`import { Pets } from 'astro:db'`と同等ですが、Astroの型生成が実行できない場合でも利用可能です。データベースへのクエリや挿入が必要なインテグレーションコード内で使用できます。 - -## Astro StudioからTursoへの移行 - - - -1. [Studioダッシュボード](https://studio.astro.build/)で、移行したいプロジェクトに移動します。設定タブ内の"Export Database"ボタンを使い、データベースのダンプをダウンロードします。 -2. 公式手順に従って[Turso CLIをインストール](https://docs.turso.tech/cli/installation)し、Tursoアカウントに[サインアップまたはログイン](https://docs.turso.tech/cli/authentication)します。 -3. `turso db create`コマンドを使用してTurso上に新しいデータベースを作成します。 - - ```sh - turso db create [database-name] - ``` -4. Turso CLIを使ってデータベースURLを取得し、それを環境変数`ASTRO_DB_REMOTE_URL`として設定します。 - - ```sh - turso db show [database-name] - ``` - - ```dotenv - ASTRO_DB_REMOTE_URL=[your-database-url] - ``` -5. データベースへアクセスするためのトークンを作成し、それを環境変数`ASTRO_DB_APP_TOKEN`として設定します。 - - ```sh - turso db tokens create [database-name] - ``` - - ```dotenv - ASTRO_DB_APP_TOKEN=[your-app-token] - ``` -6. データベーススキーマとメタデータを新しいTursoデータベースにプッシュします。 - - ```sh - astro db push --remote - ``` -7. ステップ1でダウンロードしたデータベースダンプを新しいTurso DBにインポートします。 - - ```sh - turso db shell [database-name] < ./path/to/dump.sql - ``` -8. プロジェクトが新しいデータベースに正常に接続されていることを確認したら、Astro Studioからプロジェクトを安全に削除できます。 - - diff --git a/src/content/docs/ja/guides/authentication.mdx b/src/content/docs/ja/guides/authentication.mdx deleted file mode 100644 index 42a5a85c6759f..0000000000000 --- a/src/content/docs/ja/guides/authentication.mdx +++ /dev/null @@ -1,394 +0,0 @@ ---- -title: 認証 -description: Astroにおける認証の導入 -i18nReady: true ---- -import { Steps } from '@astrojs/starlight/components' -import PackageManagerTabs from '~/components/tabs/PackageManagerTabs.astro' -import UIFrameworkTabs from '~/components/tabs/UIFrameworkTabs.astro' -import ReadMore from '~/components/ReadMore.astro' - -認証と認可はウェブサイトやアプリへのアクセスを管理する2つのセキュリティプロセスです。認証は訪問者のアイデンティティを検証し、認可は保護領域やリソースへのアクセスを許可します。 - -認証を導入すると、ログイン済みユーザー向けにサイトをカスタマイズでき、個人情報を安全に保護できます。認証ライブラリ(例: [Auth.js](https://authjs.dev/)、[Clerk](https://clerk.com))は、メールサインインやOAuthなど複数の認証方法を提供します。 - -:::tip -Astro公式の認証ソリューションはありませんが、インテグレーションディレクトリでコミュニティ製"auth" インテグレーションを検索できます。 -::: - -バックエンドサービスごとの専用ガイド: [Supabaseで認証を追加](/ja/guides/backend/supabase/#supabaseで認証を追加する)、[Firebaseで認証を追加](/ja/guides/backend/google-firebase/#astroでfirebaseを初期化する) - -## Auth.js - -Auth.jsはフレームワークに依存しない認証ライブラリです。Astro向けにコミュニティ製アダプタ[`auth-astro`](https://www.npmjs.com/package/auth-astro)が提供されています。 - -### インストール - -任意のパッケージマネージャで`astro add`コマンドを実行し、`auth-astro`インテグレーションを追加します。 - - - - ```shell - npx astro add auth-astro - ``` - - - ```shell - pnpm astro add auth-astro - ``` - - - ```shell - yarn astro add auth-astro - ``` - - - -#### 手動インストール手順 - -`auth-astro`を手動で導入する場合は次のパッケージをインストールします。 - - - - ```shell - npm install auth-astro @auth/core@^0.18.6 - ``` - - - ```shell - pnpm add auth-astro @auth/core@^0.18.6 - ``` - - - ```shell - yarn add auth-astro @auth/core@^0.18.6 - ``` - - - -続いて `astro.config.*`ファイルの`integrations`プロパティに追加します。 - -```ts title="astro.config.mjs" ins={2,6} -import { defineConfig } from 'astro/config'; -import auth from 'auth-astro'; - -export default defineConfig({ - // ... - integrations: [auth()], -}); -``` - -### 設定 - -プロジェクトのルートに`auth.config.ts`ファイルを作成し、利用したい[認証プロバイダ](https://authjs.dev/getting-started/providers)やメソッドを追加します。 - -```ts title="auth.config.ts" -import GitHub from '@auth/core/providers/github'; -import { defineConfig } from 'auth-astro'; - -export default defineConfig({ - providers: [ - GitHub({ - clientId: import.meta.env.GITHUB_CLIENT_ID, - clientSecret: import.meta.env.GITHUB_CLIENT_SECRET, - }), - ], -}); -``` - -`.env`ファイルが未作成ならルートに置き、次の環境変数を設定します。`AUTH_SECRET`は32文字以上のランダム文字列にしてください。 - -```sh title=".env" -AUTH_TRUST_HOST=true -AUTH_SECRET= -``` - -### 使い方 - -サインイン/サインアウトボタンを`auth-astro/client`モジュールで追加できます。 - -```astro title="src/pages/index.astro" {9} ---- -import Layout from 'src/layouts/Base.astro'; ---- - - - - - - -``` - -ユーザーセッションは`getSession`で取得できます。 - -```astro title="src/pages/index.astro" {3,5} ---- -import Layout from 'src/layouts/Base.astro'; -import { getSession } from 'auth-astro/server'; - -const session = await getSession(Astro.request); ---- - - { - session ? ( -

{session.user?.name}さん、ようこそ

- ) : ( -

未ログイン

- ) - } -
-``` - -### 次のステップ - -- [`auth-astro` on GitHub](https://github.com/nowaythatworked/auth-astro?tab=readme-ov-file#auth-astro) -- [Auth.jsドキュメント](https://authjs.dev/) - -## Better Auth - -Better AuthはTypeScript向けのフレームワークに依存しない認証・認可フレームワークです。豊富な標準機能とプラグインエコシステムがあり、高度な機能も簡単に追加できます。 - -Astroを公式サポートしているため、Astroプロジェクトに手軽に認証を導入できます。 - -### インストール - - - - ```shell - npm install better-auth - ``` - - - ```shell - pnpm add better-auth - ``` - - - ```shell - yarn add better-auth -``` - - - -詳細なセットアップは[Better Authインストールガイド](https://www.better-auth.com/docs/installation)を参照してください。 - -### 設定 - -[Better Authインストールガイド](https://www.better-auth.com/docs/installation#configure-database)に従って、ユーザーデータと利用したい認証方式を保存できるようデータベーステーブルを設定してください。その後、Better AuthのハンドラーをAstroプロジェクトにマウントします。 - -```ts title="src/pages/api/auth/[...all].ts" -import { auth } from '../../../lib/auth'; // Better Auth インスタンス -import type { APIRoute } from 'astro'; - -export const ALL: APIRoute = async (ctx) => { - return auth.handler(ctx.request); -}; -``` - -詳しくは[Better Auth Astroガイド](https://www.better-auth.com/docs/integrations/astro)を参照してください。 - -### 使い方 - -Better Authは、Vanilla JS、React、Vue、Svelte、Solidなど複数のフレームワーク向けに`createAuthClient`ヘルパーを提供しています。 - -たとえば、React用のクライアントを作成するには、`'better-auth/react'`からヘルパーをインポートします。 - - - - ```ts title="src/lib/auth-client.ts" - import { createAuthClient } from 'better-auth/react'; - - export const authClient = createAuthClient(); - - export const { signIn, signOut } = authClient; - ``` - - - ```ts title="src/lib/auth-client.ts" - import { createAuthClient } from 'better-auth/solid'; - - export const authClient = createAuthClient(); - - export const { signIn, signOut } = authClient; - ``` - - - ```ts title="src/lib/auth-client.ts" - import { createAuthClient } from 'better-auth/svelte'; - - export const authClient = createAuthClient(); - - export const { signIn, signOut } = authClient; - ``` - - - ```ts title="src/lib/auth-client.ts" - import { createAuthClient } from 'better-auth/vue'; - - export const authClient = createAuthClient(); - - export const { signIn, signOut } = authClient; - ``` - - - -クライアントのセットアップが完了したら、Astroコンポーネントや任意のフレームワーク専用ファイル内でユーザー認証に利用できます。次の例では、設定済みの`signIn()`と`signOut()`関数でログイン/ログアウト機能を追加しています。 - -```astro title="src/pages/index.astro" ---- -import Layout from 'src/layouts/Base.astro'; ---- - - - - - - -``` - -続いて、サーバー側コードで`auth`オブジェクトを用いてユーザーのセッションデータを取得できます。次の例では、認証済みユーザーの名前を表示してページ内容をパーソナライズしています。 - -```astro title="src/pages/index.astro" ---- -import { auth } from "../../../lib/auth"; // Better Authインスタンスをインポート - -const session = await auth.api.getSession({ - headers: Astro.request.headers, -}); ---- - -

{session.user?.name}

-``` - -さらに、`auth`オブジェクトを使ってミドルウェアでルートを保護することもできます。次の例では、ログイン後のダッシュボード (`/dashboard`) にアクセスしようとするユーザーが認証済みかを確認し、未認証の場合はホームページへリダイレクトします。 - -```ts title="src/middleware.ts" -import { auth } from "../../../auth"; // Better Authインスタンスをインポート -import { defineMiddleware } from "astro:middleware"; - -export const onRequest = defineMiddleware(async (context, next) => { - const isAuthed = await auth.api - .getSession({ - headers: context.request.headers, - }) - if (context.url.pathname === "/dashboard" && !isAuthed) { - return context.redirect("/"); - } - return next(); -}); -``` - -### 次のステップ - -- [Better Auth Astroガイド](https://www.better-auth.com/docs/integrations/astro) -- [Astro用Better Authサンプル](https://github.com/better-auth/examples/tree/main/astro-example) -- [Better Authドキュメント](https://www.better-auth.com/docs) -- [Better Auth GitHubリポジトリ](https://github.com/better-auth/better-auth) - -## Clerk - -ClerkはUIコンポーネント、API、管理ダッシュボードを備えたユーザー管理サービスです。[公式Clerk SDK for Astro](https://clerk.com/docs/references/astro/overview) が提供されています。 - -### インストール - -任意のパッケージマネージャで `@clerk/astro` を追加します。 - - - - ```shell - npm install @clerk/astro - ``` - - - ```shell - pnpm add @clerk/astro - ``` - - - ```shell - yarn add @clerk/astro - ``` - - - -### 設定 - -Clerkの[Astroクイックスタートガイド](https://clerk.com/docs/quickstarts/astro)に従い、AstroプロジェクトにClerkインテグレーションとミドルウェアを設定します。 - -### 使い方 - -Clerkは、ユーザーの認証状態に応じてページの表示可否を制御できるコンポーネントを提供します。未ログインの訪問者には、ログインユーザー向けコンテンツの代わりにサインインボタンを表示できます。 - -```astro title="src/pages/index.astro" ---- -import Layout from 'src/layouts/Base.astro'; -import { SignedIn, SignedOut, UserButton, SignInButton } from '@clerk/astro/components'; ---- - - - - - - - - - -``` - -またClerkでは、ミドルウェアを使ってサーバー側でルートを保護できます。保護対象のルートを指定し、未認証ユーザーにはサインインを促します。 - -```ts title="src/middleware.ts" -import { clerkMiddleware, createRouteMatcher } from '@clerk/astro/server'; - -const isProtectedRoute = createRouteMatcher([ - '/dashboard(.*)', - '/forum(.*)', -]); - -export const onRequest = clerkMiddleware((auth, context) => { - if (!auth().userId && isProtectedRoute(context.request)) { - return auth().redirectToSignIn(); - } -}); -``` - -### 次のステップ - -- [`@clerk/astro`公式ドキュメント](https://clerk.com/docs/references/astro/overview) -- [Clerk + Astro クイックスタートテンプレート](https://github.com/clerk/clerk-astro-quickstart) - -## Lucia - -[Lucia](https://lucia-auth.com/)はセッションベース認証を複数フレームワークで実装できるライブラリーで、Astroもサポートしています。 - -### ガイド - - - -1. 任意のデータベースで[基本セッションAPI](https://lucia-auth.com/sessions/basic-api/)を実装します。 -2. エンドポイントとミドルウェアで[セッションクッキー](https://lucia-auth.com/sessions/cookies/astro)を追加します。 -3. 実装したAPIを使って[GitHub OAuth](https://lucia-auth.com/tutorials/github-oauth/astro)を組み込みます。 - - - -### 例 - -- [AstroでのGitHub OAuth例](https://github.com/lucia-auth/example-astro-github-oauth) -- [AstroでのGoogle OAuth例](https://github.com/lucia-auth/example-astro-google-oauth) -- [メール+パスワード+2FA例](https://github.com/lucia-auth/example-astro-email-password-2fa) -- [メール+パスワード+2FA+WebAuthn例](https://github.com/lucia-auth/example-astro-email-password-webauthn) - -## コミュニティリソース - -- [Microsoft Entra ID EasyAuthをAstroとAzure Static Web Appsで使う](https://agramont.net/blog/entra-id-easyauth-with-astro/) diff --git a/src/content/docs/ja/guides/client-side-scripts.mdx b/src/content/docs/ja/guides/client-side-scripts.mdx deleted file mode 100644 index 0fa8f4b6a801b..0000000000000 --- a/src/content/docs/ja/guides/client-side-scripts.mdx +++ /dev/null @@ -1,249 +0,0 @@ ---- -title: スクリプトとイベントハンドリング -description: >- - ネイティブブラウザのJavaScript APIを使ってクライアントサイドのインタラクティブ性を - Astroコンポーネントに追加する方法 -i18nReady: true ---- -import ReadMore from '~/components/ReadMore.astro' - -標準的なHTMLの` -``` - -デフォルトでは、Astroは` -``` - -### スクリプトの処理 - -デフォルトで`タグはAstroで処理されます。 - -- すべてのインポートはバンドルされ、ローカルファイルやNodeモジュールをインポートできます。 -- 処理されたスクリプトは、[`type="module"`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Modules)としてページの``に挿入されます。 -- TypeScriptを対応しており、TypeScriptファイルもインポートできます -- コンポーネントがページに複数回使われている場合、スクリプトは一度だけ含まれます。 - -```astro title="src/components/Example.astro" - -``` - -`type="module"`属性は、ブラウザにスクリプトをJavaScriptモジュールとして扱わせます。これにはいくつかのパフォーマンス上のメリットがあります。 - -- レンダリングがブロックされません。モジュールスクリプトとその依存関係がロードされる間、ブラウザは残りのHTMLの処理を続けます。 -- ブラウザはモジュールスクリプトを実行する前に、HTMLが処理されるのを待ちます。"load"イベントをリッスンする必要はありません。 -- `async`と`defer`属性は不要です。モジュールスクリプトは常に延期されます。 - -:::note -`async`属性はレンダリングのブロックを防ぐため、通常のスクリプトにとって価値があります。しかし、モジュールスクリプトでは既にこの動作が含まれています。モジュールスクリプトに`async`を追加すると、ページが完全に読み込まれる前にモジュールスクリプトが実行されます。おそらくこれはあなたが望んでいることではありません。 -::: - -### 処理の対象外にする - -Astroがスクリプトを処理しないようにするには、`is:inline`ディレクティブを追加します。 - -```astro title="src/components/InlineScript.astro" "is:inline" - -``` - -:::note -Astroは、状況によってはスクリプトタグを処理しません。特に、` - - - -``` - -#### 外部スクリプトをロードする - -**これを使うケース:** JavaScriptファイルが`public`ディレクトリに存在しているか、CDNの時。 - -プロジェクトの`src`フォルダ以外のスクリプトをロードするには、`is:inline`ディレクティブを含めます。このアプローチでは、上記のようにスクリプトをインポートする際にAstroが提供しているJavaScriptの処理・バンドル・最適化はスキップされます - -```astro title="src/components/ExternalScripts.astro" "is:inline" - - - - - -``` - -## 共通スクリプトパターン - -### `onclick`や他のイベントをハンドリングする - -いくつかのUIフレームワークでは`onclick={...}`(React/Preact)や`@click="..."`(Vue)のように独自の構文でイベントを処理しています。Astroは標準的なHTMLにより近く、イベントのために独自の構文は利用しません。 - -その代わりに、ユーザーのインタラクションをハンドリングするために` -``` - -:::note -ページに複数の``コンポーネントが存在する場合でも、Astroは複数回スクリプトを実行しません。スクリプトはページに1つしか含まれないようにバンドルされます。`querySelectorAll` を利用すると、このスクリプトはページ上で`alert`クラスを持つすべてのボタンにイベントリスナーをアタッチします。 -::: - -### カスタム要素を持つWebコンポーネント - -Webコンポーネント標準を使うことで独自の動作をするHTML要素を作成できます。`.astro`コンポーネントで[カスタム要素](https://developer.mozilla.org/ja/docs/Web/Web_Components/Using_custom_elements)を定義するとUIフレームワークライブラリを利用しなくてもインタラクティブなコンポーネントを作ることができます。 - -下の例では、ハートボタンがクリックされた回数を記録し、その最新のカウント数を``に更新する``HTML要素を新しく定義しています。 - -```astro title="src/components/AstroHeart.astro" - - - × 0 - - - -``` - -ここでカスタム要素を利用するメリットは2つあります。 - -1. `document.querySelector()`を使って全ページを検索する変わりに、`this.querySelector()`を使えば検索範囲が現在のカスタム要素のインスタンスに限られます。これにより、一回で一つのコンポーネントだけを操作しやすくなります。 -2. ` -``` - -これでコンポーネントは何度でも利用でき、異なるmessageを表示できます - -```astro title="src/pages/example.astro" ---- -import AstroGreet from '../components/AstroGreet.astro'; ---- - - - - - - - -``` - -:::tip[知っていましたか?] -この方法はReactなどのUIフレームワークを用いて書かれたコンポーネントにpropsを渡す際にAstroが裏で行っていることです!`client:*`ディレクティブを持つコンポーネントに対して、Astroは``カスタム要素に`props`属性を作成してサーバーサイドの`props`をHTML出力結果に保存します。 -::: diff --git a/src/content/docs/ja/guides/cms/buttercms.mdx b/src/content/docs/ja/guides/cms/buttercms.mdx deleted file mode 100644 index 3d0c173837d09..0000000000000 --- a/src/content/docs/ja/guides/cms/buttercms.mdx +++ /dev/null @@ -1,136 +0,0 @@ ---- -title: ButterCMSとAstro -description: ButterCMSを使ってコンテンツをAstroプロジェクトへ追加する -type: cms -service: ButterCMS -stub: false -i18nReady: true ---- -import PackageManagerTabs from '~/components/tabs/PackageManagerTabs.astro' - - - -[ButterCMS](https://buttercms.com/)は、プロジェクトで利用できる構造化されたコンテンツを公開可能なヘッドCMSとブログエンジンです。 - -## Astroとの連携 - -:::note -完全なブログサイトの例については、[Astro + ButterCMS スタータープロジェクト](https://buttercms.com/starters/astro-starter-project/)をご覧ください。 -::: - -このセクションでは、[ButterCMS SDK](https://www.npmjs.com/package/buttercms)を使ってデータをAstroプロジェクトに取り込む方法を解説します。 - -始めるには以下の手順に従ってください。 - -### 必須要件 - -1. **Astroプロジェクト** - もしAstroプロジェクトをまだ持っていない場合は、[自動CLIでAstroをインストール](/ja/install-and-setup/)を見ると、すぐに使い始めることができます。 - -2. **ButterCMSアカウント** - もしアカウントを持っていない場合は、無料トライアルとして[登録](https://buttercms.com/join/)できます。 - -3. **ButterCMS APIトークン** - [Settings](https://buttercms.com/settings/)ページからAPIトークンを見つけることができます。 - -### セットアップ - -1. `.env`ファイルをプロジェクトのルートディレクトリに作成し、環境変数にAPIトークンを追加します。 - - ```ini title=".env" - BUTTER_TOKEN=APIトークンをここに記載 - ``` - - :::tip - [環境変数](/ja/guides/environment-variables/)のAstroの`.env`ファイルについてをご覧ください。 - ::: - -2. ButterCMS SDKを依存関係としてインストールします。 - - - ```shell - npm install buttercms - ``` - - - ```shell - pnpm add buttercms - ``` - - - ```shell - yarn add buttercms - ``` - - - -3. プロジェクトに`src/lib/`を作り、そこへ`butter.cms.js`を作成します。 - - ```js title="src/lib/buttercms.js" - import Butter from "buttercms"; - - export const butterClient = Butter(import.meta.env.BUTTER_TOKEN); - ``` - -**これは、APIトークンを使用してSDKの認証を行い、プロジェクト全体で利用するためにエクスポートします。** - -### データを取得する - -コンテンツを取得するために、このクライアントをインポートして、その中の`retrieve`関数を使用します。 - -このサンプルでは、ショートテキストの`name`と数字の`price`、そしてWYSIWYGの`description`の3フィールドを持つ[コレクションを取得](https://buttercms.com/docs/api/#retrieve-a-collection)します。 - -```astro title="src/pages/ShopItem.astro" ---- -import { butterClient } from "../lib/buttercms"; -const response = await butterClient.content.retrieve(["shopitem"]); - -interface ShopItem { - name: string, - price: number, - description: string, -} - -const items = response.data.data.shopitem as ShopItem[]; ---- - - {items.map(item =>
-

{item.name} - ${item.price}

-

-
)} - -``` - -インターフェイスはフィールドタイプを反映しています。WYSIWYGの`description`フィールドはHTML文字列としてロードされ、[`set:html`](/ja/reference/directives-reference/#sethtml)を使い描画します。 - -同様に[ページを取得して](https://buttercms.com/docs/api/#get-a-single-page)フィールドを表示できます。 - -```astro title="src/pages/ShopItem.astro" ---- -import { butterClient } from "../lib/buttercms"; -const response = await butterClient.page.retrieve("*", "simple-page"); -const pageData = response.data.data; - -interface Fields { - seo_title: string, - headline: string, - hero_image: string, -} - -const fields = pageData.fields as Fields; ---- - - {fields.seo_title} - -

{fields.headline}

- - - -``` - -### もっと詳しく - -- [Astro + ButterCMS スタータープロジェクト](https://buttercms.com/starters/astro-starter-project/) -- [完全なButterCMS APIドキュメント](https://buttercms.com/docs/api/) -- ButterCMSの[JavaScriptガイド](https://buttercms.com/docs/api-client/javascript/) - -## コミュニティリソース - -- 追加してください! diff --git a/src/content/docs/ja/guides/cms/contentful.mdx b/src/content/docs/ja/guides/cms/contentful.mdx deleted file mode 100644 index b2d73d4a37b70..0000000000000 --- a/src/content/docs/ja/guides/cms/contentful.mdx +++ /dev/null @@ -1,575 +0,0 @@ ---- -title: ContentfulとAstro -description: ContentfulをCMSとして使ってコンテンツをAstroプロジェクトへ追加する -type: cms -service: Contentful -i18nReady: true ---- -import { FileTree } from '@astrojs/starlight/components'; -import PackageManagerTabs from '~/components/tabs/PackageManagerTabs.astro'; -import { Steps } from '@astrojs/starlight/components'; - - - -[Contentful](https://www.contentful.com/)はコンテンツの管理と他サービスとの連携、マルチプラットフォームへの公開が可能なヘッドレスCMSです。 - -## Astroとの連携 - -このセクションでは、[Contentful SDK](https://github.com/contentful/contentful.js)を使ってクライアントサイドJavaScriptを使わずにContentfulスペースとAstroを接続する方法を解説します。 - -### 必須要件 - -始めるには以下のものが必要です。 - -1. **Astroプロジェクト** - もしAstroプロジェクトをまだ持っていない場合は、[自動CLIでAstroをインストール](/ja/install-and-setup/)を見ると、すぐに使い始めることができます。 - -2. **ContentfulアカウントとContentfulスペース** - もしアカウントを持っていない場合は、フリーアカウントを[登録](https://www.contentful.com/sign-up/)できて、Contentfulスペースを作成できます。既に持っている場合は既存のスペースを利用できます。 - -3. **Contentfulクレデンシャル** - Contentfulダッシュボードの**Settings > API keys**から以下のクレデンシャルを見つけることができます。もしAPIキーが無い場合は、**Add API Key** を選択して追加してください。 - - - **Contentful space ID** - ContentfulスペースのID - - **Contentful delivery access token** - Contentfulスペースからpublishedコンテンツを利用するためのアクセストークン - - **Contentful preview access token** - Contentfulスペースからunpublishedコンテンツを利用するためのアクセストークン - -### クレデンシャルを設定する - -ContentfulスペースのクレデンシャルをAstroに追加するために、`.env`ファイルをプロジェクトのルートディレクトリに作成して環境変数に追加します。 - -```ini title=".env" -CONTENTFUL_SPACE_ID=スペースID -CONTENTFUL_DELIVERY_TOKEN=DELIVERY_TOKEN -CONTENTFUL_PREVIEW_TOKEN=PREVIEW_TOKEN -``` - -これで、プロジェクトでこれらの環境変数を利用できます。 - -もし、Contentfulの環境変数にインテリセンスをつけたい場合は、`src`ディレクトリに`env.d.ts`ファイルを作成して、`ImportMetaEnv`を以下のように設定します。 - -```ts title="src/env.d.ts" -interface ImportMetaEnv { - readonly CONTENTFUL_SPACE_ID: string; - readonly CONTENTFUL_DELIVERY_TOKEN: string; - readonly CONTENTFUL_PREVIEW_TOKEN: string; -} -``` -:::tip -[環境変数](/ja/guides/environment-variables/)のAstroの`.env`ファイルについてをご覧ください。 -::: - -ルートディレクトリは以下のように作成したファイル含まれているはずです。 - - -- src/ - - **env.d.ts** -- **.env** -- astro.config.mjs -- package.json - - -### 依存関係をインストールする - -Contentfulスペースと接続するために、次の中から好みのパッケージマネージャの1つのコマンドを利用して、以下の両方のパッケージをインストールします。 -- [`contentful.js`](https://github.com/contentful/contentful.js), Contentful公式のJavaScript用SDKです。 -- [`rich-text-html-renderer`](https://github.com/contentful/rich-text/tree/master/packages/rich-text-html-renderer), ContentfulのリッチテキストフィールドをHTMLに描画するためのパッケージです。 - - - - ```shell - npm install contentful @contentful/rich-text-html-renderer - ``` - - - ```shell - pnpm add contentful @contentful/rich-text-html-renderer - ``` - - - ```shell - yarn add contentful @contentful/rich-text-html-renderer - ``` - - - -次に、プロジェクトの`src/lib`に`contentful.ts`というファイルを作成します。 - -```ts title="src/lib/contentful.ts" -import contentful from "contentful"; - -export const contentfulClient = contentful.createClient({ - space: import.meta.env.CONTENTFUL_SPACE_ID, - accessToken: import.meta.env.DEV - ? import.meta.env.CONTENTFUL_PREVIEW_TOKEN - : import.meta.env.CONTENTFUL_DELIVERY_TOKEN, - host: import.meta.env.DEV ? "preview.contentful.com" : "cdn.contentful.com", -}); - -``` - -上記のコードスニペットはContentfulクライアントを作成し、`.env`ファイルからクレデンシャルを渡しています。 - -:::caution -開発中の間は、コンテンツは**Contentful preview API**から取得します。これはunpublishedのコンテンツをContentfulウェブアプリから閲覧できることを意味します。 - -ビルド時には、コンテンツは**Contentful delivery API**から取得します。。これはビルド時にpublishedのコンテンツだけ取得することを意味します。 -::: - -最終的にルートディレクトリは作成したファイルが以下のように含まれています。 - - -- src/ - - env.d.ts - - lib/ - - **contentful.ts** -- .env -- astro.config.mjs -- package.json - - -### 取得するデータ - -Astroコンポーネントは`contentfulClient`を使ってデータを取得でき、Contentfulアカウントから受信する`content_type`を指定できます。 - -例えば、もしタイトルのテキストフィールドとコンテンツのリッチテキストフィールドを持つ`blogPost`コンテンツタイプがある場合、コンポーネントは以下のようになります。 - -```astro ---- -import { contentfulClient } from "../lib/contentful"; -import { documentToHtmlString } from "@contentful/rich-text-html-renderer"; -import type { EntryFieldTypes } from "contentful"; - -interface BlogPost { - contentTypeId: "blogPost", - fields: { - title: EntryFieldTypes.Text - content: EntryFieldTypes.RichText, - } -} - -const entries = await contentfulClient.getEntries({ - content_type: "blogPost", -}); ---- - - {entries.items.map((item) => ( -
-

{item.fields.title}

-
-
- ))} - -``` - -:::tip -もしContentfulスペースが空の場合、コンテンツの基本ブログ型の作成方法は [Contentfulモデルのセットアップ](#contentfulモデルのセットアップ)を確認してください。 -::: - -[Contentful documentation](https://contentful.github.io/contentful.js/)からより多くのクエリオプションを見つけることができます。 - -## AstroとContentfulを利用してブログを作成する - -上記セットアップで、ContentfulをCMSとして利用するブログが作成できるようになりました。 - -### 必須要件 - -1. **Contentfulスペース** - 本チュートリアルは空のスペースから始めることをお勧めします。既にコンテンツモデルを持っている場合は、そのままコンテンツを使えますが、コードスニペットをコンテンツに合わせた修正が必要になります。 -2. **[Contentful SDK](https://github.com/contentful/contentful.js)と連携されたAstroプロジェクト** - より多くのAstroプロジェクトとContentfulのセットアップ方法を知りたい場合は、 [Astroとの連携](#astroとの連携)をご覧ください。 - -### Contentfulモデルのセットアップ - -Contenfulスペースの内の**Content model**セクションで、以下のフィードと値を持つモデルを作成します。 - -- **Name:** ブログ記事 -- **API identifier:** `blogPost` -- **Description:** ブログ記事のコンテンツタイプです。 - -コンテンツタイプを作成したら、**Add Field**ボタンを使い以下のパラメータを持つフィールドを5つ追加します。 - -1. テキストフィールド(Text field) - - **Name:** タイトル - - **API identifier:** `title` - (leave the other parameters as their defaults) -2. 日時フィールド(Date and time field) - - **Name:** 日時 - - **API identifier:** `date` -3. テキストフィールド(Text field) - - **Name:** スラッグ - - **API identifier:** `slug` - (他のパラメータはデフォルトのまま残しておきます) -4. テキストフィールド(Text field) - - **Name:** 説明 - - **API identifier:** `description` -5. リッチテキストフィールド(Rich text field) - - **Name:** コンテンツ - - **API identifier:** `content` - -**Save**を押して変更を保存します。 - -Contentfulスペースの**Content**セクションで、**Add Entry**ボタンを押して新しいエントリーを作成します。そして、以下のようにフィールドを埋めます。 - -- **Title:** `Astro is amazing!` -- **Slug:** `astro-is-amazing` -- **Description:** `Astro is a new static site generator that is blazing fast and easy to use.` -- **Date:** `2022-10-05` -- **Content:** `This is my first blog post!` - -**Publish** -**Publish**を押してエントリーを保存します。これではじめてのブログ記事ができました。 - -より多くのブログ記事を書いてから、お気に入りのエディターに切り替えてAstroを使ってハッキングを始めましょう! - -### ブログ記事のリストを表示する - -`BlogPost`というインターフェイスを作成し`src/lib`に`contentful.ts`というファイルを追加してください。このインターフェイスはContentfulのブログ記事のコンテンツタイプと一致します。ブログエントリーのレスポンスと型を一致させるときに利用します。 - -```ts title="src/lib/contentful.ts" ins=", { EntryFieldTypes }" ins={3-12} -import contentful, { EntryFieldTypes } from "contentful"; - -export interface BlogPost { - contentTypeId: "blogPost", - fields: { - title: EntryFieldTypes.Text - content: EntryFieldTypes.RichText, - date: EntryFieldTypes.Date, - description: EntryFieldTypes.Text, - slug: EntryFieldTypes.Text - } -} - -export const contentfulClient = contentful.createClient({ - space: import.meta.env.CONTENTFUL_SPACE_ID, - accessToken: import.meta.env.DEV - ? import.meta.env.CONTENTFUL_PREVIEW_TOKEN - : import.meta.env.CONTENTFUL_DELIVERY_TOKEN, - host: import.meta.env.DEV ? "preview.contentful.com" : "cdn.contentful.com", -}); -``` - -次に、Contentfulからデータを取得するAstroページを見てみましょう。`src/pages/`にある`index.astro`のサンプルをホームページとして使います。 - -`BlogPost`インターフェイスと`src/lib/contentful.ts`から`contentfulClient`をインポートします。 - -Contentfulからコンテンツタイプが`blogPost`のすべてのエントリーを取得して、レスポンスを作成するために`BlogPost`インターフェイスを渡します。 - -```astro title="src/pages/index.astro" ---- -import { contentfulClient } from "../lib/contentful"; -import type { BlogPost } from "../lib/contentful"; - -const entries = await contentfulClient.getEntries({ - content_type: "blogPost", -}); ---- -``` - -これで`entries.items`にブログ記事が配列として返ってきます。返ってきたデータのフォーマットを変えるために`map()`を使い新しい配列(`posts`)を作成します。 - -以下の例は、コンテンツモデルから`items.fields`プロパティを返してブログ記事のプレビューを作成して、同時に日付を読みやすいフォーマットに整形しています。 - -```astro title="src/pages/index.astro" ins={9-17} ---- -import { contentfulClient } from "../lib/contentful"; -import type { BlogPost } from "../lib/contentful"; - -const entries = await contentfulClient.getEntries({ - content_type: "blogPost", -}); - -const posts = entries.items.map((item) => { - const { title, date, description, slug } = item.fields; - return { - title, - slug, - description, - date: new Date(date).toLocaleDateString() - }; -}); ---- -``` - -最後に、それぞれのブログ記事のプレビューを表示するためにテンプレートに`posts`を利用します。 - -```astro astro title="src/pages/index.astro" ins={19-37} ---- -import { contentfulClient } from "../lib/contentful"; -import type { BlogPost } from "../lib/contentful"; - -const entries = await contentfulClient.getEntries({ - content_type: "blogPost", -}); - -const posts = entries.items.map((item) => { - const { title, date, description, slug } = item.fields; - return { - title, - slug, - description, - date: new Date(date).toLocaleDateString() - }; -}); ---- - - - My Blog - - -

My Blog

-
    - {posts.map((post) => ( -
  • - -

    {post.title}

    -
    - -

    {post.description}

    -
  • - ))} -
- - -``` - -### 個別にブログ記事を生成する - -上記のようにContentfulからデータを取得しますが、今回は書くブログ記事のためにユニークなページルーティングを作成します。 - -#### 静的サイトジェネレーター - -Astroのデフォルト静的モードを利用している場合、[動的ルーティング](/ja/guides/routing/#動的ルーティング)と`getStaticPaths()`関数を使えます。この関数はビルド時に呼ばれて、ページとなるパスのリストを生成します。 - -`src/pages/posts`に`[slug].astro`というファイルを作成します。 - -`index.astro`でやったように、`BlogPost`インターフェイスと`src/lib/contentful.ts`にある`contentClient`をインポートします。 - -これで、`getStaticPaths()`関数内でデータを取得できます。 - -```astro title="src/pages/posts/[slug].astro" ---- -import { contentfulClient } from "../../lib/contentful"; -import type { BlogPost } from "../../lib/contentful"; - -export async function getStaticPaths() { - const entries = await contentfulClient.getEntries({ - content_type: "blogPost", - }); -} ---- -``` - -そして、各アイテムを`params`と`props`プロパティを持つオブジェクトへマッピングさせます。`params`プロパティはページURLを生成するために使用され、`props`プロパティはページコンポーネントへpropsとして渡されます。 - -```astro title="src/pages/posts/[slug].astro" ins={3,11-19} ---- -import { contentfulClient } from "../../lib/contentful"; -import { documentToHtmlString } from "@contentful/rich-text-html-renderer"; -import type { BlogPost } from "../../lib/contentful"; - -export async function getStaticPaths() { - const entries = await contentfulClient.getEntries({ - content_type: "blogPost", - }); - - const pages = entries.items.map((item) => ({ - params: { slug: item.fields.slug }, - props: { - title: item.fields.title, - content: documentToHtmlString(item.fields.content), - date: new Date(item.fields.date).toLocaleDateString(), - }, - })); - return pages; -} ---- -``` - -`params`内のプロパティは動的ルーティングの名前と一致させる必要があります。ファイル名が`[slug].astro`であるため、`slug`を利用します。 - -このサンプルで、`props`オブジェクトはページに対して以下の3つのプロパティを渡しています。 - -- title (文字列) -- content (`documentToHtmlString`を使ってHTMLに変換されたリッチテキストドキュメント) -- date (`Date`コンストラクタを使ってフォーマットされた日付) - -最後に、ブログ記事を表示するためにページの`props`を利用します。 - -```astro title="src/pages/posts/[slug].astro" ins={21,23-32} ---- -import { contentfulClient } from "../../lib/contentful"; -import { documentToHtmlString } from "@contentful/rich-text-html-renderer"; -import type { BlogPost } from "../../lib/contentful"; - -export async function getStaticPaths() { - const { items } = await contentfulClient.getEntries({ - content_type: "blogPost", - }); - const pages = items.map((item) => ({ - params: { slug: item.fields.slug }, - props: { - title: item.fields.title, - content: documentToHtmlString(item.fields.content), - date: new Date(item.fields.date).toLocaleDateString(), - }, - })); - return pages; -} - -const { content, title, date } = Astro.props; ---- - - - {title} - - -

{title}

- -
- - -``` - -http://localhost:4321/ にアクセスしていずれかの投稿をクリックすると動的ルーティングが動作していることが分かります! - -#### サーバーサイドレンダリング - -[プロジェクトでSSRを有効にする](/ja/guides/on-demand-rendering/)場合、Contentfulデータを取得するために動的ルーティングで `slug` パラメータが利用されます。 - -`src/pages/posts`に`[slug].astro`を作成します。URLからスラッグを取得するために[`Astro.params`](/ja/reference/api-reference/#params)を使って、以下のように`getEntries`に渡してあげます。 - -```astro title="src/pages/posts/[slug].astro" ---- -import { contentfulClient } from "../../lib/contentful"; -import type { BlogPost } from "../../lib/contentful"; - -const { slug } = Astro.params; - -const data = await contentfulClient.getEntries({ - content_type: "blogPost", - "fields.slug": slug, -}); ---- -``` - -もしエントリーが見つからない場合は、 [`Astro.redirect`](/ja/guides/routing/#動的ルーティング)を使ってユーザーを404ページにリダイレクトできます。 - -```astro title="src/pages/posts/[slug].astro" ins={7, 12-13} ---- -import { contentfulClient } from "../../lib/contentful"; -import type { BlogPost } from "../../lib/contentful"; - -const { slug } = Astro.params; - -try { - const data = await contentfulClient.getEntries({ - content_type: "blogPost", - "fields.slug": slug, - }); -} catch (error) { - return Astro.redirect("/404"); -} ---- -``` - -テンプレートセクションで記事データを渡すには、`try/catch`ブロックの外に`post`オブジェクトを作成します。 - -ドキュメントの`content`をHTMLに変換するために`documentToHtmlString()`を使って、日付を成形するためにDateコンストラクターを利用します。`title`はそのままで大丈夫です。そしてこれらのプロパティを`post`オブジェクトに追加します。 - -```astro title="src/pages/posts/[slug].astro" ins={7,14-19} ---- -import Layout from "../../layouts/Layout.astro"; -import { contentfulClient } from "../../lib/contentful"; -import { documentToHtmlString } from "@contentful/rich-text-html-renderer"; -import type { BlogPost } from "../../lib/contentful"; - -let post; -const { slug } = Astro.params; -try { - const data = await contentfulClient.getEntries({ - content_type: "blogPost", - "fields.slug": slug, - }); - const { title, date, content } = data.items[0].fields; - post = { - title, - date: new Date(date).toLocaleDateString(), - content: documentToHtmlString(content), - }; -} catch (error) { - return Astro.redirect("/404"); -} ---- -``` - -最後にテンプレートセクションにブログ記事を表示するために`post`を参照します。 - -```astro title="src/pages/posts/[slug].astro" ins={24-33} ---- -import Layout from "../../layouts/Layout.astro"; -import { contentfulClient } from "../../lib/contentful"; -import { documentToHtmlString } from "@contentful/rich-text-html-renderer"; -import type { BlogPost } from "../../lib/contentful"; - -let post; -const { slug } = Astro.params; -try { - const data = await contentfulClient.getEntries({ - content_type: "blogPost", - "fields.slug": slug, - }); - const { title, date, content } = data.items[0].fields; - post = { - title, - date: new Date(date).toLocaleDateString(), - content: documentToHtmlString(content), - }; -} catch (error) { - return Astro.redirect("/404"); -} ---- - - - {post?.title} - - -

{post?.title}

- -
- - -``` - -### サイトを公開する - -ウェブサイトをデプロイするために、[デプロイガイド](/ja/guides/deploy/)へアクセスして好みのホスティングプロバイダーにあわせた説明に従ってください。 - -#### Contentfulの変更時に再ビルドする - -もしプロジェクトがAstroのデフォルトである静的モードを使っている場合、コンテンツを変更した時に新しいビルドを行うトリガーをするためのWebhookをセットアップする必要があります。もしNetlifyかVercelをホスティングプロバイダーとして使っている場合、コンテンツイベントから新しいビルドをトリガーするためにWebhook機能を使えます。 - -##### Netlify - -NetlifyのWebhookをセットアップするためには以下の手順が必要です。 - - -1. ダッシュボードに行き、**Build & deploy**をクリックします。 - -2. **Continuous Deployment**タブから、**Build hooks** セクションを探し**Add build hook**をクリックします。 - -3. Webhookの名前を指定してビルド時にトリガーされるブランチを選択します。**Save**をクリックし生成されたURLをコピーします。 - - -##### Vercel - -VercelのWebhookをセットアップするためには以下の手順が必要です。 - - -1. ダッシュボードへ行き、**Settings**をクリックします。 - -2. **Git**タブから、**Deploy Hooks**セクションを見つけます。 - -3. Webhookの名前を指定してビルド時にトリガーされるブランチを選択します。**Add**をクリックして生成されたURLをコピーします。 - - -##### ContentfulにWebhookを追加する - -Contentfulスペースの**settings**で、**Webhooks**タブをクリックして**Add Webhook**ボタンをクリックしてWebhookを作成します。Webhookの名前を指定して、前のセクションでコピーしたWebhook URLをペーストします。最後に**Save**をクリックしてWebhookを作成します。 - -これで、Contentfulでブログ記事を作成しても、新しいビルドがトリガーされブログが更新されます。 diff --git a/src/content/docs/ja/guides/cms/index.mdx b/src/content/docs/ja/guides/cms/index.mdx deleted file mode 100644 index 94571ebfa864f..0000000000000 --- a/src/content/docs/ja/guides/cms/index.mdx +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: AstroでCMSを利用する -description: CMSを利用してコンテンツをAstroへ追加する -i18nReady: true ---- -import CMSGuidesNav from '~/components/CMSGuidesNav.astro'; - - - -**ヘッドレスCMSをAstroプロジェクトに接続する準備はできましたか?** ここでは、CMSを導入するための方法を紹介します。 - -:::tip -CMSをプロジェクトに接続するための[コミュニティ製のインテグレーション](https://astro.build/integrations/?search=cms)を、インテグレーションディレクトリで探してみましょう。 -::: - -## CMSガイド - -各ページの多くは**未完成**なので注意してください。未完成のページへの貢献をお待ちしています! - - - -## なぜCMSを使うのか? - -コンテンツ管理システムはAstroプロジェクト外でコンテンツの投稿・アセットの管理できます。 - -これによって、コンテンツを扱う新しい機能を使えるようになります。ほとんどのCMSはビジュアルコンテンツエディター、標準的なコンテンツの種類を指定する機能、他の人との共同作業などの機能を提供しています。 - -CMSは特定の構造に従ったコンテンツで役立ちます。多くの場合はダッシュボードのような操作性とWYSIWYGエディターツールを提供します。 -CMSはMarkdownファイルの代わりとなるCMSのリッチテキストエディターを使ってブログ記事を書けます。もしくは、CMSを利用してEコマースショップの商品リストを管理して、不完全なリストを除外するために特定のフィールドを必須項目にできます。 - -AstroプロジェクトはCMSからコンテンツを取得して、自分のサイト上の好きな場所に好きなように表示できます。 - -## Astroと相性の良いCMS - -Astroはコンテンツの表現に責任を持つため、上記リストにあるヘッドレスCMSを選択することをお勧めします。つまり、CMSはコンテンツ作成を補助しますが、コンテンツを表示するサイトを生成することはありません。代わりに、コンテンツデータを取得し、Astroプロジェクトで使用します。 - -StoryblokのようないくつかのヘッドレスCMSは、Astroサイト向けのコンテンツの取得を支援するAstro[インテグレーション](/ja/guides/integrations-guide/)を提供しています。また、自分でインストールし、リモートコンテンツを取得するために使用するJavaScript SDKを提供しているサービスもあります。 - -## CMS無しでAstroを利用できますか? - -もちろんです。AstroはMarkdownページのサポートを含むコンテンツをオーサリングするためのビルド方法を提供しています。 diff --git a/src/content/docs/ja/guides/cms/storyblok.mdx b/src/content/docs/ja/guides/cms/storyblok.mdx deleted file mode 100644 index 1c796c44c1c90..0000000000000 --- a/src/content/docs/ja/guides/cms/storyblok.mdx +++ /dev/null @@ -1,487 +0,0 @@ ---- -title: StoryblokとAstro -description: StoryblokをCMSとして使ってコンテンツをAstroプロジェクトへ追加する -type: cms -service: Storyblok -stub: false ---- -import PackageManagerTabs from '~/components/tabs/PackageManagerTabs.astro' - - - -[Storyblok](https://www.storyblok.com/)はブロックと呼ばれる再利用可能なコンポーネントを作成してコンテンツを管理するコンポーネントベースのヘッドレスCMSです。 - -## Astroとの連携 - -このセクションでは、[Storyblok integration](https://github.com/storyblok/storyblok-astro)を利用してStoryblokとAstroを接続します。 - -### 必須要件 - -始めるには、以下の手順を行っている必要があります。 - -1. **Astroプロジェクト** - もしAstroプロジェクトをまだ持っていない場合は、[自動CLIでAstroをインストール](/ja/install-and-setup/)を見ると、すぐに使い始めることができます。 - -2. **Storyblok**アカウントとスペース - もしアカウントを持っていない場合は、[無料で登録](https://app.storyblok.com/#/signup)してスペースを作成します。 - -3. **Storyblok APIトークン** - Storyblokスペースの設定内のアクセストークンタブからAPIトークンを生成できます。 - - **Preview token** - これは開発中にドラフトもしくは未公開バージョンのコンテンツを取得するために使います。 - - **Public token** - これは製品版でビルド時に公開済みのコンテンツを取得するために使います。 - -### クレデンシャルをセットアップする - -AstroへStoryblokのクレデンシャルを追加するために、`.env`ファイルをプロジェクトのルートディレクトリに作成して環境変数に追加します。 - -```ini title=".env" -STORYBLOK_PREVIEW_TOKEN=YOUR_PREVIEW_TOKEN -STORYBLOK_PUBLIC_TOKEN=YOUR_PUBLIC_TOKEN -``` - -これで、プロジェクトでこれらの環境変数を利用できます。 - -ルートディレクトリは以下のように作成したファイル含まれているはずです。 - -```ini title="Project Structure" ins={2} -├── src/ -├── .env -├── astro.config.mjs -└── package.json -``` - -### 依存関係をインストールする - -AstroとStoryblokスペースを接続するために、次の中から好みのパッケージマネージャの1つのコマンドを実行して公式の[Storyblok integration](https://github.com/storyblok/storyblok-astro)をインストールします。 - - - - ```shell - npm install @storyblok/astro - ``` - - - ```shell - pnpm add @storyblok/astro - ``` - - - ```shell - yarn add @storyblok/astro - ``` - - - -### Storyblokを設定する - -Astro設定ファイルにStoryblokとの接続が含まれるように以下のように修正します。 - -```js title="astro.config.mjs" -import { defineConfig } from 'astro/config'; -import storyblok from '@storyblok/astro'; -import { loadEnv } from 'vite'; - -const env = loadEnv(import.meta.env.MODE, process.cwd(), 'STORYBLOK'); - -export default defineConfig({ - integrations: [ - storyblok({ - accessToken: - import.meta.env.MODE === 'development' - ? env.STORYBLOK_PREVIEW_TOKEN - : env.STORYBLOK_PUBLIC_TOKEN, - components: { - // Add your components here - }, - apiOptions: { - // Choose your Storyblok space region - region: 'us', - }, - }) - ], -}); -``` - -Storyblokとの接続には以下のプロパティを持つオブジェクトを必要とします。 - -1. `accessToken` - これは、前述で追加したStoryblok APIトークンへの参照です。この例では開発時はpreview tokenを使い、製品版ではpublic tokenを使います。 - - :::tip - Astro設定ファイルは環境変数をサポートしないため、環境変数をロードするためにViteの`loadEnv()`関数を使います。 - ::: - -2. `components` - Storyblokのコンポーネント名をローカルコンポーネントへのパスへマッピングするオブジェクトです。StoryblokコンポーネントをAstroへ描画するときに必須となります。 - - :::note - このコンポネントパスは`src`ディレクトリからの相対パスです。 - ::: - -3. `apiOptions` - [Storyblok API options](https://github.com/storyblok/storyblok-astro#options)を含むオブジェクトです。 - - :::caution - デフォルトのリージョンは`eu`です。もしStoryblokがUSリージョンで作成された場合は、`region:us`と設定する必要があります。 - ::: - -### ブロックをAstroコンポーネントに接続する - -ブロックをAstroへ接続するために、`src`ディレクトリに`storyblok`という名のフォルダーを作成します。このフォルダーには全てのStoryblokのブロックライブラリに対応するAstroコンポネントが含まれます。 - -例えば、以下のフィールドを持つ`blogPost`というブロックコンテンツがブロックライブラリにある場合を解説します。 - -- `title` - テキストフィールド -- `description` - テキストフィールド -- `content` - リッチテキストフィールド - -目標は、このフィールドを使ってコンテンツに描画するようなAstroコンポーネントを作成する事です。これを実現するために、以下のように`src/storyblok`ディレクトリに`BlogPost.astro`というファイルを作成します。 - -```astro title="src/storyblok/BlogPost.astro" ---- -import { storyblokEditable, renderRichText } from '@storyblok/astro' - -const { blok } = Astro.props -const content = renderRichText(blok.content) ---- - -
-

{blok.title}

-

{blok.description}

- -
-``` - -`blok`プロパティーにはStoryblokから受信するデータがが含まれます。Storyblokの`blogPost`ブロックで定義したフィールドの値が含まれます。 - -コンテンツを描画するためには、インテグレーションは以下のようなユーティリティ関数を提供しています。 - -- `storyblokEditable` - Stroyblokでこれらを編集可能にするために、必要に応じて要素へ属性を追加します。 -- `renderRichText` - リッチテキストフィールドをHTMLに変換します。 - -ルートディレクトリは以下のように作成したファイル含まれているはずです。 - -```ini title="Project Structure" ins={3} -├── src/ -│ └── storyblok/ -│ └── BlogPost.astro -├── .env -├── astro.config.mjs -└── package.json -``` - -最後に、`blogPost`ブロックを`BlogPost`コンポーネントへ接続するために、Astro設定ファイルのコンポーネントオブジェクトにプロパティを追加します。キーはブロック名で、値はコンポーネントへのパスです。 - -```js title="astro.config.mjs" ins={15} -import { defineConfig } from 'astro/config'; -import storyblok from '@storyblok/astro'; -import { loadEnv } from 'vite'; - -const env = loadEnv(import.meta.env.MODE, process.cwd(), 'STORYBLOK'); - -export default defineConfig({ - integrations: [ - storyblok({ - accessToken: - import.meta.env.MODE === 'development' - ? env.STORYBLOK_PREVIEW_TOKEN - : env.STORYBLOK_PUBLIC_TOKEN, - components: { - blogPost: 'storyblok/BlogPost', - }, - apiOptions: { - region: 'us', - }, - }) - ], -}); -``` - -### データを取得する - -セットアップしたものをテストするために、`blogPost`コンテンツで`test-post`という名前のストーリーをStoryblokで作成します。 - -Astroでは、以下のコンテンツの`test-post.astro`という名前のページを`src/pages`に作成します。 - -```astro title="pages/test-post.astro" ---- -import { useStoryblokApi } from '@storyblok/astro' -import StoryblokComponent from '@storyblok/astro/StoryblokComponent.astro' - -const storyblokApi = useStoryblokApi() - -const { data } = await storyblokApi.get("cdn/stories/test-post", { - version: import.meta.env.DEV ? "draft" : "published", -}); - -const content = data.story.content; ---- - -``` - -データ問い合わせをするために、`useStoryblokApi`フックを利用します。これは連携設定を利用して新しいクライアントインスタンスを初期化します。 - -コンテンツを描画するために、ストーリーの`content`プロパティを`blok`として`StoryblokComponent`へ渡します。このコンポーネントは`content`プロパティ内で定義されたブロックを描画します。この例では、BlogPostコンポーネントを描画します。 - -## ブログをAstroとStoryblokで作る - -連携のセットアップが終われば、AstroとStoryblokを使ったブログを作成できます。 - -### 必須要件 - -1. **Storyblokスペース** - 子のチュートリアルでは、新しいスペースを作ることをお勧めします。もしすでにブロックを含むスペースがある場合は、そのまま利用できますが、ブロック名とコンテンツタイプに合わせコードを修正する必要があります。 - -2. **Storyblokと連携したAstroプロジェクト** - 連携するためのセットアップ方法を知るには[Astroとの連携](#astroとの連携)を参照ください。 - -### ブロックライブラリを作成する - -Blokを作成するためには、Storyblokアプリの**ライブラリをブロック**をクリックします。+ 新規ブロックボタンをクリックして以下のブロックを作成します。 - -1. `blogPost` - 以下のフィールドを持つコンテンツタイプブロックです。 - - `title` - テキストフィールド - - `description` - テキストフィールド - - `content` - リッチテキストフィールド - -2. `blogPostList` - 空のNestable Blokです。 - -3. `page` - 以下のフィールドを持つコンテンツタイプブロックです。 - - `body` - ネスト可能なBlokフィールド - -### コンテンツを作成する - -コンテンツを追加するために、**コンテンツ**タブをクリックしてコンテンツセクションへ移動します。前のステップで作成したブロックライブラリを使って以下のストーリーを追加します。 - -1. `home` - `page`ブロックを使ったコンテンツタイプを持つストーリーです。`body`フィールド内には`blogPostList`ブロックを追加します。 - -2. `blog/no-javascript` - ブログフォルダー内の`blogPost`コンテンツタイプを持つストーリーです。 - - ```yaml - title: No JavaScript - description: A sample blog post - content: Hi there! This blog post doesn't use JavaScript. - ``` - -3. `blog/astro-is-amazing` - ブログフォルダー内の`blogPost`コンテンツタイプを持つストーリーです。 - - ```yaml - title: Astro is amazing - description: We love Astro - content: Hi there! This blog post was build with Astro. - ``` - -これでコンテンツの準備は整いました。Astroプロジェクトに切り替えてブログの構築を始めましょう。 - -### ブロックをコンポーネントへ接続する - -新しく作成したブロックをAstroコンポーネントへ接続するには、`src`ディレクトリに`storyblok`と呼ばれるフォルダを作成して以下のファイルを追加します。 - -`Page.astro`は、`page`ブロックの`body`プロパティ内の全てのブロックを再帰的に描画するネスト可能なBlokコンテンツタイプのコンポーネントです。また、親要素に`storyblokEditable`を追加し、Storyblokでページを編集できるようにします。 - -```astro title="src/storyblok/Page.astro" ---- -import { storyblokEditable } from '@storyblok/astro' -import StoryblokComponent from '@storyblok/astro/StoryblokComponent.astro' -const { blok } = Astro.props ---- - -
- { - blok.body?.map((blok) => { - return - }) - } -
-``` - -`BlogPost.astro`は`blogPost`ブロックの`title`と`description`と`content`プロパティを描画します。 - -リッチテキストフィールドプロパティの`content`をHTMLに変換するために`renderRichText`関数を利用します。 - -```astro title="src/storyblok/BlogPost.astro" ---- -import { storyblokEditable, renderRichText } from '@storyblok/astro' -const { blok } = Astro.props -const content = renderRichText(blok.content) ---- -
-

{blok.title}

-

{blok.description}

- -
-``` - -`BlogPostList.astro`はブログ記事のリストプレビューを描画するNestable Blokコンテンツタイプです。 - -これは`useStoryblokApi`フックを利用して`blogPost`のコンテンツタイプのストーリー全てを取得します。クエリパラメータの`version`を利用して、開発モードではストーリーのドラフトを、製品番ビルドの時は公開されたバージョンを取得します。 - -```astro title="src/pages/blogPostList.astro" ---- -import { useStoryblokApi } from '@storyblok/astro' - -const storyblokApi = useStoryblokApi(); -const { data } = await storyblokApi.get('cdn/stories', { - version: import.meta.env.DEV ? "draft" : "published", - content_type: 'blogPost', -}) -const posts = data.stories.map(story => { - return { - title: story.content.title, - date: new Date(story.published_at).toLocaleDateString("en-US", {dateStyle: "full"}), - description: story.content.description, - slug: story.full_slug, - } -}) ---- -

My blog

-
    - {posts.map(post => ( -
  • - - {post.title} -

    {post.description}

    -
  • - ))} -
-``` - -最後に、`astro.config.mjs`ファイルの`components`プロパティに作成したコンポーネントを追加します。各キーはStoryblok内のブロック名で、値は`src`からのコンポーネントの相対パスです。 - -```js title="astro.config.mjs" ins={15-17} -import { defineConfig } from 'astro/config'; -import storyblok from '@storyblok/astro'; -import { loadEnv } from 'vite'; - -const env = loadEnv(import.meta.env.MODE, process.cwd(), 'STORYBLOK'); - -export default defineConfig({ - integrations: [ - storyblok({ - accessToken: - import.meta.env.MODE === 'development' - ? env.STORYBLOK_PREVIEW_TOKEN - : env.STORYBLOK_PUBLIC_TOKEN, - components: { - blogPost: 'storyblok/BlogPost', - blogPostList: 'storyblok/BlogPostList', - page: 'storyblok/Page', - }, - apiOptions: { - region: 'us', - }, - }) - ], -}); -``` - -### ページを生成する - -#### 静的サイトジェネレーター - -Astroのデフォルト静的モードを利用している場合、[動的ルーティング](/ja/guides/routing/#動的ルーティング)と`getStaticPaths()`関数を使えます。この関数はビルド時に呼ばれて、ページとなるパスのリストをせいせいします。 - -`src/pages`に`[…slug].astro`という以下のファイルを作成します。 - -```astro title="src/pages/[...slug].astro" ---- -import { useStoryblokApi } from '@storyblok/astro' -import StoryblokComponent from '@storyblok/astro/StoryblokComponent.astro' - -export async function getStaticPaths() { - const storyblokApi = useStoryblokApi() - const { data } = await storyblokApi.get("cdn/stories", { - version: import.meta.env.DEV ? "draft" : "published", - }); - const pages = data.stories.map(story => { - return { - params: { - slug: story.full_slug === 'home' ? undefined : story.full_slug - }, - props: { - content: story.content - } - } - }) - return pages -} -const { content } = Astro.props ---- - - - Storyblok & Astro - - - - - -``` - -これはStoryblok APIから取得したスラッグとコンテンツを含む各ストーリーのページを生成します。もしストーリーのスラッグが`home`だった場合、undefinedのスラッグを返し`/`ルーティングを生成します。 - -#### サーバーサイドレンダリング - -[プロジェクトでSSRを有効にする](/ja/guides/on-demand-rendering/)場合、Storyblokデータを取得するために動的ルーティングで `slug` パラメータが利用されます。 - -```astro title="src/pages/[...slug].astro" ---- -import { useStoryblokApi } from '@storyblok/astro' -import StoryblokComponent from '@storyblok/astro/StoryblokComponent.astro' -const storyblokApi = useStoryblokApi() -const slug = Astro.params.slug === undefined ? "home" : Astro.params.slug -let content; -try { - const { data } = await storyblokApi.get(`cdn/stories/${slug}`, { - version: import.meta.env.DEV ? "draft" : "published", - }); - content = data.story.content -} catch (error) { - return Astro.redirect('/404') -} ---- - - - Storyblok & Astro - - - - - -``` - -このファイルは動的な`slug`パラメータと一致するページデータをStoryblokから取得して描画します。 -もし見つからない場合は、404ページへリダイレクトします。 - -### サイトを公開する - -ウェブサイトをデプロイするために、[デプロイガイド](/ja/guides/deploy/)へアクセスして好みのホスティングプロバイダーにあわせた説明に従ってください。 - -#### Storyblokの変更時に再ビルドする - -もしプロジェクトがAstroのデフォルトである静的モードを使っている場合、コンテンツを変更した時に新しいビルドを行うトリガーをするためのWebhookをセットアップする必要があります。もしNetlifyかVercelをホスティングプロバイダーとして使っている場合、コンテンツイベントから新しいビルドをトリガーするためにWebhook機能を使えます。 - -##### Netlify - -NetlifyのWebhookをセットアップするためには以下の手順が必要です。 - -1. ダッシュボードに行き、**Build & deploy**をクリックします。 - -2. **Continuous Deployment**タブから、**Build hooks** セクションを探し**Add build hook**をクリックします。 - -3. Webhookの名前を指定してビルド時にトリガーされるブランチを選択します。**Save**をクリックし生成されたURLをコピーします。 - -##### Vercel - -VercelのWebhookをセットアップするためには以下の手順が必要です。 - -1. ダッシュボードへ行き、**Settings**をクリックします。 - -2. **Git**タブから、**Deploy Hooks**セクションを見つけます。 - -3. Webhookの名前を指定してビルド時にトリガーされるブランチを選択します。**Add**をクリックして生成されたURLをコピーします。 - -##### StoryblokにWebhookを追加する - -Storyblokスペースの**Settings**から、**Webhooks**タブをクリックします。**Story published & unpublished**ボックスにWebhook URLをペーストします。保存を押してWebhookを作成します。 - -これで、新しいストーリーを公開しても、新しいビルドがトリガーされブログが更新されます。 - -## 公式リソース - -- StoryblokはプロジェクトにStoryblokを追加する [Astro Integration](https://www.storyblok.com/mp/announcing-storyblok-astro)を提供しています。 - -## コミュニティリソース - -- 追加してください! diff --git a/src/content/docs/ja/guides/configuring-astro.mdx b/src/content/docs/ja/guides/configuring-astro.mdx deleted file mode 100644 index cbfef57f3cd6f..0000000000000 --- a/src/content/docs/ja/guides/configuring-astro.mdx +++ /dev/null @@ -1,170 +0,0 @@ ---- -title: Astroの設定 -i18nReady: true ---- -import ReadMore from '~/components/ReadMore.astro' - -プロジェクトに`astro.config.mjs`ファイルを追加することで、Astroの動作をカスタマイズできます。これはAstroプロジェクトではよく使われるファイルで、公式のサンプルテンプレートやテーマはすべて、デフォルトでこのファイルを含んでいます。 - -サポートされているすべてのオプションの概要については、Astroの[API設定リファレンス](/ja/reference/configuration-reference/)をお読みください。 - -## Astroの設定ファイル - -有効なAstro設定ファイルは、`default`エクスポートを使用して、設定をエクスポートします。`defineConfig`ヘルパーを用いるのがおすすめです。 - -```js -// astro.config.mjs -import { defineConfig } from 'astro/config' - -export default defineConfig({ - // オプションをここに書きます... - // https://docs.astro.build/ja/reference/configuration-reference/ -}) -``` - -`defineConfig()`を使うと、IDEで自動的にタイプヒントを表示できるのでおすすめですが、これはオプションです。最低限必要で、有効な設定ファイルは次のようなものです。 - -```js title="astro.config.mjs" -// 例: 最低限必要な空の設定ファイル -export default {} -``` - -## サポートされている設定ファイルの種類 - -Astroは、JavaScriptの設定ファイルとして、`astro.config.js`、`astro.config.mjs`、`astro.config.cjs`、`astro.config.ts`という複数のファイル形式をサポートしています。多くの場合は`.mjs`を、設定ファイルをTypeScriptで記述する場合は`.ts`を使用することをおすすめします。 - -TypeScriptの設定ファイルの読み込みは、[`tsm`](https://github.com/lukeed/tsm)を使って処理され、プロジェクトのtsconfigのオプションを尊重します。 -## 設定ファイルの指定 - -Astroは、プロジェクトルート内にある`astro.config.mjs`という名前の設定ファイルを自動的に使用しようとします。プロジェクトルートに設定ファイルがない場合、Astroのデフォルトのオプションが使用されます。 - -```bash -# 例: ./astro.config.mjs から設定を読み込みます。 -astro build -``` - -`--config`フラグを使用して、使用する設定ファイルを明示的に設定できます。このCLIフラグは、常に`astro`コマンドを実行した現在の作業ディレクトリから相対パスで指定されます。 - -```bash -# 例: このファイルから設定を読み込みます。 -astro build --config my-config-file.js -``` - -## 設定のインテリセンス - -Astroでは、設定ファイルに`defineConfig()`ヘルパーを使用することをおすすめします。`defineConfig()`はIDEに自動的にインテリセンスを提供します。VSCodeのようなエディタは、設定ファイルがTypeScriptで書かれていなくても、AstroのTypeScriptの型定義を読み込んで、自動的にjsdocの型ヒントを提供してくれます。 - -```js -// astro.config.mjs -import { defineConfig } from 'astro/config' - -export default defineConfig({ - // オプションをここに書きます... - // https://docs.astro.build/ja/reference/configuration-reference/ -}) -``` -また、以下のJSDoc記法を用いてVSCodeに手動で型定義を提供できます。 - -```js -// astro.config.mjs -export default /** @type {import('astro').AstroUserConfig} */ { - // オプションをここに書きます... - // https://docs.astro.build/ja/reference/configuration-reference/ -} -``` - -## 相対ファイルの参照 - -`root`または`--root`フラグで相対パスを指定すると、`astro`コマンドを実行した現在の作業ディレクトリを起点として、指定した相対パスを解決します。 - -```js -// astro.config.mjs -import { defineConfig } from 'astro/config' - -export default defineConfig({ - // 現在の作業ディレクトリにある "./foo"ディレクトリを指します。 - root: 'foo' -}) -``` - -Astroは、他のすべての相対ファイルおよび相対ディレクトリを、プロジェクトルートからの相対パスとして解決します。 - -```js -// astro.config.mjs -import { defineConfig } from 'astro/config' - -export default defineConfig({ - // 現在の作業ディレクトリにある "./foo"ディレクトリを指します。 - root: 'foo', - // 現在の作業ディレクトリの "./foo/public" ディレクトリを指します。 - publicDir: 'public', -}) -``` - -設定ファイルから相対的にファイルやディレクトリを参照するには、`import.meta.url`を使用します(common.jsの`astro.config.cjs`ファイルを記述する場合を除きます)。 - -```js "import.meta.url" -// astro.config.mjs -import { defineConfig } from 'astro/config' - -export default defineConfig({ - // この設定ファイルからの相対パスで、"./foo"ディレクトリを指します。 - root: new URL("./foo", import.meta.url).toString(), - // この設定ファイルから相対パスで、"./public "ディレクトリを指します。 - publicDir: new URL("./public", import.meta.url).toString(), -}) -``` - -:::note -`import.meta.env`や`import.meta.glob`など、Vite固有の`import.meta`プロパティは設定ファイルからはアクセスできません。こうしたユースケースについては[dotenv](https://github.com/motdotla/dotenv)や[fast-glob](https://github.com/mrmlnc/fast-glob)などの代替手段をおすすめします。さらに、[tsconfigのパスエイリアス](https://www.typescriptlang.org/tsconfig#paths)は解決されません。このファイル内では、モジュールのインポートには相対パスを使用してください。 -::: - -## 出力するファイル名のカスタマイズ - -インポートしたJavaScriptやCSSファイルなど、Astroが処理するコードについては、`astro.config.*`ファイルの`vite.build.rollupOptions`で[`entryFileNames`](https://rollupjs.org/configuration-options/#output-entryfilenames)、[`chunkFileNames`](https://rollupjs.org/configuration-options/#output-chunkfilenames)、[`assetFileNames`](https://rollupjs.org/configuration-options/#output-assetfilenames)を用いて出力するファイル名をカスタマイズできます。 - -```js ins={9-11} -// astro.config.mjs -import { defineConfig } from 'astro/config' - -export default defineConfig({ - vite: { - build: { - rollupOptions: { - output: { - entryFileNames: 'entry.[hash].mjs', - chunkFileNames: 'chunks/chunk.[hash].mjs', - assetFileNames: 'assets/asset.[hash][extname]', - }, - }, - }, - }, -}) -``` - -これは、広告ブロッカーの影響を受ける可能性のある名前のスクリプト(たとえば`ads.js`や`google-tag-manager.js`)がある場合に役に立ちます。 - -## 環境変数 - -Astroは他のファイルをロードする前に設定ファイルを評価します。そのため、`.env`ファイルによってセットされた環境変数を取得するために`import.meta.env`は使えません。 - -設定ファイルの中で`process.env`を使用して、[CLIによりセットされた](/ja/guides/environment-variables/#cliの利用)ものなど、その他の環境変数の取得は可能です。 - -また、[Viteの`loadEnv`ヘルパー](https://ja.vite.dev/config/#環境変数を設定に使用する)を使用して、`.env`ファイルを手動でロードすることもできます。 - -:::note -`pnpm`では、プロジェクトに直接インストールされていないモジュールをインポートできません。`pnpm`を使用している場合は、`loadEnv`ヘルパーを使用するために`vite`をインストールする必要があります。 - -```sh -pnpm add vite --save-dev -``` -::: - -```js title="astro.config.mjs" -import { loadEnv } from "vite"; -const { SECRET_PASSWORD } = loadEnv(process.env.NODE_ENV, process.cwd(), ""); -``` - -## 設定リファレンス - -サポートされているすべての設定オプションの概要については、Astroの[API設定リファレンス](/ja/reference/configuration-reference/)を参照してください。 diff --git a/src/content/docs/ja/guides/content-collections.mdx b/src/content/docs/ja/guides/content-collections.mdx deleted file mode 100644 index c60645903cb51..0000000000000 --- a/src/content/docs/ja/guides/content-collections.mdx +++ /dev/null @@ -1,636 +0,0 @@ ---- -title: コンテンツコレクション -description: >- - コンテンツコレクションは、Markdownを整理し、フロントマターをスキーマで型チェックするのに役立ちます。 -i18nReady: true -banner: - content: 新しいコンテンツコレクションを試してみませんか?ベータ版のv5にアップグレード! ---- -import { FileTree } from '@astrojs/starlight/components'; -import Since from '~/components/Since.astro' -import RecipeLinks from "~/components/RecipeLinks.astro" -import Badge from "~/components/Badge.astro" - -

- -

- -**コンテンツコレクション**は、Astroプロジェクトでコンテンツを管理し、オーサリングするもっとも良い方法です。コレクションはドキュメントを整理し、フロントマターを検証、すべてのコンテンツに対して自動的にTypeScriptの型安全性を提供します。 - - -## コンテンツコレクションとは? - -予約されているプロジェクトディレクトリ`src/content`の中にあるトップレベルのディレクトリは、1つの**コンテンツコレクション**を表わします。たとえば`src/content/newsletter`や`src/content/authors`などになります。`src/content`ディレクトリの中に入れられるのは、コンテンツコレクションだけです。このディレクトリは他のものには使えません。 - -**コレクションエントリー**は、コンテンツコレクションディレクトリ内に保存されたコンテンツのことです。エントリーには、Markdown(`.md`)やMDX(`.mdx` [MDXインテグレーション](/ja/guides/integrations-guide/mdx/)を使用)などのコンテンツオーサリングフォーマットや、YAML(`.yaml`)やJSON(`.json`)などのデータフォーマットを使用できます。コンテンツの検索と整理を容易にするため、ファイルには一貫性のある命名スキーム(小文字、スペースの代わりにダッシュ)の使用をおすすめしますが、これは必須ではありません。また、ファイル名の前にアンダースコア(_)を付けることで、[ビルド対象からエントリーを除外](/ja/guides/routing/#ページの除外)できます。 - - -- src/content/ - - **newsletter/** "newsletter"コレクション - - week-1.mdコレクションエントリー - - week-2.mdコレクションエントリー - - week-3.mdコレクションエントリー - - -コレクションができたら、Astroの組み込みコンテンツAPIを使って[コンテンツのクエリ](#コレクションのクエリ)を始められます。 - -### ".astro"ディレクトリ - -Astroは、コンテンツコレクションの重要なメタデータを、プロジェクト内の`.astro`ディレクトリに保存します。このディレクトリを維持または更新するために、何かする必要はありません。プロジェクトでの作業中は、このディレクトリを完全に無視してください。 - -`.astro`ディレクトリは、[`astro dev`](/ja/reference/cli-reference/#astro-dev)コマンドや[`astro build`](/ja/reference/cli-reference/#astro-build)コマンドを実行すると常に自動で更新されます。必要に応じて[`astro sync`](/ja/reference/cli-reference/#astro-sync)を実行し、手動で`.astro`ディレクトリを更新できます。 - -:::tip -バージョン管理にGitを使っている場合は、`.gitignore`に `.astro`を追加して`.astro`ディレクトリを無視することをおすすめします。以下は、このディレクトリとその中のファイルを無視するようにGitに伝えます。 -::: - -### 複数のコレクションによる整理 - -2つのファイルが異なる種類のコンテンツ(例えばブログの投稿と著者のプロフィール)を表す場合、それらは異なるコレクションに属する可能性が高いでしょう。多くの機能(フロントマターの検証、TypeScriptの自動型安全性)では、コレクション内のすべてのエントリーが同様の構造を共有する必要がありますので、これは重要です。 - -さまざまなタイプのコンテンツを扱うことになったら、それぞれのタイプを表す複数のコレクションを作成する必要があります。プロジェクトには、いくつでも異なるコレクションを作成できます。 - - -- src/content/ - - **newsletter/** - - week-1.md - - week-2.md - - **blog/** - - post-1.md - - post-2.md - - **authors/** - - grace-hopper.json - - alan-turing.json - - -### サブディレクトリを使った整理 - -コンテンツコレクションは、常に`src/content/`ディレクトリ内のトップレベルのフォルダです。コレクションを別のコレクションの中に入れ子にはできません。しかし、サブディレクトリを使ってコレクション内のコンテンツを整理できます。 - -たとえば、1つの`docs`コレクション内で多言語の翻訳を整理するために、次のディレクトリ構造を使えます。このコレクションをクエリするとき、ファイルパスを使用して言語によって結果をフィルタできます。 - - -- src/content/ - - docs/ このコレクションは、言語別に整理したサブディレクトリを使用 - - **en/** - - **es/** - - **de/** - - - -## コレクションの定義 - -:::note -`src/content/config.ts`ファイルは省略できます。しかし、コレクションを定義しないと、フロントマターのスキーマ検証やTypeScriptの自動型付けなど、コレクションのいくつかの優れた機能が使えなくなります。 -::: - -コンテンツコレクションを最大限に活用するには、プロジェクト内に`src/content/config.ts`ファイルを作成してください(`.js`と`.mjs`の拡張子もサポートされています)。これは、Astroがコンテンツコレクションを設定するために自動的に読み込んで使用する特別なファイルです。 - -```ts -// src/content/config.ts -// 1. `astro:content`からユーティリティをインポート -import { defineCollection } from 'astro:content'; -// 2. コレクションを定義 -const blogCollection = defineCollection({ /* ... */ }); -// 3. コレクションを登録するために、単一の`collections`オブジェクトをエクスポート -// このキーは、"src/content"のコレクションのディレクトリ名と一致する必要があります。 -export const collections = { - 'blog': blogCollection, -}; -``` - -### TypeScriptのセットアップ - -`tsconfig.json`ファイルでAstroのTypeScript設定を`strict`または`strictest`に設定して**いない**場合は、`tsconfig.json`を更新して`strictNullChecks`を有効にする必要があるかもしれません。 - -```json title="tsconfig.json" ins={5} -{ - // 注意:"astro/tsconfigs/strict"または"astro/tsconfigs/strictest"を使用する場合は変更する必要はありません。 - "extends": "astro/tsconfigs/base", - "compilerOptions": { - "strictNullChecks": true - } -} -``` - -Astroプロジェクトで`.js`または`.mjs`ファイルを使用する場合、`tsconfig.json`で`allowJs`を有効にすることで、インテリセンスとエディタでの型チェックを有効にできます。 - -```json title="tsconfig.json" ins={6} -{ - // 注意:"astro/tsconfigs/strict"または"astro/tsconfigs/strictest"を使用する場合は変更する必要はありません。 - "extends": "astro/tsconfigs/base", - "compilerOptions": { - "strictNullChecks": true, - "allowJs": true - } -} -``` - -### コレクションスキーマの定義 - -スキーマは、コレクション内の一貫したフロントマターまたはエントリーデータを強制します。スキーマは、このデータへの参照やクエリが必要なときに、それが予測可能な形で存在することを**保証**します。ファイルがコレクションスキーマに違反している場合、Astroは役にたつエラーを表示してお知らせします。 - -スキーマはAstroのコンテンツに対する自動的なTypeScriptの型付けにも力を発揮します。コレクションにスキーマを定義すると、Astroは自動的にTypeScriptインターフェイスを生成して適用します。その結果、コレクションをクエリする際には、プロパティの自動補完や型チェックを含むTypeScriptが完全にサポートされます。 - -最初のコレクションを定義するには、`src/content/config.ts`ファイルがまだ存在しなければ、このファイルを作成します(`.js`と `.mjs`の拡張子もサポートされています)。 - -1. `astro:content`から**適切なユーティリティをインポートします**。 -2. **検証したい各コレクションを定義します**。これには、コレクションがMarkdownのようなコンテンツオーサリングフォーマット(`type: 'content'`)であるか、JSONやYAMLのようなデータフォーマット(`type: 'data'`)であるかを指定する`type`(Astro v2.5.0で導入)が含まれます。また、フロントマターやエントリーデータの形を定義する`schema`も含まれます。 -3. コレクションを登録するために、**単一の`collections`オブジェクトをエクスポートします**。 - -```ts -// src/content/config.ts -// 1. ユーティリティを`astro:content`からインポート -import { z, defineCollection } from 'astro:content'; - -// 2. 各コレクションに`type`と`schema`を定義 -const blogCollection = defineCollection({ - type: 'content', // v2.5.0以降 - schema: z.object({ - title: z.string(), - tags: z.array(z.string()), - image: z.string().optional(), - }), -}); - -// 3. コレクションを登録するために、単一の`collections`オブジェクトをエクスポート -export const collections = { - 'blog': blogCollection, -}; -``` - -### 複数のコレクションの定義 - -`defineCollection()`は、複数のスキーマを作成するために何度でも使えます。 すべてのコレクションは、単一の`collections`オブジェクトの内部からエクスポートする必要があります。 - -```ts -// src/content/config.ts -const blogCollection = defineCollection({ - type: 'content', - schema: z.object({ /* ... */ }) -}); -const newsletter = defineCollection({ - type: 'content', - schema: z.object({ /* ... */ }) -}); -const authors = defineCollection({ - type: 'data', - schema: z.object({ /* ... */ }) -}); - -export const collections = { - 'blog': blogCollection, - 'newsletter': newsletter, - 'authors': authors, -}; -``` - -プロジェクトが成長するにつれて、コードベースを再編成し、`src/content/config.ts`ファイルからロジックを移動することも自由にできます。スキーマを別々に定義することは、複数のコレクションでスキーマを再利用したり、プロジェクトの他の部分とスキーマを共有したりするのに便利です。 - -```ts -// src/content/config.ts -// 1. ユーティリティとスキーマのインポート -import { defineCollection } from 'astro:content'; -import { blogSchema, authorSchema } from '../schemas'; - -// 2. コレクションを定義 -const blogCollection = defineCollection({ - type: 'content', - schema: blogSchema, -}); -const authorCollection = defineCollection({ - type: 'data', - schema: authorSchema, -}); - -// 3. 複数のコレクションをエクスポートして登録 -export const collections = { - 'blog': blogCollection, - 'authors': authorCollection, -}; -``` - -### サードパーティのコレクションスキーマの使用 - -外部のnpmパッケージなど、どこからでもコレクションスキーマをインポートできます。これは、独自のコレクションスキーマを提供するテーマやライブラリを使用するときに便利です。 - -```ts -// src/content/config.ts -import { blogSchema } from 'my-blog-theme'; -const blogCollection = defineCollection({ type: 'content', schema: blogSchema }); - -// 'my-blog-theme'の外部スキーマを使用して、ブログコレクションをエクスポート -export const collections = { - 'blog': blogCollection, -}; -``` - -### Zodによるデータ型の定義 - -Astroは[Zod](https://github.com/colinhacks/zod)を使ってコンテンツスキーマを動かしています。Zodを利用すると、Astroはコレクション内のすべてのファイルのフロントマターを検証し、プロジェクト内からコンテンツをクエリする際に自動的にTypeScriptの型を提供できます。 - -AstroでZodを使うには、`"astro:content"`から`z`ユーティリティをインポートします。これはZodライブラリの再エクスポートで、Zodのすべての機能をサポートしています。Zodがどのように動作し、どのような機能が利用可能かについての完全なドキュメントは、[ZodのREADME](https://github.com/colinhacks/zod)を参照してください。 - -```ts -// 例:一般的なZodのデータ型のチートシート -import { z, defineCollection } from 'astro:content'; - -defineCollection({ - schema: z.object({ - isDraft: z.boolean(), - title: z.string(), - sortOrder: z.number(), - image: z.object({ - src: z.string(), - alt: z.string(), - }), - author: z.string().default('Anonymous'), - language: z.enum(['en', 'es']), - tags: z.array(z.string()), - // オプションのフロントマター・プロパティ。非常に一般的です! - footnote: z.string().optional(), - // フロントマターでは、引用符で囲まずに書かれた日付はDateオブジェクトとして解釈されます。 - publishDate: z.date(), - // 日付文字列(例えば "2022-07-08")をDateオブジェクトに変換できます。 - // publishDate: z.string().transform((str) => new Date(str)), - // アドバンスド:文字列が電子メールであることを検証する。 - authorContact: z.string().email(), - // アドバンスド:文字列がURLであることを検証する。 - canonicalURL: z.string().url(), - }) -}) -``` - -### コレクション参照の定義 - -コレクションエントリーは、他の関連するエントリーを「参照」することもできます。 - -Collections APIの`reference()`関数を使うと、コレクションスキーマのプロパティを別のコレクションのエントリーとして定義できます。たとえば、すべての`space-shuttle`エントリーに、型チェック、オートコンプリート、バリデーションに`pilot`コレクションのスキーマを使用する`pilot`プロパティを含めるように要求できます。 - -よくある例は、JSONとして保存された再利用可能な著者プロフィールや、同じコレクションに保存された関連投稿URLを参照するブログ投稿です。 - -```ts -import { defineCollection, reference, z } from 'astro:content'; - -const blog = defineCollection({ - type: 'content', - schema: z.object({ - title: z.string(), - // `authors` コレクションから `id` で1人の著者を参照 - author: reference('authors'), - // `blog`コレクションから`slug`による関連記事の配列を参照 - relatedPosts: z.array(reference('blog')), - }) -}); - -const authors = defineCollection({ - type: 'data', - schema: z.object({ - name: z.string(), - portfolio: z.string().url(), - }) -}); - -export const collections = { blog, authors }; -``` - -このブログ記事の例では、関連記事の`slug`と投稿者の`id`を指定しています。 - -```yaml title="src/content/blog/welcome.md" ---- -title: "私のブログへようこそ" -author: ben-holmes # `src/content/authors/ben-holmes.json`を参照 -relatedPosts: -- about-me # `src/content/blog/about-me.md`を参照 -- my-year-in-review # `src/content/blog/my-year-in-review.md`を参照 ---- -``` - -### カスタムスラグの定義 - -`type: 'content'`を使用している場合、すべてのコンテンツエントリーは[ファイル`id`](/ja/reference/modules/astro-content/#id)からURLフレンドリーな`slug`プロパティを生成します。このスラグは、コレクションからエントリーを直接クエリするために使用されます。また、コンテンツから新しいページやURLを作成するときにも便利です。 - -ファイルのフロントマターに独自の`slug`プロパティを追加すると、エントリーの生成されたスラグをオーバーライドできます。これは他のWebフレームワークの"permalink"機能に似ています。`"slug"`は特別な予約されたプロパティ名で、カスタムコレクション`schema`では許可されず、エントリーの`data`プロパティには表示されません。 - -```md {3} ---- -title: 私のブログ記事 -slug: my-custom-slug/supports/slashes ---- -あなたのブログ記事の内容はこちら。 -``` - -## コレクションのクエリ - -Astroには、コレクションにクエリを発行して1つ(または複数)のコンテンツエントリーを返す関数が2つあります。[`getCollection()`](/ja/reference/modules/astro-content/#getcollection)と[`getEntry()`](/ja/reference/modules/astro-content/#getentry)です。 - -```js -import { getCollection, getEntry } from 'astro:content'; - -// コレクションからすべてのエントリーを取得します。 -// 引数としてコレクション名が必要です。 -// 例: `src/content/blog/**`を取得する。 -const allBlogPosts = await getCollection('blog'); - -// コレクションから単一のエントリーを取得します。 -// コレクションの名前と、以下のいずれかが必要です。 -// エントリーの`slug`(コンテンツコレクション)または`id`(データコレクション)を指定する。 -// 例: `src/content/authors/grace-hopper.json`を取得する。 -const graceHopperProfile = await getEntry('authors', 'grace-hopper'); -``` - -どちらの関数も、[`CollectionEntry`](/ja/reference/modules/astro-content/#collectionentry)型で定義されたコンテンツエントリーを返します。 - -### 参照データへのアクセス - -[スキーマで定義されている参照](#コレクション参照の定義)は、最初にコレクションエントリーをクエリした後で、個別にクエリする必要があります。`getEntry()`関数を再度使用するか、または`getEntries()`を使用して、返された`data`オブジェクトから参照されるエントリーを取得できます。 - -```astro title="src/pages/blog/welcome.astro" ---- -import { getEntry, getEntries } from 'astro:content'; - -const blogPost = await getEntry('blog', 'welcome'); - -// 単一参照の解決 -const author = await getEntry(blogPost.data.author); -// 参照の配列を解決 -const relatedPosts = await getEntries(blogPost.data.relatedPosts); ---- - -

{blogPost.data.title}

-

著者: {author.data.name}

- - - -

次もおすすめ

-{relatedPosts.map(p => ( - {p.data.title} -))} -``` - -### コレクションクエリのフィルタリング - -`getCollection()`はオプションの"filter"コールバックを受け取り、エントリーの`id` や`data`(フロントマター)プロパティに基づいてクエリをフィルタリングします。`type: 'content'`のコレクションについては、`slug`に基づいてフィルタリングもできます。 - -:::note -`slug`プロパティはコンテンツコレクションに固有のもので、JSONやYAMLのコレクションをフィルタリングするときには利用できません。 -::: - -これを使用して、コンテンツを好きな基準でフィルタリングできます。たとえば、`draft`のようなプロパティでフィルタリングして、下書きのブログ記事がブログに公開されないようにできます。 - -```js -// 例: `draft: true`を含むエントリーを除外 -import { getCollection } from 'astro:content'; -const publishedBlogEntries = await getCollection('blog', ({ data }) => { - return data.draft !== true; -}); -``` - -開発サーバーの実行時にのみ閲覧可能で、本番用にはビルドされない下書き(draft)ページも作成できます。 - -```js -// 例: 本番用にビルドするときにのみ、`draft: true`を含むエントリーを除外 -import { getCollection } from 'astro:content'; -const blogEntries = await getCollection('blog', ({ data }) => { - return import.meta.env.PROD ? data.draft !== true : true; -}); -``` - -filterの引数は、コレクション内の入れ子ディレクトリによるフィルタリングもサポートします。`id`にはネストされた完全なパスが含まれるので、各`id`の先頭でフィルタリングして、特定のネストされたディレクトリからのアイテムだけを返せます。 - -```js -// 例: コレクション内のサブディレクトリによるエントリーのフィルタリング -import { getCollection } from 'astro:content'; -const englishDocsEntries = await getCollection('docs', ({ id }) => { - return id.startsWith('en/'); -}); -``` - -### Astroテンプレートでのコンテンツの使用 - -コレクションエントリーをクエリすると、Astroコンポーネントテンプレートの内部で各エントリーに直接アクセスできます。これにより、コンテンツへのリンク(コンテンツ`slug`を使用)やコンテンツに関する情報(`data`プロパティを使用)などのHTMLをレンダリングできます。 - -コンテンツをHTMLにレンダリングする方法については、下記の[コンテンツをHTMLにレンダリングする](#コンテンツをhtmlにレンダリングする)を参照してください。 - -```astro ---- -// src/pages/index.astro -import { getCollection } from 'astro:content'; -const blogEntries = await getCollection('blog'); ---- -
    - {blogEntries.map(blogPostEntry => ( -
  • - {blogPostEntry.data.title} - -
  • - ))} -
-``` - -### コンテンツをプロパティとして渡す - -コンポーネントは、コンテンツエントリー全体をプロパティとして渡すこともできます。 - -この場合、[`CollectionEntry`](/ja/reference/modules/astro-content/#collectionentry)ユーティリティを使用して、TypeScriptでコンポーネントのプロパティを適切に型付けできます。 このユーティリティは、コレクションスキーマの名前と一致する文字列引数を取り、そのコレクションのスキーマのすべてのプロパティを継承します。 - -```astro /CollectionEntry(?:<.+>)?/ ---- -// src/components/BlogCard.astro -import type { CollectionEntry } from 'astro:content'; -interface Props { - post: CollectionEntry<'blog'>; -} - -// `post`は'blog'コレクションのスキーマタイプにマッチする。 -const { post } = Astro.props; ---- -``` - -### コンテンツをHTMLにレンダリングする - -クエリされたエントリーの`render()`関数プロパティを使用して、MarkdownおよびMDXエントリーをHTMLにレンダリングできます。この関数を呼び出すと、``コンポーネントとレンダリングされたすべての見出しのリストを含む、レンダリングされたコンテンツとメタデータにアクセスできます。 - -```astro {5} ---- -// src/pages/render-example.astro -import { getEntry } from 'astro:content'; -const entry = await getEntry('blog', 'post-1'); -const { Content, headings } = await entry.render(); ---- -

公開日: {entry.data.published.toDateString()}

- -``` - -## コンテンツからルーティングを生成 - -コンテンツコレクションは`src/pages/`ディレクトリの外に保存されます。つまり、デフォルトではコレクション項目に対してルーティングは生成されません。コレクション項目からHTMLページを生成するには、手動で新しい[動的ルーティング](/ja/guides/routing/#動的ルーティング)を作成する必要があります。動的ルーティングは、リクエストのパラメーター (例:`src/pages/blog/[...slug].astro`の`Astro.params.slug`) をマッピングして、コレクション内の正しいエントリーを取得します。 - -ルーティングを生成する正確な方法は、ビルドの[出力](/ja/reference/configuration-reference/#output)モードによって異なります。モードはstatic(デフォルト)またはserver(SSRの場合)です。 - -### 静的出力のビルド(デフォルト) - -静的なウェブサイトを構築する場合(Astroのデフォルトの動作)、ビルド中に1つの`src/pages/`コンポーネントから複数のページを作成するには、[`getStaticPaths()`](/ja/reference/routing-reference/#getstaticpaths)関数を使用します。 - -`getStaticPaths()`内で`getCollection()`を呼び出し、[コンテンツまたはデータをクエリします](/ja/guides/content-collections/#コレクションのクエリ)。それから、各コンテンツエントリーの`slug`プロパティ(コンテンツコレクション)または`id`プロパティ(データコレクション)を使用して、新しいURLパスを作成します。 - -```astro "{ slug: entry.slug }" ---- -// src/pages/posts/[...slug].astro -import { getCollection } from 'astro:content'; -// 1. コレクションエントリーごとに新しいパスを生成 -export async function getStaticPaths() { - const blogEntries = await getCollection('blog'); - return blogEntries.map(entry => ({ - params: { slug: entry.slug }, props: { entry }, - })); -} -// 2. テンプレートでは、プロパティからエントリーを直接取得できる -const { entry } = Astro.props; -const { Content } = await entry.render(); ---- -

{entry.data.title}

- -``` - -これにより、`blog`コレクションの各エントリーに新しいページが生成されます。たとえば、`src/content/blog/hello-world.md`のエントリーは`hello-world`というスラグを持つので、最終的なURLは`/posts/hello-world/`となります。 - -:::note -カスタムスラグに`/`文字が含まれ、複数のパスセグメントを持つURLを生成する場合は、この動的ルーティングページの`.astro`ファイル名に[レストパラメータ(`[...slug]`)](/ja/guides/routing/#レストパラメーター)を使用する必要があります。 -::: - -### サーバー出力のビルド(SSR) - -動的なウェブサイトを構築する場合(AstroのSSRサポートを使用する場合)、ビルド時にパスを生成する必要はありません。そのかわり、ページでは(`Astro.request`あるいは`Astro.params`を使って)リクエストを調べて`slug`を見つけ、[`getEntry()`](/ja/reference/modules/astro-content/#getentry)を使って取得しなければなりません。 - - -```astro ---- -// src/pages/posts/[...slug].astro -import { getEntry } from "astro:content"; -// 1. 受信サーバーのリクエストからスラグを取得 -const { slug } = Astro.params; -if (slug === undefined) { - throw new Error("Slug is required"); -} -// 2. リクエストスラグを使ってエントリーを直接検索 -const entry = await getEntry("blog", slug); -// 3. エントリーが存在しない場合はリダイレクト -if (entry === undefined) { - return Astro.redirect("/404"); -} -// 4. (オプション) テンプレート内でエントリーをHTMLにレンダリング -const { Content } = await entry.render(); ---- -``` - -:::tip -[GitHubのブログチュートリアルデモコード](https://github.com/withastro/blog-tutorial-demo/tree/content-collections/src/pages) または [StackBlitzで開く](https://stackblitz.com/github/withastro/blog-tutorial-demo/tree/content-collections?file=src/pages/blog.astro) の `src/pages/` フォルダを探せば、ブログ記事のリストやタグページなど、コレクションからページを作成する完全な例を見れます! -::: - -## ファイルベースのルーティングからの移行 - -`src/pages/`内のサブフォルダーでMarkdownまたはMDXファイルを使用するブログなどの既存のAstroプロジェクトがある場合は、関連するコンテンツまたはデータファイルをコンテンツコレクションに移行することを検討してください。 - -[ブログ作成チュートリアルの完成プロジェクト](https://github.com/withastro/blog-tutorial-demo)のコードベースを使用する[ステップバイステップのチュートリアル](/ja/tutorial/6-islands/4/)で、基本的なブログの例を`src/pages/posts/`から`src/content/posts`に変換する方法を確認してください。 - -## JSONスキーマの生成を有効にする - -

- -`data`型のコレクションを使用している場合、Astroはインテリセンスと型チェックを行うために、エディタ用のJSONスキーマファイルを自動生成します。`src/content/config.ts`で定義されたコレクションに基づいて、プロジェクト内の各データコレクションごとに、[`zod-to-json-schema`](https://github.com/StefanTerdell/zod-to-json-schema#known-issues)と呼ばれるライブラリを使用して個別のファイルが作成されます。 - -この機能では、コレクションの各データ入力ファイルで、スキーマのファイルパスを `$schema` の値として手動で設定する必要があります。 - -```json title="src/content/authors/armand.json" ins={2} -{ - "$schema": "../../../.astro/collections/authors.schema.json", - "name": "Armand", - "skills": ["Astro", "Starlight"] -} -``` - -または、エディタの設定でこの値を設定することもできます。例えば、[VSCodeの`json.schemas`設定](https://code.visualstudio.com/docs/languages/json#_json-schemas-and-settings)でこの値を設定するには、マッチするファイルのパスとJSONスキーマの場所を指定します。 - -```json -{ - "json.schemas": [ - { - "fileMatch": [ - "/src/content/authors/**" - ], - "url": "./.astro/collections/authors.schema.json" - } - ] -} -``` - -## ビルドキャッシュを有効にする - -

- -大規模なコレクションを扱っている場合は、[`experimental.contentCollectionCache`](/ja/reference/configuration-reference/#experimentalcontentcollectioncache)フラグを使用してキャッシュされたビルドを有効にするとよいでしょう。この実験的な機能は、Astroのビルドプロセスを最適化し、変更されていないコレクションを保存してビルド間で再利用できるようにします。 - -多くの場合、これによりビルドパフォーマンスが大幅に向上します。 - -この機能が安定するまで、保存されたキャッシュで問題が発生する可能性があります。次のコマンドを実行すると、いつでもビルドキャッシュをリセットできます。 - -``` -npm run astro build -- --force -``` - -## Remarkでフロントマターを修正 - -:::caution -**非推奨**。Remarkとrehypeプラグインは生のMarkdownまたはMDXドキュメントのフロントマターにアクセスします。これは`remarkPluginFrontmatter`のフロントマターがあなたの型セーフ`schema`とは別に扱われ、Astroを通して適用された変更やデフォルトは反映されません。使用は自己責任です! -::: - -Astroは、[フロントマターを直接変更する](/ja/guides/markdown-content/#プログラムによるフロントマターの変更)remarkまたはrehypeプラグインをサポートしています。`render()`から返される`remarkPluginFrontmatter`プロパティを使うと、コンテンツエントリー内でこの変更されたフロントマターにアクセスできます。 - -```astro "{ remarkPluginFrontmatter }" ---- -import { getEntry } from 'astro:content'; -const blogPost = await getEntry('blog', 'post-1'); -const { remarkPluginFrontmatter } = await blogPost.render(); ---- -

{blogPost.data.title} — {remarkPluginFrontmatter.readingTime}

-``` - - - -remarkやrehypeのパイプラインは、コンテンツがレンダリングされたときにのみ実行されます。そのため、`render()`をコールした後に`remarkPluginFrontmatter`を使用できるようになります。対照的に、`getCollection()`や`getEntry()`はコンテンツをレンダリングしないので、これらの値を直接返すことはできません。 - -## フロントマターでの日付の扱い - -コンテンツコレクションではいくつかの日付フォーマットが可能ですが、コレクションのスキーマはMarkdownまたはMDX YAMLのフロントマターで使用されているフォーマットと一致しなければなりません。 - -YAMLは日付を表現するために[ISO-8601](https://www.iso.org/iso-8601-date-and-time-format.html)の標準を使います。`yyyy-mm-dd`(例 `2021-07-28`)というフォーマットと`z.date()`というスキーマタイプを使います: - -```markdown title="src/pages/posts/example-post.md" ---- -title: My Blog Post -pubDate: 2021-07-08 ---- -``` - -タイムゾーンが指定されていない場合、日付の書式はUTCで指定されます。タイムゾーンを指定する必要がある場合は、[ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) 形式を使うことができます。 - -```markdown title="src/pages/posts/example-post.md" ---- -title: My Blog Post -pubDate: 2021-07-08T12:00:00-04:00 ---- -``` - -完全なUTCタイムスタンプから`YYYY-MM-DD`だけをレンダリングするには、JavaScriptの`slice`メソッドを使用してタイムスタンプを削除します: - -```astro title="src/layouts/ExampleLayout.astro" ---- -const { frontmatter } = Astro.props; ---- -

{frontmatter.title}

-

{frontmatter.pubDate.toISOString().slice(0,10)}

-``` -`toLocaleDateString`を使って日、月、年をフォーマットする例を見るには、Astro公式ブログテンプレートの[``コンポーネント](https://github.com/withastro/astro/blob/latest/examples/blog/src/components/FormattedDate.astro)を参照してください。 diff --git a/src/content/docs/ja/guides/data-fetching.mdx b/src/content/docs/ja/guides/data-fetching.mdx deleted file mode 100644 index bc8a3d2794dca..0000000000000 --- a/src/content/docs/ja/guides/data-fetching.mdx +++ /dev/null @@ -1,110 +0,0 @@ ---- -title: データフェッチ -description: Astroでfetch APIを使用してリモートのデータを取得する方法を学びましょう。 -i18nReady: true ---- - -`.astro`ファイルでは、リモートのデータを取得してページを生成できます。 - -## Astroでの`fetch()` - -[Astroコンポーネント](/ja/basics/astro-components/)では、コンポーネントのスクリプトで[グローバルの`fetch()`関数](https://developer.mozilla.org/ja/docs/Web/API/fetch)にアクセスできます。これにより、https://example.com/api や`Astro.url + "/api"`のようにURL全体を指定してAPIにHTTPリクエストをおこなえます。 - -このfetch呼び出しはビルド時に実行され、そのデータは動的なHTMLを生成するためにコンポーネントテンプレートで利用できます。[SSR](/ja/guides/on-demand-rendering/)モードが有効になっている場合、fetch呼び出しはランタイムに実行されます。 - -💡 Astroコンポーネントスクリプトの内部で、[**top-level await**](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/await#top_level_await)を利用できます。 - -💡 取得したデータは、Astroコンポーネントとフレームワークコンポーネント両方にpropsとして渡せます。 - -```astro /await fetch\\(.*?\\)/ ---- -// src/components/User.astro -import Contact from '../components/Contact.jsx'; -import Location from '../components/Location.astro'; - -const response = await fetch('https://randomuser.me/api/'); -const data = await response.json(); -const randomUser = data.results[0] ---- - -

ユーザー

-

{randomUser.name.first} {randomUser.name.last}

- - - - -``` - -:::note -Astroコンポーネントのすべてのデータは、コンポーネントがレンダリングされるときにフェッチされることを覚えておいてください。 - -デプロイされたAstroサイトは、**ビルド時に一度だけ**データをfetchします。開発環境では、コンポーネントの更新時にfetchされたデータが表示されます。クライアントサイドで何度もデータを再取得する必要がある場合は、Astroコンポーネントで[フレームワークコンポーネント](/ja/guides/framework-components/)または[クライアントサイドスクリプト](/ja/guides/client-side-scripts/)を使用します。 -::: - - -## フレームワークコンポーネントでの`fetch()` - -`fetch()`関数は、任意の[フレームワークコンポーネント](/ja/guides/framework-components/)からもグローバルに利用できます。 - -```tsx title="src/components/Movies.tsx" /await fetch\\(.*?\\)/ -import type { FunctionalComponent } from 'preact'; - -const data = await fetch('https://example.com/movies.json').then((response) => - response.json() -); - -// ビルド時にレンダリングされるコンポーネントはCLIにもログを出力します。 -// client:* ディレクティブでレンダリングされた場合、ブラウザコンソールにもログが出力されます。 -console.log(data); - -const Movies: FunctionalComponent = () => { - // 結果をページに出力する - return
{JSON.stringify(data)}
; -}; - -export default Movies; -``` - - -## GraphQLクエリ - -Astroはまた、`fetch()`を使用して任意の有効なGraphQLクエリでGraphQLサーバーにクエリを投げられます。 - -```astro title="src/components/Film.astro" "await fetch" ---- -const response = await fetch("https://swapi-graphql.netlify.app/.netlify/functions/index", - { - method: 'POST', - headers: {'Content-Type':'application/json'}, - body: JSON.stringify({ - query: ` - query getFilm ($id:ID!) { - film(id: $id) { - title - releaseDate - } - } - `, - variables: { - id: "ZmlsbXM6MQ==", - }, - }), - }); - -const json = await response.json(); -const { film } = json.data; ---- -

Star Wars: A New Hopeに関する情報を取得

-

タイトル: {film.title}

-

公開年: {film.releaseDate}

-``` - -## ヘッドレスCMSからのfetch - -Astroコンポーネントは、お気に入りのCMSからデータを取得し、それをページコンテンツとしてレンダリングできます。[動的ルーティング](/ja/guides/routing/#動的ルーティング)を使用すれば、コンポーネントはCMSコンテンツをもとにページを生成できます。 - -StoryblokやContentful、WordPressなどのヘッドレスCMSとAstroを組み合わせる方法について詳しくは、[CMSガイド](/ja/guides/cms/)を参照してください。 - -## コミュニティリソース - -- [Creating a fullstack app with Astro + GraphQL](https://robkendal.co.uk/blog/how-to-build-astro-site-with-graphql/) diff --git a/src/content/docs/ja/guides/deploy/aws.mdx b/src/content/docs/ja/guides/deploy/aws.mdx deleted file mode 100644 index c5678f27f9f46..0000000000000 --- a/src/content/docs/ja/guides/deploy/aws.mdx +++ /dev/null @@ -1,280 +0,0 @@ ---- -title: AstroサイトをAWSにデプロイする -description: AWSを使ってAstroサイトをウェブにデプロイする方法。 -type: deploy -i18nReady: true ---- - -[AWS](https://aws.amazon.com/)は、Astroサイトのデプロイに使用できる、機能豊富なウェブアプリホスティングプラットフォームです。 - -プロジェクトをAWSにデプロイするには、[AWSコンソール](https://aws.amazon.com/console/)を使用する必要があります。(これらのアクションのほとんどは、[AWS CLI](https://aws.amazon.com/cli/)を使用しても実行できます)。このガイドでは、AWSにサイトをデプロイする手順を最も基本的な方法から説明します。その後、コスト効率とパフォーマンスを向上させるための追加サービスをデモンストレーションします。 - -## AWS Amplify - -AWS Amplifyは、フロントエンドのWebおよびモバイル開発者が、AWS上で迅速かつ容易にフルスタックアプリケーションを構築できるようにするという目的のために設計されたツールと機能のセットです。 - -1. 新しいAmplify Hostingプロジェクトを作成します。 -2. リポジトリをAmplifyに接続します。 -3. ビルド出力ディレクトリ `baseDirectory` を `/dist` に変更します。 - - ```yaml - version: 1 - frontend: - phases: - preBuild: - # npmを使用していない場合は、`npm ci` を `yarn install` または `pnpm i` に変更してください。 - commands: - - npm ci - build: - commands: - - npm run build - artifacts: - baseDirectory: /dist - files: - - '**/*' - cache: - paths: - - node_modules/**/* - ``` - -`pnpm` を使用する場合は、`node_modules` の代わりにpnpm storeディレクトリをキャッシュするために、設定を変更する必要があります。以下は推奨のビルド設定です. - - - ```yaml - version: 1 - frontend: - phases: - preBuild: - commands: - - npm i -g pnpm - - pnpm config set store-dir .pnpm-store - - pnpm i - build: - commands: - - pnpm run build - artifacts: - baseDirectory: /dist - files: - - '**/*' - cache: - paths: - - .pnpm-store/**/* - ``` - -Amplifyは、あなたがリポジトリにコミットをプッシュすると、自動的にあなたのウェブサイトをデプロイし、更新します。 - -## S3での静的ウェブサイトホスティング - -S3はあらゆるアプリケーションの出発点です。プロジェクトファイルやその他のアセットが保存されます。S3はファイルの保存容量とリクエスト数に対して課金されます。S3についての詳細は[AWS documentation](https://aws.amazon.com/s3/)を参照してください。 - -1. プロジェクト名を含んだS3バケットを作成します。 - - :::tip - バケット名はグローバルに一意でなければなりません。プロジェクト名とサイトのドメイン名の組み合わせをお勧めします。 - ::: - -2. **「パブリックアクセスをすべてブロック」**を無効にします。デフォルトでは、AWSはすべてのバケットを非公開に設定しています。公開するには、バケットのプロパティにある「パブリックアクセスをブロック」のチェックを外す必要があります。 - -3. `dist`にあるビルドしたファイルをS3にアップロードします。これは、コンソールで手動で行うか、AWS CLIを使用して行うことができます。AWS CLIを使用する場合は、[AWS認証情報で認証](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)の後に、以下のコマンドを使用できます。 - - ``` - aws s3 cp dist/ s3:/// --recursive - ``` - -4. パブリックアクセスを許可するために、バケットポリシーを更新します。この設定は、バケットの**アクセス権限 > バケットポリシー**にあります。 - - ```json - { - "Version": "2012-10-17", - "Statement": [ - { - "Sid": "PublicReadGetObject", - "Effect": "Allow", - "Principal": "*", - "Action": "s3:GetObject", - "Resource": "arn:aws:s3:::/*" - } - ] - } - ``` - - :::caution - ``を自分のバケット名に置き換えることを忘れないでください。 - ::: - -5. BucketのWebサイトホスティングを有効にします。この設定は、バケットの**プロパティ > 静的ウェブサイトホスティング**にあります。インデックスドキュメントを`index.html`に、エラードキュメントを`404.html`に設定します。最後に、バケットの**プロパティ > 静的ウェブサイトホスティング**で、新しいウェブサイトのURL確認できます。 - - :::note - シングルページアプリケーション (SPA) をデプロイする場合は、エラードキュメントを `index.html` に設定してください。 - ::: - -## S3とCloudFront - -CloudFrontは、コンテンツ・デリバリー・ネットワーク(CDN)機能を提供するウェブサービスです。ウェブサーバーのコンテンツをキャッシュし、エンドユーザーに配信するために使用されます。CloudFrontは転送されたデータ量に応じて課金されます。CloudFrontをS3バケットに追加することで、より費用対効果が高く、より高速な配信が可能になります。 - -CloudFrontを使用してS3バケットをラップし、AmazonグローバルCDNネットワークを通じてプロジェクトのファイルを配信します。これにより、プロジェクトのファイルを配信するコストが削減され、サイトのパフォーマンスが向上します。 - -### S3のセットアップ - -1. プロジェクト名を含んだS3バケットを作成します。 - - :::tip - バケット名はグローバルに一意でなければなりません。プロジェクト名とサイトのドメイン名の組み合わせをお勧めします。 - ::: -2. `dist` にあるビルドしたファイルをS3にアップロードします。これは、コンソールで手動で行うか、AWS CLIを使用して行うことができます。AWS CLIを使用する場合は、[AWS認証情報で認証](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)した後に、以下のコマンドを使用します。 - - ``` - aws s3 cp dist/ s3:/// --recursive - ``` - -3. バケットポリシーを更新し、**CloudFrontからのアクセス**を許可します。この設定は、バケットの**アクセス権限 > バケットポリシー**にあります。 - - ```json - { - "Version": "2012-10-17", - "Statement": [{ - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity " - }, - "Action": "s3:GetObject", - "Resource": "arn:aws:s3:::astro-aws/*" - }] - } - ``` - - :::caution - `` をCloudFront Origin Access Identity IDの名前に置き換えることを忘れないでください。CloudFrontのオリジンアクセスアイデンティティIDは、CloudFrontの設定後に**CloudFront > Origin access identities**で確認できます。 - ::: - -### CloudFrontのセットアップ - -1. 以下の値でCloudFrontディストリビューションを作成します: - * **オリジンドメイン:** 作成したS3バケット - * **S3バケットへのアクセス:** "OAIを使用する(バケットはCloudFrontのみにアクセスを制限できる)" - * **オリジンアクセスアイデンティティ:** 新しいOAIを作成 - * **ビューワーバケットポリシー:** "いいえ、バケット・ポリシーを更新します。" - * **ビューワープロトコルポリシー:** "Redirect to HTTPS" - * **デフォルトルートオブジェクト:** `index.html` - -この設定は、パブリックインターネットからのS3バケットへのアクセスをブロックし、グローバルCDNネットワークを使用してサイトを提供します。CloudFrontの配信URLは、バケットの**Distributions > Domain name**で確認できます。 - -### CloudFront Functionsのセットアップ - -残念ながら、CloudFrontはデフォルトでは複数ページの`sub-folder/index`ルーティングをサポートしていません。これを設定するには、CloudFront Functionsを使ってリクエストをS3の目的のオブジェクトに向ける必要があります。 - -1. 以下のコードスニペットで新しいCloudFront関数を作成します。CloudFront関数は**CloudFront > 関数**にあります。 - - ```js - function handler(event) { - var request = event.request; - var uri = request.uri; - - // URIにファイル名が欠けているかチェックする。 - if (uri.endsWith('/')) { - request.uri += 'index.html'; - } - // URIにファイル拡張子が欠けているかチェックする。 - else if (!uri.includes('.')) { - request.uri += '/index.html'; - } - - return request; - } - ``` -2. CloudFrontディストリビューションに関数をアタッチします。このオプションは、CloudFrontディストリビューションの**設定 > ビヘイビア > 編集 > 関数**で見つけることができます。 - * **ビューワーリクエスト - 関数タイプ:** CloudFrontの関数。 - * **ビューワーリクエスト - 関数 ARN:** 前のステップで作成した機能を選択します。 - -### CloudFrontのエラーページのセットアップ - -S3はデフォルトで、ファイルが見つからなかった場合には404エラーを、ファイルがプライベートであった場合には403エラーを返します。いずれの場合でも、ユーザーは汚いXMLエラーページを見ることとなります。 - -これを変更するには、CloudFrontディストリビューションの**設定 > エラーページ**に**カスタムエラーレスポンス**を追加します。 - -1. 404エラーのためのカスタムエラーレスポンスを以下の値で設定します: - * **HTTPエラーコード:** 404: Not Found - * **エラーレスポンスをカスタマイズ:** Yes - * **レスポンスページのパス:** `/index.html` - * **HTTPレスポンスコード:** 200: OK - -2. 403エラーのためのカスタムエラーレスポンスを以下の値で設定します: - * **HTTPエラーコード:** 403: Forbidden - * **エラーレスポンスをカスタマイズ:** Yes - * **レスポンスページのパス:** `/index.html` - * **HTTPレスポンスコード:** 200: OK - - :::tip - ベストなユーザー体験のために、プロジェクトに[カスタム404エラーページを作成](/ja/basics/astro-pages/#カスタム404エラーページ)し、**レスポンスページのパス**を`/404.html`にセットすることもできます。 - ::: - -## GitHubアクションによる継続的デプロイメント - -AWSで継続的デプロイを設定する方法はたくさんあります。GitHub上でホストされているコードの場合、[GitHub Actions](https://github.com/features/actions) を使ってコミットをプッシュするたびにウェブサイトをデプロイする方法があります。 - -1. AWSアカウントで[IAM](https://aws.amazon.com/iam/)を使って、以下の権限で新しいポリシーを作成します。このポリシーによって、ビルドしたファイルをS3バケットにアップロードしたり、コミットをプッシュしたときにCloudFrontの配布ファイルを無効にしたりできるようになります。 - - ```json - { - "Version": "2012-10-17", - "Statement": [ - { - "Sid": "VisualEditor0", - "Effect": "Allow", - "Action": [ - "s3:PutObject", - "s3:ListBucket", - "s3:DeleteObject", - "cloudfront:CreateInvalidation" - ], - "Resource": [ - "", - "arn:aws:s3:::/*", - "arn:aws:s3:::" - ] - } - ] - } - ``` - - :::caution - ``と``を忘れずに置き換えてください。ARNは**CloudFront > ディストリビューション > 詳細**で確認できます。 - ::: - -2. 新しいIAMユーザーを作成し、そのユーザーにポリシーをアタッチします。これにより、`AWS_SECRET_ACCESS_KEY`と`AWS_ACCESS_KEY_ID`が提供されます。 - -3. 以下のサンプルワークフローをあなたのリポジトリの`.github/workflows/deploy.yml`に追加し、GitHubにプッシュしてください。`AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY`、`BUCKET_ID`、および `DISTRIBUTION_ID`を、GitHubリポジトリの**Settings** > **Secrets** > **Actions**から"secrets"として追加する必要があります。New repository secretをクリックして、各値を追加します。 - - ```yaml - name: Deploy Website - - on: - push: - branches: - - main - - jobs: - deploy: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: us-east-1 - - name: Install modules - run: npm ci - - name: Build application - run: npm run build - - name: Deploy to S3 - run: aws s3 sync --delete ./dist/ s3://${{ secrets.BUCKET_ID }} - - name: Create CloudFront invalidation - run: aws cloudfront create-invalidation --distribution-id ${{ secrets.DISTRIBUTION_ID }} --paths "/*" - ``` - - :::note - `BUCKET_ID`はS3バケットの名前です。`DISTRIBUTION_ID`はCloudFrontのディストリビューションIDです。CloudFrontのディストリビューションIDは**CloudFront > ディストリビューション > ID**で確認できます。 - ::: diff --git a/src/content/docs/ja/guides/deploy/buddy.mdx b/src/content/docs/ja/guides/deploy/buddy.mdx deleted file mode 100644 index bc61aad49b723..0000000000000 --- a/src/content/docs/ja/guides/deploy/buddy.mdx +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: AstroサイトをBuddyにデプロイする -description: BuddyでAstroサイトをデプロイする方法。 -type: deploy -i18nReady: true ---- - -[Buddy](https://buddy.works/)は、サイトをビルドしてFTPサーバーやクラウドホスティングプロバイダーなどのさまざまなデプロイターゲットにプッシュできるCI/CDソリューションです。 - -:::note -Buddy自体はサイトをホストしません。代わりに、ビルドプロセスを管理し、選択したデプロイプラットフォームにビルドの結果を配信します。 -::: - -## デプロイ方法 - -1. [**Buddy**アカウントを作成](https://buddy.works/sign-up)します。 -2. 新しくプロジェクトを作成し、gitリポジトリ(GitHub、GitLab、BitBucket、任意のプライベートGitリポジトリ、またはBuddy Gitホスティングを使用できます)に接続します。 -3. 新しいパイプラインを追加します。 -4. 新しく作成されたパイプラインに[**Node.js**](https://buddy.works/actions/node-js)アクションを追加します。 -5. このアクションに以下を追加します。 - - ```bash - npm install - npm run build - ``` - -6. デプロイアクションを追加します。選択肢はたくさんありますが、[Buddyのアクションカタログ](https://buddy.works/actions)から閲覧できます。設定が異なる場合がありますが、**ソースパス**を `dist` に設定することを忘れないでください。 -7. **Run**ボタンを押します。 \ No newline at end of file diff --git a/src/content/docs/ja/guides/deploy/cleavr.mdx b/src/content/docs/ja/guides/deploy/cleavr.mdx deleted file mode 100644 index 1388c83ec6b16..0000000000000 --- a/src/content/docs/ja/guides/deploy/cleavr.mdx +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: AstroサイトをCleavrにデプロイする -description: Cleavrを使ってVPSサーバーにAstroサイトをデプロイする方法。 -type: deploy -i18nReady: true ---- - -Astroサイトを[Cleavr](https://cleavr.io/)を使ってVPSサーバーにデプロイできます。Cleavrは、サーバーとアプリのデプロイ管理ツールです。 - -:::tip -[Cleavr公式ドキュメントのAstroガイド](https://docs.cleavr.io/guides/astro)をご覧ください。 -::: - -## 前提条件 - -まず初めに、以下が必要です。 - -- Cleavrアカウント -- VPSプロバイダーでCleavrを使用しているサーバー - -## サイトの追加 - -1. Cleavrに移動し、Astroプロジェクトを追加するサーバーに移動します - -2. **Add Site**を選択し、ドメイン名などのアプリケーションの詳細を入力します - -3. **App Type**で、Astroアプリをどのように設定するかに応じて、'NodeJS Static'または'NodeJS SSR'を選択します - -4. 静的アプリの場合は、**Artifact Folder**を`dist`に設定します - -5. SSRアプリの場合は、以下の設定を行います - - **Entry Point**を`entry.mjs`に設定します - - **Artifact Folder**を`dist/server`に設定します - -6. サイトをサーバーに追加するには、**Add**を選択します - - -## 設定とデプロイ - -1. サイトが追加されたら、**Setup and deploy**をクリックします - -2. Astroプロジェクトの**VCプロファイル**、**リポジトリ**、**ブランチ**を選択します - -3. プロジェクトに必要な追加設定を行います - -4. **Deployments**タブをクリックし、**Deploy**をクリックします - -これでAstroアプリケーションのデプロイ完了です! \ No newline at end of file diff --git a/src/content/docs/ja/guides/deploy/cloudflare.mdx b/src/content/docs/ja/guides/deploy/cloudflare.mdx deleted file mode 100644 index 939ecba507ba3..0000000000000 --- a/src/content/docs/ja/guides/deploy/cloudflare.mdx +++ /dev/null @@ -1,147 +0,0 @@ ---- -title: AstroサイトをCloudflare Pagesにデプロイする -description: Cloudflare Pagesを使用してAstroサイトをデプロイする方法。 -type: deploy -i18nReady: true ---- -import ReadMore from '~/components/ReadMore.astro' - -[Cloudflare Pages](https://pages.cloudflare.com/)は、フロントエンド開発者が静的ウェブサイト(JAMstack)やSSRウェブサイトを共同でデプロイするためのプラットフォームです。 - -このガイドには以下の内容が含まれています。 - -- [Cloudflare Pagesダッシュボードからデプロイする方法](#gitを使ったサイトのデプロイ方法) -- [CloudflareのCLIであるWranglerを使ったデプロイ方法](#wranglerを使ったサイトのデプロイ方法) -- [SSRサイトを`@astrojs/cloudflare`を使ってデプロイする方法](#ssrサイトのデプロイ方法) - -## 前提条件 - -始めるには、以下のものが必要です。 - -- Cloudflareアカウント。まだお持ちでない場合は、無料のCloudflareアカウントを作成できます。 -- アプリのコードが[GitHub](https://github.com/)または[GitLab](https://about.gitlab.com/)リポジトリにプッシュされていること。 - -## Gitを使ったサイトのデプロイ方法 - -1. Cloudflare Pagesで新しいプロジェクトを作成します。 -2. コードをgitリポジトリ(GitHub、GitLab)にプッシュする。 -3. Cloudflareダッシュボードにログインし、**アカウントホーム** > **Pages**で自分のアカウントを選択します。 -4. **Gitに接続**オプションを選択します。 -5. デプロイしたいgitプロジェクトを選択し、**セットアップの開始**をクリックします。 -6. 以下のビルド設定を使用します。 - - - **フレームワークプリセット:** `Astro` - - **ビルドコマンド:** `npm run build` - - **ビルド出力ディレクトリ:** `dist` - -7. **保存してデプロイする**ボタンをクリックします。 - -## Wranglerを使ったサイトのデプロイ方法 - -1. [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/get-started/)をインストールします。 -2. `wrangler login`を使ってCloudflareアカウントでWranglerを認証します。 -3. ビルドコマンドを実行します。 -4. `npx wrangler pages deploy dist` を使ってデプロイします。 - -```bash -# Wrangler CLI をインストールします -npm install -g wrangler -# CLIからCloudflareアカウントにログインします -wrangler login -# ビルドコマンドを実行します -npm run build -# 新しいデプロイメントを作成します -npx wrangler pages deploy dist -``` - -アセットがアップロードされると、Wranglerはサイトを確認するためのプレビューURLを提供します。Cloudflare Pagesダッシュボードにログインすると、新しいプロジェクトが表示されます。 - -### Wranglerでローカルにプレビューを有効にする - -プレビューを機能させるには、`wrangler`をインストールする必要があります。 - -```bash -pnpm add wrangler --save-dev -``` - -これにより、プレビュースクリプトを更新して、Astro組み込みのプレビューコマンドの代わりに`wrangler`を実行できるようになりました。 - - -```json title="package.json" -"preview": "wrangler pages dev ./dist" -``` - -## SSRサイトのデプロイ方法 - -[`astrojs/cloudflare`アダプター](/ja/guides/integrations-guide/cloudflare/)を使用して、Cloudflare PagesにデプロイするためのAstro SSRサイトを構築することができます。 - -以下の手順に従って、アダプタをセットアップしてください。その後、上記のいずれかの方法でデプロイできます。 - -### クイックインストール - -以下の`astro add`コマンドを使用して、AstroプロジェクトにSSRを有効にするCloudflareアダプタを追加します。これにより、アダプタがインストールされ、`astro.config.mjs` ファイルに適切な変更が加えられます。 - -```bash -npx astro add cloudflare -``` - -### 手動インストール - -アダプターを手動でインストールする場合は、以下の2つのステップを実行してください。 - -1. お好みのパッケージマネージャを使用して、`@astrojs/cloudflare`アダプタをプロジェクトの依存関係に追加します。npmを使用しているか、よくわからない場合は、ターミナルで以下を実行します。 - - ```bash - npm install @astrojs/cloudflare - ``` - -2. `astro.config.mjs`ファイルに以下を追加します。 - - ```js title="astro.config.mjs" ins={2, 5-6} - import { defineConfig } from 'astro/config'; - import cloudflare from '@astrojs/cloudflare'; - - export default defineConfig({ - output: 'server', - adapter: cloudflare() - }); - ``` - -### 2つのモード - -現在、[`@astrojs/cloudflare`](https://github.com/withastro/astro/tree/main/packages/integrations/cloudflare#readme)アダプターでPages Functionsを使用する場合、2つのモードがサポートされています。 - -1. **アドバンス**モード: このモードは`dist`内の`_worker.js`をピックアップする`advanced`モードや、プロジェクトルートにあるfunctionsフォルダからWorkerをコンパイルするディレクトリモードで関数を実行したい場合に使用します。 - - モードが設定されていない場合、デフォルトは`"advanced"`です。 - -2. **ディレクトリ**モード: 関数を`directory`モードで実行したい場合にこのモードを使用します。つまり、アダプタはアプリのクライアントサイド部分を同じようにコンパイルしますが、ワーカースクリプトをプロジェクトルートの`functions`フォルダに移動します。アダプタはそのフォルダに`[[path]].js`を置くだけなので、プラグインやページのミドルウェアを追加して、バージョン管理でチェックすることができます。 - - ```ts title="astro.config.mjs" "directory" - export default defineConfig({ - adapter: cloudflare({ mode: "directory" }), - }); - ``` -### Pages Functionsの使用 - -[Pages Functions](https://developers.cloudflare.com/pages/platform/functions/)により、専用のサーバーを実行することなしに、サーバーサイドのコードを実行して動的な機能を実現できます。 - -使い始めるには、プロジェクトのルートに`/functions`ディレクトリを作成します。このディレクトリにPages Functionsのファイルを作成すると、指定されたルートにカスタム機能を持ったWorkerが自動的に生成されます。Functionsの書き方については、[Pages Functionsのドキュメント](https://developers.cloudflare.com/pages/platform/functions/)を参照してください。 - -[AstroでのSSR](/ja/guides/on-demand-rendering/)についてもっと読む。 - -## トラブルシューティング - -エラーが発生する場合は、ローカルで使用している`node`のバージョン(`node -v`)が環境変数で指定しているバージョンと一致しているかどうかを再確認してください。 - -Cloudflareは[Node v16.13](https://miniflare.dev/get-started/cli#installation)を必要とします。このバージョンはAstroが必要とする最小値よりも新しいので、少なくともv16.13を使用していることを再確認してください。 - -CloudflareのAuto Minify設定の結果、クライアントサイドのハイドレーションが失敗することがあります。コンソールに`Hydration completed but contains mismatches`と表示されたら、Cloudflare settingsのAuto Minifyを無効にしてください。 - -オンデマンドレンダリングするプロジェクトを[CloudflareのSSRアダプター](/ja/guides/integrations-guide/cloudflare/)を使用してビルドする際、`[Error] Could not resolve "XXXX. The package "XXXX" wasn't found on the file system but is built into node.`のようなエラーメッセージとともにサーバーがビルドに失敗する場合は、以下に注意してください。 - -- これは、サーバーサイド環境で使用しているパッケージまたはインポートが、[Cloudflare Workers runtime APIs](https://developers.cloudflare.com/workers/runtime-apis/nodejs/)と互換性がないことを意味します。 - -- Node.jsのランタイムAPIを直接インポートしている場合は、Cloudflareの[Node.jsとの互換性](/ja/guides/integrations-guide/cloudflare/#nodejsとの互換性)に関するAstroのドキュメントを参照して、これを解決するための手順を確認してください。 - -- Node.jsのランタイムAPIをインポートするパッケージをインポートしている場合は、`node:*`インポート構文をサポートしているかどうかをパッケージの作者に確認してください。サポートしていない場合は、代わりのパッケージを見つけるか、別のアダプタを使用する必要があります。 diff --git a/src/content/docs/ja/guides/deploy/deno.mdx b/src/content/docs/ja/guides/deploy/deno.mdx deleted file mode 100644 index 0da8c049f3d76..0000000000000 --- a/src/content/docs/ja/guides/deploy/deno.mdx +++ /dev/null @@ -1,178 +0,0 @@ ---- -title: AstroサイトをDenoにデプロイする -description: Denoを使ってAstroサイトをウェブにデプロイする方法。 -type: deploy -i18nReady: true ---- -import ReadMore from '~/components/ReadMore.astro' - -Astroのサーバーサイドレンダリングされたサイトを、世界中のエッジでJavaScript、TypeScript、およびWebAssemblyを実行する分散システムである[Deno Deploy](https://deno.com/deploy)にデプロイできます。 - -このガイドには、GitHub ActionsまたはDeno DeployのCLIを使用して、Deno Deployにデプロイする手順が含まれています。 - -## 必要条件 - -このガイドは、すでに[Deno](https://deno.com/)をインストールしていることを前提としています。 - -## プロジェクトの設定 - -このページは、Astroプロジェクトを[Deno Deploy](https://deno.com/deploy)にサーバーサイドレンダリングサイト(SSR)としてデプロイする手順を提供します。 - -静的サイトをデプロイする場合は、[Deno Deployの静的サイトチュートリアル](https://docs.deno.com/deploy/tutorials/static-site)を参照してください。 - -### SSR用アダプター - -AstroプロジェクトでSSR(サーバーサイドレンダリング)を有効にし、Deno Deployにデプロイするには以下の手順を実行します。 - -次の`astro add`コマンドで、AstroプロジェクトにSSRを有効にするための[Denoアダプター][Deno adapter]を追加します。このコマンドは、アダプターをインストールし、astro.config.mjsファイルに適切な変更を一括で行います。 - -```bash -npx astro add deno -``` - -アダプターを手動でインストールする場合は、以下の2つのステップを実行してください。 - -1. お好みのパッケージマネージャを使用して、[`@deno/astro-adapter`アダプター][Deno adapter]をプロジェクトの依存関係にインストールします。npmを使用している、またはよくわからない場合は、ターミナルで以下のコマンドを実行してください。 - - ```bash - npm install @deno/astro-adapter - ``` - -1. プロジェクトの設定ファイル`astro.config.mjs`を以下のように変更します。 - - ```js ins={3,6-7} - // astro.config.mjs - import { defineConfig } from 'astro/config'; - import deno from '@deno/astro-adapter'; - - export default defineConfig({ - output: 'server', - adapter: deno(), - }); - ``` - - 次に、`package.json`の`preview`スクリプトを以下のように変更します。 - - ```json del={8} ins={9} - // package.json - { - // ... - "scripts": { - "dev": "astro dev", - "start": "astro dev", - "build": "astro build", - "preview": "astro preview" - "preview": "deno run --allow-net --allow-read --allow-env ./dist/server/entry.mjs" - } - } - ``` - - 以上により、次のコマンドでDenoを使って本番のAstroサイトをローカルでプレビューできるようになりました。 - - ```bash - npm run preview - ``` - -## SSRされるAstroサイトのデプロイ方法 - -GitHub Actions、またはDeno DeployのCLI(コマンドラインインターフェイス)を使用して、Deno Deployにデプロイできます。 - -### GitHub Actionsのデプロイメント - -プロジェクトがGitHubに保存されている場合は、[Deno Deployのウェブサイト](https://dash.deno.com/)に従って、AstroサイトをデプロイするようにGitHub Actionsを設定できます。 - -1. 公開または非公開のGitHubリポジトリにコードをプッシュします。 - -1. GitHubアカウントで[Deno Deploy](https://dash.deno.com/)にサインインし、[New Project](https://dash.deno.com)をクリックします。 - -1. リポジトリとデプロイしたいブランチを選択し、**GitHub Action**モードを選択します。(Astroサイトではビルドステップが必要なため、自動モードは使用できません。) - -1. Astroプロジェクトで、`.github/workflows/deploy.yml`に新しいファイルを作成し、以下のYAMLを貼り付けます。これはDeno Deployが提供するYAMLと似ていますが、Astroサイトに必要なステップが追加されています。 - - ```yaml - name: Deploy - on: [push] - - jobs: - deploy: - name: Deploy - runs-on: ubuntu-latest - permissions: - id-token: write # Deno Deployでの認証に必要です。 - contents: read # リポジトリのクローンに必要です。 - - steps: - - name: Clone repository - uses: actions/checkout@v4 - - # npmを使用していない場合は、`npm ci`を`yarn install`または`pnpm i`に変更してください。 - - name: Install dependencies - run: npm ci - - # npmを使用していない場合は、`npm run build`を`yarn build`または`pnpm run build`に変更してください。 - - name: Build Astro - run: npm run build - - - name: Upload to Deno Deploy - uses: denoland/deployctl@v1 - with: - project: my-deno-project # TODO: Deno Deployのプロジェクト名に置き換える。 - entrypoint: server/entry.mjs - root: dist - ``` - -1. このYAMLファイルをコミットし、GitHub上の設定したdeployブランチにプッシュすると、自動的にデプロイが始まるはずです! - - GitHubリポジトリページの「Actions」タブ、または[Deno Deploy](https://dash.deno.com)で進捗を確認できます。 - - -### CLIデプロイメント - -1. [Deno Deploy CLI](https://docs.deno.com/deploy/manual/deployctl)をインストールします。 - - ```bash - deno install --allow-read --allow-write --allow-env --allow-net --allow-run --no-check -r -f https://deno.land/x/deploy/deployctl.ts - ``` - -1. Astroビルドステップを実行します。 - - ```bash - npm run build - ``` - -1. `deployctl`を実行してデプロイします! - - 以下のコマンドでは、``を[Personal Access Token](https://dash.deno.com/account#access-tokens)に、``をDeno Deployのプロジェクト名に置き換えてください。 - - ```bash - DENO_DEPLOY_TOKEN= deployctl deploy --project= --no-static --include=./dist ./dist/server/entry.mjs - ``` - - [Deno Deploy](https://dash.deno.com)ですべてのデプロイを追跡できます。 - -1.(オプション)ビルドとデプロイを1つのコマンドにまとめるには、`package.json`に`deploy-deno`スクリプトを追加します。 - - ```json ins={9} - // package.json - { - // ... - "scripts": { - "dev": "astro dev", - "start": "astro dev", - "build": "astro build", - "preview": "deno run --allow-net --allow-read --allow-env ./dist/server/entry.mjs", - "deno-deploy": "npm run build && deployctl deploy --project= --no-static --include=./dist ./dist/server/entry.mjs" - } - } - ``` - - その後、このコマンドを使用して、ワンステップでAstroサイトをビルドし、デプロイすることができます。 - - ```bash - DENO_DEPLOY_TOKEN= npm run deno-deploy - ``` - - -[AstroにおけるSSR](/ja/guides/on-demand-rendering/)についてもっと読む。 - -[Denoアダプター]: https://github.com/denoland/deno-astro-adapter diff --git a/src/content/docs/ja/guides/deploy/flightcontrol.mdx b/src/content/docs/ja/guides/deploy/flightcontrol.mdx deleted file mode 100644 index 01fdce483003c..0000000000000 --- a/src/content/docs/ja/guides/deploy/flightcontrol.mdx +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: FlightcontrolでAstroサイトをAWSにデプロイする -description: FlightcontrolでAstroサイトをAWSにデプロイする方法 -type: deploy -i18nReady: true ---- - -AWSアカウントへの完全自動デプロイを提供する[Flightcontrol](https://www.flightcontrol.dev?ref=astro)を使用して、Astroサイトをデプロイできます。 - -静的サイトとSSRサイトの両方をサポートします。 - -## デプロイ方法 - -1. [app.flightcontrol.dev/signup](https://app.flightcontrol.dev/signup?ref=astro)でFlightcontrolアカウントを作成します。 -2. [app.flightcontrol.dev/projects/new/1](https://app.flightcontrol.dev/projects/new/1)に移動します。 -3. GitHubアカウントを接続し、リポジトリを選択します。 -4. 希望する「Config Type」を選択します。 - - (すべての設定をflightcontrolのダッシュボードから管理する)`GUI`では、`Astro Static`または`Astro SSR`プリセットを選択します。 - - (すべての設定をリポジトリに含める"infrastructure as code"オプションである)`flightcontrol.json`では、Astroのサンプル設定を選択し、それを`flightcontrol.json`としてコードベースに追加します。 -5. 必要に応じて設定を調整します。 -6. 「Create Project」をクリックし、(AWSアカウントのリンクなどの)必要な手順を進めます。 - -### SSRの設定 - -SSRに対応してデプロイするには、まず[`@astrojs/node`](/ja/guides/integrations-guide/node/)アダプターを設定する必要があります。その後、上記した手順でAstroのSSRに適した設定を選択します。 diff --git a/src/content/docs/ja/guides/deploy/github.mdx b/src/content/docs/ja/guides/deploy/github.mdx deleted file mode 100644 index 7933d64286c07..0000000000000 --- a/src/content/docs/ja/guides/deploy/github.mdx +++ /dev/null @@ -1,150 +0,0 @@ ---- -title: AstroサイトをGitHub Pagesにデプロイする -description: GitHub Pagesを使ってAstroサイトをウェブにデプロイする方法。 -type: deploy -i18nReady: true ---- -import { Steps } from '@astrojs/starlight/components'; - -[GitHub Pages](https://pages.github.com/)を使って、[GitHub.com](https://github.com/)上のリポジトリから直接Astroウェブサイトをホストすることができます。 - -## デプロイ方法 - -[GitHub Actions](https://github.com/features/actions)を使うことで、AstroサイトをGitHub Pagesに自動的にビルドしてデプロイすることができます。これを行うには、ソースコードがGitHubでホストされている必要があります。 - -Astroは公式の`withastro/action`を保守しており、ほとんど設定することなくプロジェクトをデプロイすることができます。以下の手順に従って、AstroサイトをGitHubページにデプロイしてください。さらに詳しい情報が必要な場合は、[パッケージのREADME](https://github.com/withastro/action)を参照してください。 - -## GitHub Pages用Astroの設定 - -### `github.io`のURLにデプロイする - -`astro.config.mjs`に[`site`](/ja/reference/configuration-reference/#site)と[`base`](/ja/reference/configuration-reference/#base)オプションを設定します。 - -```js title="astro.config.mjs" ins={4-5} -import { defineConfig } from 'astro/config' - -export default defineConfig({ - site: 'https://astronaut.github.io', - base: 'my-repo', -}) -``` - -#### `site` - -`site`の値は以下のいずれかでなければなりません。 - -- あなたのユーザー名に基づいた次のようなURL:`https://.github.io` -- [GitHub Organizationのプライベートページ](https://docs.github.com/ja/enterprise-cloud@latest/pages/getting-started-with-github-pages/changing-the-visibility-of-your-github-pages-site) 向けに自動生成されたランダムなURL:`https://.pages.github.io/` - -#### `base` - -Astroがあなたのリポジトリ名(例:`/my-repo`)をウェブサイトのルートとして扱うように`base`の値が必要な場合があります。 - -:::note -以下の場合は`base`パラメータを設定しないでください。 - -- ページがルートフォルダから配信されている場合。 -- リポジトリが`https://github.com//.github.io`にある場合。 -::: - -`base`には、`/my-blog`のように、スラッシュで始まるリポジトリ名を指定します。これは、Astroがあなたのウェブサイトのルートがデフォルトの`/`ではなく、`/my-repo`であることを理解できるようにするためです。 - -:::caution -この値が設定されている場合、すべての内部ページリンクの先頭に`base`の値を付与する必要があります。 - -```astro ins="/my-repo" -About -``` - -詳細はこちら:[`base`値の設定方法](/ja/reference/configuration-reference/#base) -::: - -### カスタムドメインでGitHub pagesを使う - -:::tip[カスタムドメインの設定] -以下の`./public/CNAME`ファイルをプロジェクトに追加することで、カスタムドメインを設定できます。 - -```js title="public/CNAME" -sub.mydomain.com -``` - -こうすることで、`user.github.io`の代わりにあなたのカスタムドメインにサイトがデプロイされます。[あなたのドメインプロバイダの設定](https://docs.github.com/ja/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site#configuring-a-subdomain)も忘れずに行ってください。 -::: - -カスタムドメインでGitHub pagesを使用するようにAstroを設定するには、`site`の値にドメインを設定します。`base`には値を設定しないでください。 - -```js title="astro.config.mjs" ins={4} -import { defineConfig } from 'astro/config' - -export default defineConfig({ - site: 'https://example.com', -}) -``` - -## GitHub Actionの設定 - - -1. プロジェクトの`.github/workflows/deploy.yml`に新しいファイルを作成し、以下のYAMLを貼り付けます。 - - ```yaml title="deploy.yml" - name: Deploy to GitHub Pages - - on: - # `main`ブランチにプッシュするたびにワークフローを実行します。 - # 異なるブランチ名を使用する場合は、`main`をブランチ名に置き換えてください。 - push: - branches: [ main ] - # このワークフローをGitHubのActionsタブから手動で実行できるようにします。 - workflow_dispatch: - - # このジョブがリポジトリをクローンし、ページデプロイメントを作成することを許可します。 - permissions: - contents: read - pages: write - id-token: write - - jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Checkout your repository using git - uses: actions/checkout@v4 - - name: Install, build, and upload your site - uses: withastro/action@v3 - # with: - # path: . # リポジトリ内のAstroプロジェクトのルートロケーション。(オプション) - # node-version: 20 # サイト構築に使用するNodeのバージョン。デフォルトは20です。(オプション) - # package-manager: pnpm@latest # 依存関係のインストールとサイトのビルドに使用するNodeパッケージマネージャ。ロックファイルに基づいて自動的に検出されます。(オプション) - - deploy: - needs: build - runs-on: ubuntu-latest - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 - ``` - - :::note - astroアクションはいくつかのオプション入力を受け取ります。これらの入力は`with:`行と使いたい入力のコメントアウトを外すことで指定できます。 - ::: - - :::caution - 公式のAstro [action](https://github.com/withastro/action)はロックファイルをスキャンして、お好みのパッケージマネージャ (`npm`、`yarn`、`pnpm`、`bun`) を検出します。パッケージマネージャが自動的に生成した`package-lock.json`、`yarn.lock`、`pnpm-lock.yaml`、`bun.lockb`ファイルをリポジトリにコミットしてください。 - ::: - -2. GitHubで、リポジトリの**Settings**タブに行き、設定の**Pages**セクションを見つけてください。 - -3. サイトの**Source**として**GitHub Actions**を選択します。 - -4. 新しいワークフローファイルをコミットし、GitHubにプッシュします。 - - -これでサイトが公開されたはずです!Astroプロジェクトのリポジトリに変更をプッシュすると、GitHub Actionが自動的にデプロイしてくれます。 - -## 例 - -- [Github Pages Deployment](https://github.com/hkbertoson/github-pages) diff --git a/src/content/docs/ja/guides/deploy/gitlab.mdx b/src/content/docs/ja/guides/deploy/gitlab.mdx deleted file mode 100644 index 4c100b1f9dc03..0000000000000 --- a/src/content/docs/ja/guides/deploy/gitlab.mdx +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: AstroサイトをGitLab Pagesにデプロイする -description: GitLab Pagesを使ってAstroサイトをウェブにデプロイする方法。 -type: deploy -i18nReady: true ---- - -[GitLab Pages](https://pages.gitlab.io/)を使って、[GitLab](https://about.gitlab.com/)のプロジェクトやグループ、ユーザーアカウント用のAstroサイトをホストすることができます。 - -:::tip[例をお探しですか?] -[公式GitLab Pages Astroサンプルプロジェクト](https://gitlab.com/pages/astro)を確認してください! -::: - -## デプロイ方法 - -1. `astro.config.mjs`に正しい`site`を設定します。 -2. `public/`ディレクトリを`static`にリネームします. -3. `astro.config.mjs`に`outDir:public`を設定します。この設定は、静的ビルドの出力をGitLab Pagesがファイルを公開するために必要なフォルダである`public`というフォルダに置くようにAstroに指示します。 - - [`public/`ディレクトリ](/ja/basics/project-structure/#public)をAstroプロジェクトで静的ファイルのソースとして使用していた場合は、名前を変更し、`astro.config.mjs`の`publicDir`の値に新しいフォルダ名を指定します。 - - 例えば、`public/`ディレクトリを`static/`にリネームした場合の`astro.config.mjs`の正しい設定は以下の通りです。 - - ```js - import { defineConfig } from 'astro/config'; - - export default defineConfig({ - site: 'https://.gitlab.io', - base: '/', - outDir: 'public', - publicDir: 'static', - }); - ``` - -4. プロジェクトのルートに`.gitlab-ci.yml`というファイルを以下の内容で作成します。これにより、コンテンツを変更するたびにサイトをビルドしてデプロイすることができます。 - - ```yaml - pages: - # アプリのビルドに使用するDockerイメージ - image: node:lts - - before_script: - - npm ci - - script: - # アプリのビルドに必要な手順をここで指定します - - npm run build - - artifacts: - paths: - # 公開するビルド済みのファイルを含むフォルダ。 - # "public"を指定する必要があります。 - - public - - only: - # 以下のブランチへのプッシュがある時のみに、新しいビルドとデプロイをトリガーします。 - - main - ``` diff --git a/src/content/docs/ja/guides/deploy/google-cloud.mdx b/src/content/docs/ja/guides/deploy/google-cloud.mdx deleted file mode 100644 index f0230438d1312..0000000000000 --- a/src/content/docs/ja/guides/deploy/google-cloud.mdx +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: AstroサイトをGoogle Cloudにデプロイする -description: Google CloudでAstroサイトをウェブにデプロイする方法。 -type: deploy -i18nReady: true ---- - -フル機能のWebアプリホスティングプラットフォーム[Google Cloud](https://cloud.google.com/)で、Astroサイトをデプロイできます。 - -## デプロイ方法 - -### Cloud Storage (静的配信のみ) - -1. [新しいGCPのプロジェクトを作成](https://console.cloud.google.com/projectcreate)、または既存のプロジェクトを選択します。 - -2. [Cloud Storage](https://cloud.google.com/storage)で新しいバケットを作成します。 - -3. バケットに名前を付け、その他必要な設定を行います。 - -4. `dist`フォルダをバケットにアップロードするか、[Cloud Build](https://cloud.google.com/build)を使用してアップロードします。 - -5. 新しく`Storage オブジェクト閲覧者`という権限を`allUsers`に追加して、公開アクセスを有効にします。 - -6. Webサイトの設定を編集し、エントリポイントとして`ìndex.html`を、エラーページとして`404.html`を追加します。 - -### Cloud Run (SSRと静的配信) - -Cloud Runはインフラストラクチャを管理せずにコンテナを実行できるサーバーレスプラットフォームです。 静的サイトとSSRサイトの両方のデプロイに使用できます。 - -#### サービスの準備 - -1. [新しいGCPのプロジェクトを作成](https://console.cloud.google.com/projectcreate)、または既存のプロジェクトを選択します。 - -2. [Cloud Run API](https://console.cloud.google.com/apis/library/run.googleapis.com)が有効になっていることを確認してください。 - -3. 新しいサービスを作成します。 - -#### Dockerfileの作成とコンテナのビルド - -AstroのサイトをCloud Runにデプロイする前に、コンテナのビルドに使用されるDockerfileを作成する必要があります。[AstroでDockerを使用する方法](/ja/recipes/docker/#dockerfileを作成する)の詳細はレシピセクションをご覧ください。 - -Dockerfileが作成されたら、イメージをビルドしてGoogle Cloudにプッシュします。これを実現するには、いくつかの方法があります: - -**Dockerを使用してローカルでビルドする**: - -`docker build`コマンドを使用してイメージをビルドし、`docker tag`でタグを付け、`docker push`でレジストリにプッシュします。Google Cloudの場合、[`Artifact Registry`](https://cloud.google.com/artifact-registry/docs/docker/pushing-and-pulling)が最も簡単なオプションですが、[Docker Hub](https://hub.docker.com/)を使用することもできます。 - -```bash -# コンテナをビルドします -docker build . - -docker tag SOURCE_IMAGE HOSTNAME/PROJECT-ID/TARGET-IMAGE:TAG - -# イメージをレジストリにプッシュします -docker push HOSTNAME/PROJECT-ID/IMAGE:TAG -``` - -プロジェクトに合わせて、上記のコマンド内の次の値を変更します。 - -- `SOURCE_IMAGE`: ローカルイメージ名またはイメージID。 -- `HOSTNAME`: レジストリのホスト(`gcr.io`, `eu.gcr.io`, `asia.gcr.io`, `us.gcr.io`)。 -- `PROJECT`: Google CloudのプロジェクトID。 -- `TARGET-IMAGE`: レジストリに保存された時のイメージ名。 -- `TAG`はイメージに関連付けられたバージョンです。 - - -[詳細はGoogle Cloudのドキュメントをご覧ください。](https://cloud.google.com/artifact-registry/docs/docker/pushing-and-pulling) - -**他のツールを使用する**: - -[GitHub Actions](https://github.com/marketplace/actions/push-to-gcr-github-action)のような、DockerをサポートするCI/CDツールを使用できます。 - -**[Cloud Build](https://cloud.google.com/build)を使用してビルドする**: - -Dockerfileをローカルでビルドする代わりに、イメージをリモートでビルドするようにGoogle Cloudに指示できます。[Google Cloud Buildのドキュメント](https://cloud.google.com/build/docs/build-push-docker-image)を参照してください。 - -#### コンテナのデプロイ - -デプロイは[`gcloud`を使用して](https://cloud.google.com/run/docs/deploying#service)ターミナルで手動で行うことも、[Cloud Build](https://cloud.google.com/build)やその他のCI/CDシステムを使用して自動的に行うこともできます。 - -:::note[公開アクセスが必要ですか?] -Cloud Runの権限設定の`allUsers`グループに`Cloud Run 起動元`権限を追加することを忘れないでください! -::: diff --git a/src/content/docs/ja/guides/deploy/google-firebase.mdx b/src/content/docs/ja/guides/deploy/google-firebase.mdx deleted file mode 100644 index e31ed414e1628..0000000000000 --- a/src/content/docs/ja/guides/deploy/google-firebase.mdx +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: AstroサイトをGoogleのFirebase Hostingにデプロイする -description: GoogleのFirebase HostingによりAstroサイトをウェブにデプロイする方法。 -type: deploy -i18nReady: true ---- - -Googleのアプリ開発プラットフォーム[Firebase](https://firebase.google.com/)が提供するサービス[Firebase Hosting](https://firebase.google.com/products/hosting)で、Astroサイトをデプロイできます。 - -データベース、認証、ストレージなどの[Firebaseバックエンドサービスの追加](/ja/guides/backend/google-firebase/)については、別のガイドを参照してください。 - -## デプロイ方法 - -1. [firebase-tools](https://www.npmjs.com/package/firebase-tools)がインストールされていることを確認してください。 - -2. `firebase.json`と`.firebaserc`をプロジェクトのルートに作成し、次の内容を記入します。 - - `firebase.json`: - - ```json - { - "hosting": { - "public": "dist", - "ignore": [] - } - } - ``` - - `.firebaserc`: - - ```json - { - "projects": { - "default": "" - } - } - ``` - -3. `npm run build`の実行後、`firebase deploy`コマンドを使用してデプロイします。 diff --git a/src/content/docs/ja/guides/deploy/heroku.mdx b/src/content/docs/ja/guides/deploy/heroku.mdx deleted file mode 100644 index 7ac09e45598ba..0000000000000 --- a/src/content/docs/ja/guides/deploy/heroku.mdx +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: AstroサイトをHerokuにデプロイする -description: Herokuを使ってAstroサイトをウェブにデプロイする方法。 -type: deploy -i18nReady: true ---- - -[Heroku](https://www.heroku.com/)は、クラウド上でモダンアプリを構築、実行、管理するためのPlatform as a Serviceです。このガイドを使用して、AstroサイトをHerokuにデプロイできます。 - -:::danger -以下の手順は、[非推奨の`heroku-static-buildpack`](https://github.com/heroku/heroku-buildpack-static#warning-heroku-buildpack-static-is-deprecated)を使用しています。代わりに[`heroku-buildpack-nginx`に関するHerokuのドキュメント](https://github.com/dokku/heroku-buildpack-nginx)を参照してください。 -::: - -## デプロイ方法 - -1. [Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli)をインストールします。 - -2. [サインアップ](https://signup.heroku.com/)してHerokuアカウントを作成します。 - -3. `heroku login`を実行し、Herokuの認証情報を入力します。 - - ```bash - $ heroku login - ``` - -4. プロジェクトのルートに`static.json`というファイルを以下の内容で作成します。 - - ```json title="static.json" - { - "root": "./dist" - } - ``` - -詳しくは[heroku-buildpack-static](https://github.com/heroku/heroku-buildpack-static)をご覧ください。 - -5. Herokuのgitリモートを設定します。 - - ```bash - # バージョン変更 - $ git init - $ git add . - $ git commit -m "My site ready for deployment." - - # 指定した名前で新しいアプリを作成する - $ heroku apps:create example - - # 静的サイトのビルドパックを設定する - $ heroku buildpacks:set https://github.com/heroku/heroku-buildpack-static.git - ``` - -6. サイトをデプロイします。 - - ```bash - # サイトを公開する - $ git push heroku master - - # ブラウザを開き、Heroku CIのダッシュボード版を表示します。 - $ heroku open - ``` diff --git a/src/content/docs/ja/guides/deploy/index.mdx b/src/content/docs/ja/guides/deploy/index.mdx deleted file mode 100644 index e551b5b02b545..0000000000000 --- a/src/content/docs/ja/guides/deploy/index.mdx +++ /dev/null @@ -1,116 +0,0 @@ ---- -title: Astroサイトのデプロイ -description: WebにAstroサイトをデプロイする方法。 ---- -import DeployGuidesNav from '~/components/DeployGuidesNav.astro'; -import PackageManagerTabs from '~/components/tabs/PackageManagerTabs.astro' -import { Steps } from '@astrojs/starlight/components' - -**Astroサイトをビルド・デプロイする準備ができましたか?** さまざまなデプロイサービスのガイドに従うか、スクロールしてAstroサイトをデプロイする全般的なガイダンスを参照してください。 - -## デプロイガイド - - - -## クイックデプロイ・オプション - -Astroのサイトは、WebサイトのダッシュボードUIまたはCLIを使用して、多くのホストに短時間でビルド・デプロイできます。 - -### WebサイトUI - -Webサイトをデプロイする手っ取り早い方法は、AstroプロジェクトのオンラインGitリポジトリ(例:GitHub, GitLab, Bitbucket)をホストプロバイダーに接続し、Gitを使用した継続的デプロイを使用することです。 - -これらのホストプラットフォームは自動的にAstroプロジェクトのソースリポジトリへのプッシュを検出し、サイトをビルドして、カスタムURLまたは個人のドメインでWebにデプロイします。多くの場合、これらのプラットフォームにおけるデプロイの設定は以下のような手順に従います: - - -1. リポジトリをオンラインのGitプロバイダー(例:GitHub, GitLab, Bitbucket)に追加してください。 - -2. **継続的デプロイ**をサポートするホスト(例:[Netlify](/ja/guides/deploy/netlify/) または [Vercel](/ja/guides/deploy/vercel/))を選択し、新しいサイト/プロジェクトとしてGitリポジトリをインポートしてください。 - - 多くの一般的なホストはプロジェクトをAstroサイトとして認識し、以下のようにビルド・デプロイに適切な構成設定を選択するはずです。(もしそうでない場合は、これらの設定は変更できます。) - - :::note[デプロイの設定] - - **ビルドコマンド:** `astro build` または `npm run build` - - **公開ディレクトリ:** `dist` - ::: - -3. 「デプロイ」をクリックすると、新しいWebサイトがそのホストのユニークなURLに作成されます(例: `new-astro-site.netlify.app`)。 - - -ホストはGitプロバイダーのmainブランチの変更を監視し、新しいコミットがあるたびにサイトを再ビルド・再公開するよう自動的に設定します。これらの設定は通常、ホストプロバイダーのダッシュボードUI上で行うことができます。 - -### CLIを使用したデプロイ - -いくつかのホストは、npmを使用したあなたのマシンにグローバルにインストールできる独自のコマンドライン・インターフェース(CLI)を備えています。多くの場合、CLIを使用してデプロイする方法は以下のようになります: - - -1. ホストのCLIをグローバルにインストールします。例: - - - - ```shell - npm install --global netlify-cli - ``` - - - ```shell - pnpm add --global netlify-cli - ``` - - - ```shell - yarn global add netlify-cli - ``` - - - -2. CLIを実行し、認証、セットアップ等の指示に従います。 - -3. サイトをビルドしてホストにデプロイします。 - - 多くの一般的なホストは、サイトをビルドしデプロイしてくれます。それらは通常、プロジェクトをAstroサイトとして認識し、以下のようにビルド・デプロイのための適切な設定を選択するはずです。(もしそうでない場合は、これらの設定は変更可能です。) - - :::note[デプロイの設定] - - **ビルドコマンド:** `astro build` or `npm run build` - - **公開ディレクトリ:** `dist` - ::: - - その他のホストでは[ローカルでサイトをビルド](#ローカルでサイトをビルドする)しコマンドラインを使用してデプロイする必要があります。 - - -## ローカルでサイトをビルドする - -NetlifyやVercelのような多くのホストはサイトをビルドしてそのビルド出力をWebに公開してくれます。しかし、サイトによっては、ローカルでビルドし、デプロイコマンドを実行するか、ビルド出力をアップロードする必要があります。 - -また、ローカルでビルドしてサイトをプレビューしたり、潜在的なエラーや警告を自分の環境でキャッチしたりすることもできます。 - -Astroサイトをビルドするには、`npm run build`コマンドを実行してください。 - - - - ```shell - npm run build - ``` - - - ```shell - pnpm run build - ``` - - - ```shell - yarn run build - ``` - - - -デフォルトでは、ビルド出力は`dist/`に配置されます。この場所は[`outDir`設定オプション](/ja/reference/configuration-reference/#outdir)を使って変更できます。 - -## SSR用アダプターを追加する - -:::note -[SSR(サーバーサイド・レンダリング)](/ja/guides/on-demand-rendering/)を有効化してAstroサイトをデプロイする前に、確認してください: - -- [適切なアダプター](/ja/guides/on-demand-rendering/)がプロジェクトの依存関係にインストールされていること(手動、またはアダプターの`astro add`コマンドを使用します。例: `npx astro add netlify`) -- 手動インストール時に`astro.config.mjs`ファイルのimportとdefault exportに[アダプター](/ja/reference/configuration-reference/#integrations)を追加していること(このステップは `astro add` コマンドが代行します!) -::: diff --git a/src/content/docs/ja/guides/deploy/kinsta.mdx b/src/content/docs/ja/guides/deploy/kinsta.mdx deleted file mode 100644 index 28ff43faa6944..0000000000000 --- a/src/content/docs/ja/guides/deploy/kinsta.mdx +++ /dev/null @@ -1,94 +0,0 @@ ---- -title: AstroサイトをKinstaのアプリケーションホスティングにデプロイする -description: KinstaのアプリケーションホスティングにAstroサイトをデプロイする方法。 -type: deploy -i18nReady: true ---- - -[Kinstaのアプリケーションホスティング](https://kinsta.com/application-hosting/)を利用して、クラウドホスティング上でAstroサイトをホストできます。 - -## Astroプロジェクトの設定 - -### 静的ホスティング -:::tip[例をお探しですか?] -[Astroのための公式Kinstaアプリケーションホスティングスタータープロジェクト](https://github.com/kinsta/hello-world-astro)をチェックしてみてください! -::: - -**Kinstaのアプリケーションホスティング**であなたのプロジェクトをホストするには、次のことが必要です。 -- `package.json`に`name`フィールドを含めます。(これは何でもよく、デプロイには影響しません。) -- `package.json`に`build`スクリプトを含めます。(あなたのAstroプロジェクトは既にこれを含んでいるはずです。) -- [`serve`](https://www.npmjs.com/package/serve)パッケージをインストールし、`start`スクリプトを`serve dist/`に設定します。 - -以下は、`package.json`ファイルに必要な行です。 -```json title="package.json" {2,5,6} ins={12} "serv dist/" -{ - "name": "anything", // これは必須ですが、値はなんでも良いです。 - "scripts": { - "dev": "astro dev", - "start": "serve dist/", - "build": "astro build", - "preview": "astro preview", - "astro": "astro" - }, - "dependencies": { - "astro": "^2.2.0", - "serve": "^14.0.1" - }, -} -``` - -### SSR -:::tip[例をお探しですか?] -[Astro SSRのための公式Kinstaアプリケーションホスティングスタータープロジェクト](https://github.com/kinsta/hello-world-astro-ssr)をチェックしてみてください! -::: - -**Kinstaのアプリケーションホスティング**であなたのプロジェクトをホストするには、次のことが必要です。 -- `package.json`に`name`フィールドを含めます。(これは何でもよく、デプロイには影響しません。) -- `package.json`に`build`スクリプトを含めます。(あなたのAstroプロジェクトは既にこれを含んでいるはずです。) -- [`astrojs/node`](https://www.npmjs.com/package/@astrojs/node)パッケージをインストールし、`start`スクリプトを`node ./dist/server/entry.mjs`に設定します。 -- `astro.config.mjs`で`@astrojs/node`を使用し、`host: true`を使用するように設定します。 - -以下は、`package.json`ファイルに必要な行です。 -```json title="package.json" {2,5,6} ins={12} "node ./dist/server/entry.mjs" -{ - "name": "anything", // これは必須ですが、値はなんでも良いです。 - "scripts": { - "dev": "astro dev", - "start": "node ./dist/server/entry.mjs", - "build": "astro build", - "preview": "astro preview", - "astro": "astro" - }, - "dependencies": { - "astro": "^2.2.0", - "@astrojs/node": "^5.1.1" - }, -} -``` - -以下は、`astro.config.mjs`ファイルに必要な行です。 -```js title="astro.config.mjs" - import { defineConfig } from 'astro/config'; - import node from "@astrojs/node"; - - export default defineConfig({ - output: 'server', - adapter: node({ - mode: "standalone" - }), - server: { - host: true - } - }); -``` - -## デプロイ方法 -プロジェクトのGitHubリポジトリが接続されると、**MyKinsta管理パネル**でKinstaのアプリケーションホスティングへの手動デプロイをトリガーできます。また、管理パネルで自動デプロイを設定できます。 - -### 新しいKinstaアプリケーションの設定 -1. [MyKinsta](https://my.kinsta.com/)管理パネルにアクセスします。 -2. **アプリケーション**タブに移動します。 -3. GitHubリポジトリを接続します。 -4. **アプリケーション** > **アプリケーションを追加**ボタンを押します。 -5. ウィザードの手順に従ってください。 -6. アプリケーションがデプロイされます。 diff --git a/src/content/docs/ja/guides/deploy/microsoft-azure.mdx b/src/content/docs/ja/guides/deploy/microsoft-azure.mdx deleted file mode 100644 index bdbf6a6d81970..0000000000000 --- a/src/content/docs/ja/guides/deploy/microsoft-azure.mdx +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: AstroサイトをMicrosoft Azureにデプロイする -description: Microsoft AzureでAstroサイトをウェブにデプロイする方法。 -type: deploy -i18nReady: true ---- - -[Azure](https://azure.microsoft.com/)はMicrosoftのクラウドプラットフォームです。Microsoft Azureの[Static Web Apps](https://aka.ms/staticwebapps)サービスを使用してAstroサイトをデプロイできます。 - -このガイドでは、Visual Studio Codeを使用してGitHubに保存されているAstroサイトをデプロイする方法を説明します。その他のセットアップについては、[Azure Pipelinesタスク](https://learn.microsoft.com/ja-jp/azure/devops/pipelines/tasks/reference/azure-static-web-app-v0?view=azure-pipelines)の使用に関するMicrosoftのガイドをご覧ください。 - -## 前提条件 - -このガイドを進めるためには以下が必要です。 - -- Azureのアカウントとサブスクリプションキー。[ここで無料のAzureアカウント](https://azure.microsoft.com/free)を作成できます。 -- アプリのコードが[GitHub](https://github.com/)にプッシュされていること。 -- [Visual Studio Code](https://code.visualstudio.com/)の[SWA拡張機能](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurestaticwebapps)。 - -## デプロイ方法 - -1. プロジェクトをVS Codeで開きます。 - -2. Static Web Apps拡張機能を開いてAzureにサインインし、**+** ボタンをクリックして新しいStatic Web Appを作成します。使用するサブスクリプションキーを指定するように求められます。 - -3. 拡張機能によって起動したウィザードに従い、アプリに名前を付け、フレームワークのプリセットを選択し、アプリのルート(通常は`/`)とビルドされたファイルの場所`/dist`を指定します。AstroはAzureのビルトインテンプレートにはリストされていないため、`custom`を選択する必要があります。ウィザードが実行され、リポジトリの`.github`フォルダに[GitHub Action](https://github.com/features/actions)を作成します。(このフォルダがまだ存在していない場合は自動的に作成されます。) - -GitHub Actionがアプリをデプロイします(GitHub上のリポジトリのActionsタブから進行状況を確認できます)。正常に完了すれば、**Browse Website**ボタンをクリックしてSWA拡張機能の進行状況ウィンドウに表示されているアドレスからアプリを確認できます(これはGitHub Actionの実行後に表示されます)。 - -## 既知の問題 - -作成されるGitHub Actionのyamlはnode 14の使用を前提としています。これはAstroのビルドが失敗することを意味します。これを解決するには、プロジェクトのpackage.jsonファイルに次のスニペットを追加します。 - -``` - "engines": { - "node": ">=18.0.0" - }, -``` - -## 公式リソース - -- [Microsoft Azure Static Web Apps のドキュメント](https://learn.microsoft.com/ja-jp/azure/static-web-apps/) - -## コミュニティリソース - -- [AstroウェブサイトをAzure Static Web Appsにデプロイする](https://www.blueboxes.co.uk/deploying-an-astro-website-to-azure-static-web-apps) diff --git a/src/content/docs/ja/guides/deploy/netlify.mdx b/src/content/docs/ja/guides/deploy/netlify.mdx deleted file mode 100644 index 0bc8352ed6d95..0000000000000 --- a/src/content/docs/ja/guides/deploy/netlify.mdx +++ /dev/null @@ -1,143 +0,0 @@ ---- -title: AstroサイトをNetlifyにデプロイする -description: NetlifyでAstroサイトをウェブにデプロイする方法。 -type: deploy -i18nReady: true ---- -import ReadMore from '~/components/ReadMore.astro' - -[Netlify](https://netlify.com)は、ウェブアプリケーションや静的ウェブサイトのためのホスティングとサーバーレスバックエンドサービスを提供しています。Astroサイトは全てNetlifyでホストできます! - -このガイドは、NetlifyのウェブサイトUIまたはNetlifyのCLIを介してデプロイするための手順を説明しています。 - -## プロジェクトの設定 - -Astroプロジェクトは、静的サイト、サーバーレンダリングサイト、エッジレンダリングサイトの3つの異なる方法でNetlifyにデプロイできます。 - -### 静的サイト - -Astroプロジェクトは、デフォルトでは静的サイトです。Netlifyに静的Astroサイトをデプロイするために、特に追加の設定は必要ありません。 - -### SSR用のアダプターを追加する - -AstroプロジェクトでSSRを有効にし、NetlifyのEdge Functionsを使用してNetlifyにデプロイするには: - -以下の`astro add`コマンドで[Netlifyアダプター](/ja/guides/integrations-guide/netlify/)を追加し、AstroプロジェクトでSSRを有効にします。これによりアダプターがインストールされ、`astro.config.mjs`ファイルに適切な変更が1ステップで行われます。 - -```bash -npx astro add netlify -``` - -アダプターを手動でインストールする場合は、以下の2つのステップを実行してください。 - -1. [`@astrojs/netlify`アダプター](/ja/guides/integrations-guide/netlify/)を、パッケージマネージャーを使ってプロジェクトの依存関係にインストールします。npmをパッケージマネージャーとして使用しているかどうかわからない場合は、ターミナルで以下のコマンドを実行します。 - - ```bash - npm install @astrojs/netlify - ``` - -1. `astro.config.mjs`プロジェクト設定ファイルに新しく以下の2行を追加します。 - - ```js title="astro.config.mjs" ins={2, 5-6} - import { defineConfig } from 'astro/config'; - import netlify from '@astrojs/netlify'; - - export default defineConfig({ - output: 'server', - adapter: netlify(), - }); - ``` - - Netlifyアダプターの設定に`edgeMiddleware: true`を追加することで、NetlifyのEdge Functionsを使用してプロジェクトをデプロイすることもできます。 - - ```diff lang="js" - // astro.config.mjs - import { defineConfig } from 'astro/config'; - import netlify from '@astrojs/netlify/functions'; - - export default defineConfig({ - output: 'server', - adapter: netlify({ - + edgeMiddleware: true - }), - }); - ``` - -## デプロイ方法 - -NetlifyのウェブサイトUI、もしくはNetlifyのCLI(コマンドラインインターフェース)を使うことでデプロイできます。デプロイする方法は、静的サイトもSSRサイトも同じです。 - -### ウェブサイトUIを使ったデプロイ方法 - -GitHub、GitLab、BitBucket、またはAzure DevOpsにプロジェクトがある場合は、NetlifyのウェブサイトUIを使用してAstroサイトをデプロイできます。 - -1. [Netlifyダッシュボード](https://app.netlify.com/)でAdd a new siteをクリックします。 - -2. Import an existing projectを選択します。 - - GitプロバイダーからAstroリポジトリをインポートする場合、Netlifyが自動で正しい構成設定を事前に入力します。 - -3. 以下の設定が入力されていることを確認し、Deployボタンをクリックします。 - - - **Build Command:** `astro build`もしくは`npm run build` - - **Publish directory:** `dist` - - デプロイが完了すると、サイトの概要ページにリダイレクトされます。そこでサイトの設定を編集できます。 - -ソースリポジトリ内の変更があった際には、デプロイ設定に基づいてプレビューと本番環境のデプロイをトリガーします。 - -#### `netlify.toml`ファイル - -オプションとして、プロジェクトリポジトリのトップレベルに新しく`netlify.toml`ファイルを作成し、ビルドコマンドと公開ディレクトリ、環境変数やリダイレクトなどのプロジェクトの設定ができます。Netlifyはこのファイルを読み込み、デプロイを自動で設定します。 - -デフォルトの設定を構成するには、以下の`netlify.toml`ファイルを作成します。 - -```toml -[build] - command = "npm run build" - publish = "dist" -``` - -さらに詳しい情報は、Netlifyのブログの["既存のAstroのGitリポジトリをデプロイ"](https://www.netlify.com/blog/how-to-deploy-astro/#deploy-an-existing-git-repository-to-netlify)を参照してください。 - - -### CLIを使ったデプロイ方法 - -[Netlify CLI](https://cli.netlify.com/)を使って新しくNetlifyサイトを作成し、Gitリポジトリをリンクすることもできます。 - - -1. グローバルにNetlifyのCLIをインストールします。 - - ```bash - npm install --global netlify-cli - ``` - -2. `netlify login`を実行し、Netlifyにログインして認証します。 -3. `netlify init`を実行し、手順に沿って進めます。 -4. ビルドコマンド(`astro build`)を確認します。 - - CLIはビルドコマンド(`astro build`)とデプロイディレクトリ(`dist`)を自動で検出し、それらの設定を含んだ[`netlify.toml`ファイル](#netlifytomlファイル)を自動で生成することを選択するかどうか聞きます。 - -5. Gitにプッシュしてビルドとデプロイを行います。 - - CLIはリポジトリにデプロイキーを追加します。そのため、`git push`するたびにNetlifyでサイトが自動で再ビルドされます。 - -さらに詳しい情報は、Netlifyのブログの[Netlify CLIを使ったAstroサイトのデプロイ](https://www.netlify.com/blog/how-to-deploy-astro/#link-your-astro-project-and-deploy-using-the-netlify-cli)を参照してください。 - -### Node.jsバージョンの設定 - -Netlifyのレガシー機能[build image](https://docs.netlify.com/configure-builds/get-started/#build-image-selection) (Xenial)を使用している場合は、Node.jsの正しいバージョンが設定されていることを確認してください。AstroはNode.js`v18.14.1`以上のバージョンが必要です。 - -以下の方法で[Node.jsのバージョンをNetlify上で指定](https://docs.netlify.com/configure-builds/manage-dependencies/#node-js-and-javascript)できます。 -- ベースディレクトリ上にある[`.nvmrc`](https://github.com/nvm-sh/nvm#nvmrc)ファイル -- Netlifyプロジェクトダッシュボード上にある、サイト設定`NODE_VERSION`環境変数 - -## Netlify Functionsを使用する方法 - -Netlify FunctionsとAstroを併用して使う場合、特別な設定は必要ありません。プロジェクトルートに`netlify/functions`ディレクトリを追加し、[Netlify Functionsのドキュメント](https://docs.netlify.com/functions/overview/)に従って進めてください! - -## 例 - -- [Astroサイトのデプロイ方法](https://www.netlify.com/blog/how-to-deploy-astro/) — Netlifyブログ -- [フォーム、サーバーレスファンクション、リダイレクトを利用したAstroサイトのデプロイ](https://www.netlify.com/blog/deploy-an-astro-site-with-forms-serverless-functions-and-redirects/) — Netlifyブログ -- [開発の実演動画](https://youtu.be/GrSLYq6ZTes) — Netlify YouTubeチャンネル diff --git a/src/content/docs/ja/guides/deploy/sst.mdx b/src/content/docs/ja/guides/deploy/sst.mdx deleted file mode 100644 index 2a301a1cb9600..0000000000000 --- a/src/content/docs/ja/guides/deploy/sst.mdx +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: SSTでAstroサイトをAWSにデプロイする -description: SSTを使ってAstroサイトをAWSにデプロイする方法。 -type: deploy -i18nReady: true ---- - -SSGとSSRをサポートした、AWSに完全なサーバーレスアプリケーションをデプロイするためのオープンソースのフレームワークである[SST](https://sst.dev)を使用して、Astroサイトをデプロイできます。 - -また、型安全性を維持したまま、Cronジョブ、バケット、キューなどのようなSSTコンストラクトを使用できます。 - -## クイックスタート - -1. Astroプロジェクトを作成します。 - -2. `npx create-sst`を実行します。 - -3. Astroを使用していることが検知され、確認を求められます。 - -4. デプロイの準備ができたら、`npx sst deploy --stage=production`を実行します。 - -[このプロセスのビデオ・ウォークスルー](https://www.youtube.com/watch?v=AFP3ZHxO7Gg)もご覧ください。 - -### SSTコンストラクト -[追加のSSTコンストラクト](https://docs.sst.dev/)を使用するには、`sst.config.ts`に追加してください。 - -```ts {2} {4} title="sst.config.ts" -app.stack(function Site(ctx) { - const bucket = new Bucket(ctx.stack, "public"); - const site = new AstroSite(ctx.stack, "site", { - bind: [bucket], - }); - - ctx.stack.addOutputs({ - url: site.url, - }); -}); -``` - -その後、`.astro`ファイル内でそれらにアクセスしてください。 - -```astro ---- -import { Bucket } from "sst/node/bucket" -console.log(Bucket.public.bucketName) ---- -``` - -詳しくは[SST docs on Resource Binding](https://docs.sst.dev/resource-binding)を参照してください。 - -質問があれば、[SST Discordで質問](https://discord.gg/sst)してください。 diff --git a/src/content/docs/ja/guides/deploy/surge.mdx b/src/content/docs/ja/guides/deploy/surge.mdx deleted file mode 100644 index be5a441092de1..0000000000000 --- a/src/content/docs/ja/guides/deploy/surge.mdx +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: AstroサイトをSurgeにデプロイする -description: surge.shを使ってAstroサイトをWebにデプロイする方法 -type: deploy -i18nReady: true ---- - -フロントエンド開発者向けに設計されたシングルコマンドのWeb公開プラットフォームである[Surge](https://surge.sh/)に、Astroサイトをデプロイできます。 - -## デプロイ方法 - -1. [Surge CLI](https://www.npmjs.com/package/surge)のインストールがまだであれば、ターミナルからグローバルにインストールします。 - - ```shell - npm install -g surge - ``` - -2. プロジェクトのルートディレクトリからAstroサイトをビルドします。 - - ```shell - npm run build - ``` - -3. CLIを使用してSurgeにデプロイします。 - - ```shell - surge dist - ``` - - デプロイ時に `surge dist yourdomain.com` を実行すると、[カスタムドメイン](http://surge.sh/help/adding-a-custom-domain) を使用できます。 diff --git a/src/content/docs/ja/guides/deploy/vercel.mdx b/src/content/docs/ja/guides/deploy/vercel.mdx deleted file mode 100644 index ff95fb1bdcf8a..0000000000000 --- a/src/content/docs/ja/guides/deploy/vercel.mdx +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: AstroサイトをVercelにデプロイする -description: VercelでAstroサイトをウェブにデプロイする方法。 -type: deploy -i18nReady: true ---- -import ReadMore from '~/components/ReadMore.astro' - -[Vercel](http://vercel.com/)を使用して、グローバルなエッジネットワークに設定無しでAstroサイトをデプロイできます。 - -このガイドでは、ウェブサイトのUIまたはVercelのCLIを使ってVercelにデプロイする手順を紹介します。 - -## プロジェクトの設定 - -Astroプロジェクトは、静的サイトまたはサーバーサイドレンダリング(SSR)されるサイトとしてVercelにデプロイできます。 - -### 静的サイト - -Astroプロジェクトはデフォルトで静的サイトです。静的なAstroサイトをVercelにデプロイするために追加の設定は必要ありません。 - -### SSRアダプター - -AstroプロジェクトでSSRを有効にしてVercelにデプロイする方法について説明します。 - -以下の`astro add`コマンドにより、AstroプロジェクトでSSRを有効にするための[Vercelアダプター](/ja/guides/integrations-guide/vercel/)を追加します。これにより、アダプターのインストールと、`astro.config.mjs`ファイルへの適切な変更が1ステップで行われます。 - -```bash -npx astro add vercel -``` - -アダプターを手動でインストールする場合は、次の2つの手順を実行してください。 - -1. お好みのパッケージマネージャーを使用して、[`@astrojs/vercel`アダプター](/ja/guides/integrations-guide/vercel/)をプロジェクトの依存関係にインストールします。npmを使用している場合、あるいはよくわからない場合は、次のコマンドをターミナルで実行してください。 - - ```bash - npm install @astrojs/vercel - ``` - -1. プロジェクトの設定ファイル`astro.config.mjs`に2行追加します。 - - ```js title="astro.config.mjs" ins={2, 5-6} - import { defineConfig } from 'astro/config'; - import vercel from '@astrojs/vercel/serverless'; - - export default defineConfig({ - output: 'server', - adapter: vercel(), - }); - ``` - -## デプロイ方法 - -Vercelへのデプロイは、ウェブサイトのUIまたはVercelのCLI(コマンドラインインターフェイス)が利用できます。静的サイト、SSRサイトともに手順は同じです。 - -### ウェブサイトのUIからのデプロイ - -1. コードをオンラインのGitリポジトリ(GitHub、GitLab、BitBucket)にプッシュします。 -2. Vercelに[プロジェクトをインポート](https://vercel.com/new)します。 -3. Vercelが自動的にAstroを検出し、適切な設定を行います。 -4. アプリケーションがデプロイされます! (例:[astro.vercel.app](https://astro.vercel.app/)) - -プロジェクトがインポート・デプロイされると、その後のブランチへのプッシュはすべて[プレビューデプロイ](https://vercel.com/docs/concepts/deployments/preview-deployments)を生成し、またプロダクションブランチ(通常は「main」)に加えられたすべての変更は[本番環境へのデプロイ](https://vercel.com/docs/concepts/deployments/environments#production)となります。 - -Vercelの[Git連携](https://vercel.com/docs/concepts/git)についてもっと学ぶ。 - - -### CLIからのデプロイ - -1. [Vercel CLI](https://vercel.com/cli)をインストールし、`vercel`を実行してデプロイします。 - - ```bash - npm install -g vercel - vercel - ``` - -2. Vercelが自動的にAstroを検出し、適切な設定を行います。 -3. `Want to override the settings? [y/N]`(「設定を上書きしますか?」)と聞かれたら、`N`を選択します。 -4. アプリケーションがデプロイされます! (例:[astro.vercel.app](https://astro.vercel.app/)) - - -### vercel.jsonによるプロジェクト設定 - -`vercel.json`を使用して、Vercelのデフォルトの動作を上書きしたり、追加の設定を行うことができます。たとえば、デプロイ環境からのHTTPレスポンスにヘッダーを追加する場合などに使用します。 - -[Vercelのプロジェクト設定](https://vercel.com/docs/project-configuration)についてもっと学ぶ。 - -### Astro 2.0へのアップグレード - -Astro v2.0はNode 14のサポートを終了しているため、プロジェクトでは**Node `18.14.1`以降**を使用するようにしてください。ビルドステップとサーバーレス関数で使用するNode.jsのバージョンは、Project SettingsにあるGeneralページから[定義できます](https://vercel.com/changelog/node-js-version-now-customizable-in-the-project-settings)。 diff --git a/src/content/docs/ja/guides/endpoints.mdx b/src/content/docs/ja/guides/endpoints.mdx deleted file mode 100644 index 7ed699647d2cf..0000000000000 --- a/src/content/docs/ja/guides/endpoints.mdx +++ /dev/null @@ -1,226 +0,0 @@ ---- -title: エンドポイント -description: どんな種類のデータでも提供できるエンドポイントの作成方法について学びます。 -i18nReady: true ---- -import RecipeLinks from "~/components/RecipeLinks.astro"; - -Astroでは、どんな種類のデータでも提供できるカスタムエンドポイントを作成できます。これを利用して、画像を生成したり、RSSを公開したり、またはAPIルーティングとして使用してサイトの完全なAPIを構築したりできます。 - -静的に生成されたサイトでは、カスタムエンドポイントは静的ファイルを生成するため、ビルド時に呼び出されます。[SSR](/ja/guides/on-demand-rendering/)モードを選択した場合、カスタムエンドポイントはリクエストに応じて呼び出される動的なサーバーエンドポイントに変わります。静的エンドポイントとSSRエンドポイントは同じ様に定義されますが、SSRエンドポイントは追加機能をサポートします。 - - -## 静的ファイルのエンドポイント - -カスタムエンドポイントを作成するには、`.js`または`.ts`ファイルを`/pages`ディレクトリに追加してください。`.js`または`.ts`の拡張子はビルドプロセス中に削除されるので、ファイル名には作成したいデータの拡張子を含める必要があります。たとえば、`src/pages/data.json.ts`は、ビルドすると`/data.json`エンドポイントとなります。 - -エンドポイントは、`Astro`グローバルと同様のプロパティを持つ[コンテキストオブジェクト](/ja/reference/api-reference/)を受け取る`GET`関数(`async`も可)をエクスポートします。以下のエンドポイントは`name`と`url`を持つレスポンスオブジェクトを返しており、Astroはビルド時にこれを呼び出し、bodyの内容を使ってファイルを生成します。 - -```ts -// 例: src/pages/builtwith.json.ts -// 出力: /builtwith.json -export async function GET({params, request}) { - return new Response( - JSON.stringify({ - name: 'Astro', - url: 'https://astro.build/' - }) - ) -} -``` - -Astro v3.0以降、返り値の`Response`オブジェクトが`encoding`プロパティを含む必要はなくなりました。たとえば、バイナリのpng画像を生成する場合は次のようになります。 - -```ts title="src/pages/astro-logo.png.ts" {3} -export async function GET({ params, request }) { - const response = await fetch("https://docs.astro.build/assets/full-logo-light.png"); - return new Response(await response.arrayBuffer()); -} -``` - -また、`APIRoute`型を使用してエンドポイント関数に型付けもできます。 - -```ts -import type { APIRoute } from 'astro'; - -export const GET: APIRoute = async ({ params, request }) => {...} -``` - -### `params`と動的ルーティング - -エンドポイントは、ページと同じ[動的ルーティング](/ja/guides/routing/#%E5%8B%95%E7%9A%84%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0)機能をサポートしています。ファイル名を角括弧付きのパラメーター名とし、[`getStaticPaths()`関数](/ja/reference/routing-reference/#getstaticpaths)をエクスポートしてください。そして、エンドポイント関数に渡された`params`プロパティを使用して、パラメーターにアクセスします。 - - -```ts title="src/pages/api/[id].json.ts" -import type { APIRoute } from 'astro'; - -const usernames = ["Sarah", "Chris", "Yan", "Elian"] - -export const GET: APIRoute = ({ params, request }) => { - const id = params.id; - return new Response( - JSON.stringify({ - name: usernames[id] - }) - ) -} - -export function getStaticPaths() { - return [ - { params: { id: "0"} }, - { params: { id: "1"} }, - { params: { id: "2"} }, - { params: { id: "3"} } - ] -} -``` - -これにより、ビルド時に`/api/0.json`、`/api/1.json`、`/api/2.json`、`/api/3.json`という4つのJSONエンドポイントが生成されます。エンドポイントによる動的ルーティングはページと同じように動作しますが、エンドポイントはコンポーネントではなく関数であるため、[props](/ja/reference/routing-reference/#data-passing-with-props)はサポートされていません。 - -### `request` - -すべてのエンドポイントは`request`プロパティを受け取りますが、静的モードでは`request.url`にのみアクセスが可能です。これは、現在のエンドポイントの完全なURLを返し、[Astro.request.url](/ja/reference/api-reference/#request)がページに対して行うのと同じように動作します。 - -```ts title="src/pages/request-path.json.ts" -import type { APIRoute } from 'astro'; - -export const GET: APIRoute = ({ params, request }) => { - return new Response(JSON.stringify({ - path: new URL(request.url).pathname - }) - ) -} -``` - - -## サーバーエンドポイント(APIルーティング) - -静的ファイルエンドポイントのセクションで説明したものはすべて、SSRモードでも使用できます。ファイルは、`Astro`グローバルと同様のプロパティを持つ[コンテキストオブジェクト](/ja/reference/api-reference/)を受け取る`GET`関数をエクスポートできます。 - -しかし、`static`モードとは異なり、`server`モードを設定すると、エンドポイントはリクエストされた時点でビルドされます。これにより、ビルド時には利用できない新しい機能が利用可能となり、リクエストをリッスンするAPIルートを構築したり、実行時にサーバー上で安全にコードを実行できるようになります。 - - - -:::note -これらの例を試す前に、必ず[SSRを有効](/ja/guides/on-demand-rendering/)にしてください。 -::: - -サーバーエンドポイントは、`getStaticPaths`のエクスポートなしで`params`にアクセスできます。また、[`Response`](https://developer.mozilla.org/ja/docs/Web/API/Response)オブジェクトを返せるので、ステータスコードやヘッダーを設定できます。 - - -```js title="src/pages/[id].json.js" -import { getProduct } from '../db'; - -export async function GET({ params }) { - const id = params.id; - const product = await getProduct(id); - - if (!product) { - return new Response(null, { - status: 404, - statusText: 'Not found' - }); - } - - return new Response( - JSON.stringify(product), { - status: 200, - headers: { - "Content-Type": "application/json" - } - } - ); -} -``` - -これは、動的ルーティングにマッチするすべてのリクエストに応答します。たとえば、`/helmet.json`に移動した場合、`params.id`は`helmet`に設定されます。モックの商品データベースに`helmet`が存在すれば、エンドポイントは`Response`オブジェクトを作成してJSONで応答し、成功を意味する[HTTPステータスコード](https://developer.mozilla.org/ja/docs/Web/API/Response/status)を返します。存在しない場合は、`Response`オブジェクトを使用して`404`で応答します。 - -特定のプロバイダーは、SSRモードで画像を返すために`Content-Type`ヘッダーを要求します。この場合、`Response`オブジェクトを使用して`headers`プロパティを指定します。以下はバイナリの`.png`画像を返却する例です。 -```ts title="src/pages/astro-logo.png.ts" -export async function GET({ params, request }) { - const response = await fetch("https://docs.astro.build/assets/full-logo-light.png"); - const buffer = Buffer.from(await response.arrayBuffer()); - return new Response(buffer, { - headers: { "Content-Type": "image/png" }, - }); -} -``` - -### HTTPメソッド - -`GET`関数に加えて、任意の[HTTPメソッド](https://developer.mozilla.org/ja/docs/Web/HTTP/Methods)の名前をもつ関数をエクスポートできます。リクエストが来た時、Astroはメソッドをチェックし、対応する関数を呼び出します。 - -対応するエクスポートされた関数がないHTTPメソッドにマッチする`ALL`関数をエクスポートすることもできます。対応するメソッドがないリクエストが来た場合、サイトの[404ページ](/ja/basics/astro-pages/#カスタム404エラーページ)にリダイレクトされます。 - -```ts title="src/pages/methods.json.ts" -export const GET: APIRoute = ({ params, request }) => { - return new Response(JSON.stringify({ - message: "This was a GET!" - }) - ) -} - -export const POST: APIRoute = ({ request }) => { - return new Response(JSON.stringify({ - message: "This was a POST!" - }) - ) -} - -export const DELETE: APIRoute = ({ request }) => { - return new Response(JSON.stringify({ - message: "This was a DELETE!" - }) - ) -} - -export const ALL: APIRoute = ({ request }) => { - return new Response(JSON.stringify({ - message: `This was a ${request.method}!` - }) - ) -} -``` - - - -### `request` - -SSRモードでは、`request`プロパティは、現在のリクエストを参照する完全に使用可能な[`Request`](https://developer.mozilla.org/ja/docs/Web/API/Request)オブジェクトを返します。これにより、データの取得やヘッダーのチェックができます。 - -```ts title="src/pages/test-post.json.ts" -export const POST: APIRoute = async ({ request }) => { - if (request.headers.get("Content-Type") === "application/json") { - const body = await request.json(); - const name = body.name; - return new Response(JSON.stringify({ - message: "名前: " + name - }), { - status: 200 - }) - } - return new Response(null, { status: 400 }); -} -``` - -### リダイレクト - -エンドポイントのコンテキストは、`Astro.redirect`に似た`redirect()`ユーティリティをエクスポートします。 - -```js title="src/pages/links/[id].js" {14} -import { getLinkUrl } from '../db'; - -export async function GET({ params, redirect }) { - const { id } = params; - const link = await getLinkUrl(id); - - if (!link) { - return new Response(null, { - status: 404, - statusText: 'Not found' - }); - } - - return redirect(link, 307); -} -``` diff --git a/src/content/docs/ja/guides/environment-variables.mdx b/src/content/docs/ja/guides/environment-variables.mdx deleted file mode 100644 index 858c171648b87..0000000000000 --- a/src/content/docs/ja/guides/environment-variables.mdx +++ /dev/null @@ -1,116 +0,0 @@ ---- -title: 環境変数 -description: Astroプロジェクトでの環境変数の使い方を学ぶ -i18nReady: true ---- -import PackageManagerTabs from '~/components/tabs/PackageManagerTabs.astro' - -Astroは環境変数に関するViteの組み込みのサポートを利用しています。環境変数を扱うために[Viteが備える任意の方式](https://vite.dev/guide/env-and-mode.html)を使用できます。 - -サーバ側のコードでは _すべて_ の環境変数が使えますが、クライアント側のコードではセキュリティのために`PUBLIC_`というプレフィックスを持つ環境変数のみが使えることに注意してください。 - -```ini title=".env" -SECRET_PASSWORD=password123 -PUBLIC_ANYBODY=there -``` - -この例では、`PUBLIC_ANYBODY`(`import.meta.env.PUBLIC_ANYBODY`でアクセス可能)はサーバサイドでもクライアントサイドでも利用でき、`SECRET_PASSWORD`(`import.meta.env.SECRET_PASSWORD`でアクセス可能)はサーバサイドでのみ利用できます。 - -:::caution -`.env`ファイルは[設定ファイル](/ja/guides/configuring-astro/#環境変数)の中では読み込まれません。 -::: - -## デフォルト環境変数 - -Astroでは、いくつかの環境変数をすぐに利用できます。 - -- `import.meta.env.MODE`: サイトが動作しているモードです。これは`astro dev`を実行している場合は`development`で、`astro build`を実行している場合は`production`になります。 -- `import.meta.env.PROD`: あなたのサイトが本番環境で動作している場合は`true`となり、その他の場合は`false`となります。 -- `import.meta.env.DEV`: あなたのサイトが開発環境で動作している場合は`true`となり、その他の場合は`false`となります。常に`import.meta.env.PROD`の反対となります。 -- `import.meta.env.BASE_URL`: あなたのサイトの配信元のベースURLです。これは、[`base`オプション](/ja/reference/configuration-reference/#base)によって決まります。 -- `import.meta.env.SITE`: プロジェクトの`astro.config`で指定された[`site`オプション](/ja/reference/configuration-reference/#site)がセットされます。 -- `import.meta.env.ASSETS_PREFIX`: [`build.assetsPrefix`設定オプション](/ja/reference/configuration-reference/#buildassetsprefix)が設定されている場合に、Astroが生成するアセットリンクに付加されるプレフィックスです。Astroが関与しないアセットリンクを作成するために使用できます。 - -他の環境変数と同様に使用します。 - -```ts utils.ts -const isProd = import.meta.env.PROD; -const isDev = import.meta.env.DEV; -``` - -## 環境変数を設定する - -### `.env`ファイル - -環境変数は、プロジェクトディレクトリの`.env`ファイルから読み込めます。 - -また、`.env.production`や`.env.development`のように、ファイル名にモード(`production`または`development`)を付けることもできます。この場合、環境変数はそのモードでのみ有効になります。 - -プロジェクトディレクトリに`.env`ファイルを作成し、そこにいくつかの変数を追加するだけです。 - -```ini title=".env" -# これはサーバー上で実行したときのみ有効です! -DB_PASSWORD="foobar" -# これはどこからでも呼び出せます! -PUBLIC_POKEAPI="https://pokeapi.co/api/v2" -``` - -`.env`ファイルについてさらに知りたい場合は、[Viteのドキュメントを参照してください](https://vite.dev/guide/env-and-mode.html#env-files)。 - -### CLIの利用 - -プロジェクトの実行時に環境変数を追加することも可能です。 - - - - ```shell - PUBLIC_POKEAPI=https://pokeapi.co/api/v2 yarn run dev - ``` - - - ```shell - PUBLIC_POKEAPI=https://pokeapi.co/api/v2 npm run dev - ``` - - - ```shell - PUBLIC_POKEAPI=https://pokeapi.co/api/v2 pnpm run dev - ``` - - - -## 環境変数を取得する - -Astroでは、process.envの代わりにimport.meta.envを使用して環境変数にアクセスします。これは、[ES2020で追加されたimport.meta機能](https://tc39.es/ecma262/2020/#prod-ImportMeta)を使用しています。 - -例えば、環境変数`PUBLIC_POKEAPI`を取得するには、`import.meta.env.PUBLIC_POKEAPI`を使用します。 - -```js /(?`ブロックでも、このフォントを使用したいレイアウトやコンポーネントの` - ``` - -## Fontsourceを使う - -[Fontsource](https://fontsource.org/)プロジェクトにより、Google Fontsやその他のオープンソースのフォントを簡単に使用できます。使用したいフォントをnpmモジュールとしてインストールできます。 - -1. [Fontsourceのカタログ](https://fontsource.org/)で使用したいフォントを探します。例として、ここでは[Twinkle Star](https://fontsource.org/fonts/twinkle-star)を使用します。 - -2. 選択したフォントのパッケージをインストールしてください。 - - - - ```shell - npm install @fontsource/twinkle-star - ``` - - - ```shell - pnpm add @fontsource/twinkle-star - ``` - - - ```shell - yarn add @fontsource/twinkle-star - ``` - - - - :::tip - 正しいパッケージ名は、Fontsourceのウェブサイトの各フォントページの「Quick Installation」セクションに記載されています。`@fontsource/`または`@fontsource-variable/`で始まり、その後にフォントの名前が続きます。 - ::: - -3. フォントを使用したいコンポーネントで、フォントパッケージをインポートします。通常は、サイト全体でフォントを利用するために、共通のレイアウトコンポーネントでこれを行います。 - - インポートすると、フォントを設定するのに必要な`@font-face`ルールが自動的に追加されます。 - - ```astro - --- - // src/layouts/BaseLayout.astro - import '@fontsource/twinkle-star'; - --- - ``` - -4. そのフォントのFontsourceページの`body`の例に記載されている名前を`font-family`として使用します。AstroプロジェクトでCSSを書ける場所であればどこでも指定できます。 - - ```css - h1 { - font-family: "Twinkle Star", cursive; - } - ``` - - - -## Tailwindでフォントを登録する - -[Tailwindインテグレーション](/ja/guides/integrations-guide/tailwind/)を使用している場合は、このページで説明した方法のいずれかを使ってフォントをインストールできますが、いくつかの変更が必要です。[ローカルのフォントに対して`@font-face`文を追加](#ローカルのフォントファイルを使う)するか、フォントをインストールするために[Fontsourceの`import`戦略](#fontsourceを使う)を使えます。 - -Tailwindにフォントを登録する流れは以下の通りです。 - -1. 上のガイドのいずれかに従ってください。ただし、CSSに`font-family`を追加する最後のステップはスキップしてください。 -1. `tailwind.config.mjs`に書体名を追加します。 - - この例では、`Inter`をサンセリフのフォントスタックに追加し、またTailwind CSSのデフォルトのフォールバックフォントも使用しています。 - - ```js title="tailwind.config.mjs" ins={1,8-10} - import defaultTheme from 'tailwindcss/defaultTheme' - - /** @type {import('tailwindcss').Config} */ - export default { - content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'], - theme: { - extend: { - fontFamily: { - sans: ['Inter', ...defaultTheme.fontFamily.sans], - }, - }, - }, - plugins: [], - } - ``` - - これで、プロジェクト内のすべてのサンセリフテキスト(Tailwindのデフォルト)は選択したフォントを使用し、`font-sans`クラスはInterフォントを適用するようになりました。 - -詳細は、[カスタムフォントファミリーの追加に関するTailwindのドキュメント](https://tailwindcss.com/docs/font-family#using-custom-values)を参照してください。 - -## その他のリソース - -- [MDNのウェブフォントガイド](https://developer.mozilla.org/ja/docs/Learn/CSS/Styling_text/Web_fonts)でウェブフォントの仕組みを学びましょう。 -- [Font Squirrelのウェブフォントジェネレーター](https://www.fontsquirrel.com/tools/webfont-generator)でフォント用のCSSを生成できます。 diff --git a/src/content/docs/ja/guides/framework-components.mdx b/src/content/docs/ja/guides/framework-components.mdx deleted file mode 100644 index 39a6a66de6fe4..0000000000000 --- a/src/content/docs/ja/guides/framework-components.mdx +++ /dev/null @@ -1,229 +0,0 @@ ---- -title: フレームワークコンポーネント -description: ReactやSvelteを利用する方法をご紹介します。 -i18nReady: true ---- - -お好みのUIコンポーネントフレームワークを活かしてAstroでウェブサイトを作成してみましょう。 - -Astroは[React](https://react.dev/)、[Preact](https://preactjs.com/)、[Svelte](https://svelte.dev/)、[Vue](https://vuejs.org/)、[SolidJS](https://www.solidjs.com/)、[AlpineJS](https://alpinejs.dev/)、[Lit](https://lit.dev/)のようなさまざまな人気のフレームワークをサポートしています。 - -## インテグレーションをインストール - -AstroはReact、Preact、Svelte、Vue、SolidJS、AlpineJS、Litの[インテグレーション](/ja/guides/integrations-guide/)をオプションとして提供しています。1つまたは複数のAstroインテグレーションをプロジェクトにインストールし、設定できます。 - -⚙️ Astroのインテグレーションをインストールし、設定するにあたっての詳細は[インテグレーションガイド](/ja/guides/integrations-guide/)をご覧ください。 - -⚙️ お好きなフレームワークの例を確認したいですか?[astro.new](https://astro.new/)にアクセスして、そのフレームワークのテンプレートを選択してみてください。 - -## フレームワークコンポーネントを利用 - -Astroコンポーネントと同じように、JavaScriptフレームワークコンポーネントをAstroページやレイアウト、コンポーネントで使ってみましょう!すべてのコンポーネントは、`/src/components`にまとめることも、好きなように整理することもできます。 - -フレームワークコンポーネントを使用するには、Astroコンポーネントスクリプトで相対パスを指定してインポートします。そして、コンポーネントテンプレートで、他のコンポーネント、HTML要素、JSXライクな式と一緒に使用します。 - -```astro title="src/pages/static-components.astro" ins={2,7} ---- -import MyReactComponent from '../components/MyReactComponent.jsx'; ---- - - -

Astroの中でReactコンポーネントを直接使ってください!

- - - -``` - -デフォルトでは、フレームワークのコンポーネントは静的なHTMLとしてレンダリングされます。これはインタラクティブでないコンポーネントをテンプレート化するのに便利で、必要のないJavaScriptをクライアントに送信するのを防ぎます。 - -## インタラクティブなコンポーネント - -フレームワークのコンポーネントは[`client:*`ディレクティブ](/ja/reference/directives-reference/#クライアントディレクティブ)を使用してインタラクティブ(ハイドレーションした状態)にできます。これはコンポーネントのJavaScriptがいつブラウザに送信されるべきかを定義するためのコンポーネントの属性です。 - -`client:only`を除く全てのclientディレクティブで、コンポーネントはまず最初にサーバー上でレンダリングされて静的なHTMLを生成します。JavaScriptのコンポーネントは指定したディレクティブに従ってブラウザに送信されます。その後コンポーネントはハイドレートしインタラクティブになります。 - -```astro title="src/pages/interactive-components.astro" /client:\S+/ ---- -// 例: ブラウザでコンポーネントをハイドレーションする -import InteractiveButton from '../components/InteractiveButton.jsx'; -import InteractiveCounter from '../components/InteractiveCounter.jsx'; -import InteractiveModal from "../components/InteractiveModal.svelte" ---- - - - - - - - - -``` - -コンポーネントをレンダリングするために必要なJavaScriptフレームワーク(React、Svelteなど)は、コンポーネント自身のJavaScriptと一緒にブラウザに送信されます。ページ上の複数のコンポーネントが同じフレームワークを使用する場合、フレームワークは一度だけ送信されます。 - - -:::note[アクセシビリティ] -これらのコンポーネントをAstroで使用した場合、多くのフレームワーク固有のアクセシビリティパターンは同じように動作するはずです。アクセシビリティに関するJavaScriptが適切に読み込まれ、実行されるよう必ずクライアントディレクティブを設定してください。 -::: - -### 利用可能なハイドレーションのディレクティブ - -UIフレームワークコンポーネントで利用可能なハイドレーションのディレクティブがいくつかあります。`client:load`、`client:idle`、`client:visible`、`client:media={QUERY}`、`client:only={FRAMEWORK}`です。 - -📚 これらのハイドレーションのディレクティブやその使い方を詳しく知りたい場合は[ディレクティブのリファレンス](/ja/reference/directives-reference/#クライアントディレクティブ)のページをご覧ください。 - -## フレームワークを混在させる - -同じAstroコンポーネントの中で複数のフレームワークで作られたコンポーネントをインポートし、レンダリングできます。 - -```astro title="src/pages/mixing-frameworks.astro" ---- -// 例: 同じページで複数のフレームワークのコンポーネントを混在させる -import MyReactComponent from '../components/MyReactComponent.jsx'; -import MySvelteComponent from '../components/MySvelteComponent.svelte'; -import MyVueComponent from '../components/MyVueComponent.vue'; ---- -
- - - -
-``` - -:::caution -**Astro**コンポーネント(`.astro`)だけが複数のフレームワークのコンポーネントを含められます。 -::: - -## フレームワークコンポーネントにPropsを渡す - -Astroコンポーネントからフレームワークコンポーネントにpropを渡せます。 - -```astro title="src/pages/frameworks-props.astro" ---- -import TodoList from '../components/TodoList.jsx'; -import Counter from '../components/Counter.svelte'; ---- -
- - -
-``` - -:::caution[関数をプロパティとして渡す] -フレームワークコンポーネントに関数をプロパティとして渡せますが、それはサーバーレンダリングの間だけ機能します。もしこの関数をハイドレードされたコンポーネント(例えば、イベントハンドラーとして)で使用しようとするとエラーが発生します。 - -これはAstroでは関数をシリアライズ(サーバーからクライアントへの転送)できないためです。 -::: - - -## フレームワークコンポーネントに子要素を渡す - -Astroコンポーネントでは、フレームワークコンポーネントに子要素を**渡せます**。各フレームワークは、これらの子要素を参照するための固有のパターンがあります。React、Preact、Solidは`children`という特別なプロパティを使用し、SvelteとVueは``という要素を使用します。 - -```astro title="src/pages/component-children.astro" {5} ---- -import MyReactSidebar from '../components/MyReactSidebar.jsx'; ---- - -

これは、テキストとボタンがあるサイドバーです。

-
-``` - -さらに、[名前付きスロット](/ja/basics/astro-components/#名前付きスロット)を使って、特定の子要素をグループ化できます。 - -React、Preact、Solidでは、これらのスロットはトップレベルのプロパティに変換されます。`kebab-case`を使用しているスロット名は、`camelCase`に変換されます。 - -```astro title="src/pages/named-slots.astro" /slot="(.*)"/ ---- -import MySidebar from '../components/MySidebar.jsx'; ---- - -

メニュー

-

テキストとボタンを含むサイドバーがあります。

- -
-``` - -```jsx /{props.(title|socialLinks)}/ -// src/components/MySidebar.jsx -export default function MySidebar(props) { - return ( - - ) -} -``` - -SvelteとVueでは、これらのスロットは``要素に`name`属性を付けて参照できます。また、`kebab-case`を使用したスロット名は保持されます。 - -```jsx /slot name="(.*)"/ -// src/components/MySidebar.svelte - -``` - - -## フレームワークコンポーネントをネストさせる - -Astroファイルの中には、フレームワークコンポーネントの子要素もハイドレーションされたコンポーネントにできます。これは、フレームワークのどれからでも、コンポーネントを再帰的にネストできることを意味します。 - -```astro title="src/pages/nested-components.astro" {10-11} ---- -import MyReactSidebar from '../components/MyReactSidebar.jsx'; -import MyReactButton from '../components/MyReactButton.jsx'; -import MySvelteButton from '../components/MySvelteButton.svelte'; ---- - - -

テキストとボタンを含むサイドバーがあります。

-
- - -
-
-``` - -:::caution -フレームワークのコンポーネント自体(例: `.jsx`、`.svelte`)は複数のフレームワークを混在させることはできません。 -::: - -これにより、お好みのJavaScriptフレームワークで「アプリ」全体を構築し、親コンポーネントを介してAstroのページにレンダリングできます。 - -:::note -Astroコンポーネントは、ハイドレーションされるフレームワークコンポーネントを含む場合でも、常に静的なHTMLとしてレンダリングされます。つまり、HTMLのレンダリングを行わないpropsしか渡すことができないのです。AstroコンポーネントからフレームワークコンポーネントにReactの「render props」を渡しても、Astroコンポーネントはこのパターンが要求するクライアント実行時の動作を提供できないため、うまくいきません。代わりに、名前付きスロットを使用します。 -::: - - -## フレームワークコンポーネントの中でAstroコンポーネントを使用できますか? - -UIフレームワークコンポーネントは、そのフレームワークの「アイランド(島)」になります。これらのコンポーネントは、そのフレームワークの有効なコードとして、独自のインポートやパッケージのみを使用して完全に記述しなければなりません。UIフレームワークコンポーネント(例:`.jsx`や`.svelte`)の中で`.astro`コンポーネントをインポートすることはできません。 - -しかし、[Astroの``パターン](/ja/basics/astro-components/#スロット)を利用して、Astroコンポーネントが生成した静的コンテンツを **`.astro`コンポーネントの中**でフレームワークコンポーネントに子要素として渡すことはできます。 - -```astro title="src/pages/astro-children.astro" {6} ---- -import MyReactComponent from '../components/MyReactComponent.jsx'; -import MyAstroComponent from '../components/MyAstroComponent.astro'; ---- - - - -``` - - -## Astroコンポーネントをハイドレーションすることはできますか? - -`client:`という修飾子を使ってAstroコンポーネントをハイドレーションしようとするとエラーになるはずです。 - -[Astro コンポーネント](/ja/basics/astro-components/)はクライアントサイドのランタイムを持たないHTMLのみを表示するコンポーネントです。しかし、` - -満天の星空。 - -``` - -#### Imageコンポーネントを渡す - -``コンポーネントは、他のAstroコンポーネントと同様に、**UIフレームワークコンポーネントでは使用できません**。 - -しかし、`.astro`ファイル内のフレームワークコンポーネントに、``によって生成された静的コンテンツを子要素として渡すか、または[名前付きの``](/ja/guides/framework-components/#フレームワークコンポーネントの中でastroコンポーネントを使用できますか)を使用して渡すことは可能です。 - - -```astro title="ImageWrapper.astro" ---- -import ReactComponent from './ReactComponent.jsx'; -import { Image } from "astro:assets" -import stars from "~/stars/docline.png"; ---- - - - 満天の星空。 - -``` - -## `getImage()`で画像を生成する - -:::caution -`getImage()`はサーバー専用のAPIに依存しており、クライアントで使用するとビルドが失敗します。 -::: - -`getImage()`関数は、たとえば[APIルート](/ja/guides/endpoints/#サーバーエンドポイントapiルーティング)など、HTML以外の場所で使用する画像を生成することを目的としています。また、これを使って独自のカスタム``コンポーネントも作成できます。 - - - -`getImage()`は、(`alt`を除く)[Imageコンポーネントと同じプロパティ](#プロパティ)をもつオプションオブジェクトを受け取ります。 - -```astro ---- -import { getImage } from "astro:assets"; -import myBackground from "../background.png" - -const optimizedBackground = await getImage({src: myBackground, format: 'webp'}) ---- - -
-``` - -`getImage()`は以下のプロパティをもつオブジェクトを返します。 - -```js -{ - rawOptions: {...}, // オリジナルのパラメータを渡す - options: {...}, // 有効なパラメータを渡す - src: "https//...", // 生成された画像へのパス - srcSet: { - values: [...], // 生成されたsrcsetの値。各エントリーはurlとサイズ記述子を持つ。 - attribute: "", // valuesから生成されたsrcset属性 - } - attributes: {...} // 画像をレンダリングするために必要な追加のHTML属性(width、height、styleなど) -} -``` - -## 代替テキスト - -すべてのユーザーが同じように画像を見れるわけではないため、画像を使用する際のアクセシビリティは特に重要です。画像に対して[説明的な代替テキスト](https://www.w3.org/WAI/tutorials/images/)を提供するために、`alt`属性を使用してください。 - -この属性は``コンポーネントでは必須です。代替テキストが指定されていない場合、``はエラーをスローします。 - -画像が単に装飾用である場合(つまり、ページの理解に貢献していない場合)は、`alt=""`を設定して、スクリーンリーダーが画像を無視するようにしてください。 - -## デフォルトの画像サービス - -[Sharp](https://github.com/lovell/sharp)は、`astro:assets`で使用されるデフォルトの画像サービスです。 - -:::note -`pnpm`のような[厳格なパッケージマネージャー](https://pnpm.io/pnpm-vs-npm#npms-flat-tree)を使用している場合は、Astroの依存関係であるにもかかわらず、プロジェクトにSharpを手動でインストールする必要があるかもしれません。 - -```bash -pnpm add sharp -``` -::: - -### Squooshの設定 - -画像を変換するために[Squoosh](https://github.com/GoogleChromeLabs/squoosh)を使用したい場合は、以下のように設定を更新してください。 - -```js title="astro.config.mjs" ins={4-6} -import { defineConfig, squooshImageService } from 'astro/config'; - -export default defineConfig({ - image: { - service: squooshImageService(), - }, -}); -``` - -### no-opパススルーサービスの設定 - -もし使用している[`server`または`hybrid`モードのアダプター](https://astro.build/integrations/?search=&categories%5B%5D=adapters)が、Astroの組み込みのSquooshおよびSharp画像最適化(Deno、Cloudflareなど)をサポートしていない場合、``や``コンポーネントを使用できるようにno-op画像サービスを設定することができます。Astroはこれらの環境では画像の変換や処理をおこないませんが、Cumulative Layout Shift(CLS)がなくなること、`alt`属性が必須であること、一貫したコードの書き心地など、`astro:assets`を使用した場合の他の利点は享受することができます。 - -SquooshとSharpの画像処理を回避する`passthroughImageService()`の設定: - -```js title="astro.config.mjs" ins={4-6} "passthroughImageService" -import { defineConfig, passthroughImageService } from 'astro/config'; -export default defineConfig({ - image: { - service: passthroughImageService() - } -}); -``` - -## コミュニティインテグレーション - -Astroプロジェクトで画像を最適化したり、画像を扱ったりするための、サードパーティの[コミュニティインテグレーション](https://astro.build/integrations?search=images)があります。 - -## v2.xからv3.0へのアップグレード - -Astro v3.0では、`astro:assets`は実験的な機能ではなくなりました。 - -``は組み込みのコンポーネントとなり、以前の`@astrojs/image`インテグレーションは削除されました。 - -これらのことと、Astroで画像を使用するためのその他の変更により、以前のバージョンからAstroプロジェクトをアップグレードすると、いくつかの破壊的な変更が発生する可能性があります。 - -Astro v2.xプロジェクトをv3.0にアップグレードするには、以下の手順に適切に従ってください。 - -### `experimental.assets`からのアップグレード - -以前に`astro:assets`の実験的なフラグを有効にしていた場合は、Astro v3.0ではデフォルトでアセット機能が含まれているため、プロジェクトを更新する必要があります。 - -#### `experimental.assets`フラグの削除 - -実験的なフラグを削除します。 - -```js title="astro.config.mjs" del={4-6} -import { defineConfig } from 'astro/config'; - -export default defineConfig({ - experimental: { - assets: true - } -}); -``` - -必要に応じて、`astro/client-image`への参照を`astro/client`に置き換えるために、`src/env.d.ts`ファイルも更新します。 - -```ts title="src/env.d.ts" del={1} ins={2} -/// -/// -``` - -#### `~/assets`インポートエイリアスの削除 - -このImportエイリアスは、`astro:assets`にデフォルトで含まれなくなりました。実験的なアセット機能でこのエイリアスを使用していた場合は、相対ファイルパスに変換するか、[自分でImportエイリアスを作成](/ja/guides/imports/#importエイリアス)する必要があります。 - -```astro title="src/pages/posts/post-1.astro" del={2} ins={3} ---- -import rocket from '~/assets/rocket.png' -import rocket from '../../assets/rocket.png'; ---- -``` - -#### Cloudflare、Deno、Vercel Edge、Netlify Edge向けのシンプルなアセットサポートを追加する - -Astro v3.0では、Astro組み込みのSquooshとSharpによる画像最適化をサポートしていないCloudflare、Deno、Vercel Edge、Netlify Edgeでも、`astro:assets`をエラーなしで動作させることができます。Astroはこれらの環境では画像の変換や処理をおこないませんが、Cumulative Layout Shift(CLS)がなくなること、`alt`属性が必須であること、一貫したコードの書き心地など、`astro:assets`を使用した場合の他の利点は享受することができます。 - -こうした制約のために以前`astro:assets`の使用を避けていた場合でも、もう問題なく使用できるようになりました。この動作を明示的に有効にするために、no-op画像サービスを設定できます。 - -```js title="astro.config.mjs" ins={4-8} -import { defineConfig } from 'astro/config'; - -export default defineConfig({ - image: { - service: { - entrypoint: 'astro/assets/services/noop' - } - } -}); -``` - -### 画像を保存する場所を決める - -[画像を保存する場所](#画像を保存する場所)を決めるには、今読んでいるこのガイドを参照してください。`astro:assets`がもたらす柔軟性を活用して、画像を保存するための新しいオプションを利用したい場合があるかもしれません。たとえば、プロジェクトの`src/`からの相対画像は、Markdown、MDX、MarkdocいずれにおいてもMarkdown標準の`![alt](src)`構文により参照できるようになりました。 - -### 既存の``タグを更新する - -以前は画像をインポートすると、画像のパスを含む単純な`string`が返されました。現在は、インポートされた画像アセットは以下のシグネチャをもつオブジェクトとなります。 - -```ts -interface ImageMetadata { - src: string; - width: number; - height: number; - format: string; -} -``` - -([UIフレームワークコンポーネント内の画像](#uiフレームワークコンポーネント内の画像)を含む)既存の``タグの`src`属性の更新が必要です。また、インポートした画像から利用できるようになった他の属性も更新できます。 - -```astro title="src/components/MyComponent.astro" ".src" ".width" ".height" del={4} ins={6} ---- -import rocket from '../images/rocket.svg'; ---- -宇宙に浮かぶロケット。 - -宇宙に浮かぶロケット。 -``` - -### Markdown、MDX、Markdocファイルを更新する - -プロジェクトの`src/`からの相対画像は、Markdown、MDX、MarkdocいずれにおいてもMarkdown標準の`![alt](src)`構文により参照できるようになりました。 - -これにより、画像を`public/`ディレクトリからプロジェクトの`src/`に移動し、処理を加えて最適化できます。`public/`内の既存の画像とリモート画像は引き続き有効ですが、Astroのビルドプロセスでは最適化されません。 - -```md title="src/pages/posts/post-1.md" "/_astro" ".hash" "../../assets/" -# 私のMarkdownページ - - -![満天の星空。](../../images/stars.png) - - -![満天の星空。](./stars.png) -``` - -画像の属性をより細かく制御する必要がある場合は、Markdown構文に加えて、Astroの``コンポーネントやJSXの``タグを使用可能な`.mdx`ファイル形式を使用することをおすすめします。AstroにMDXサポートを追加するには、[MDXインテグレーション](/ja/guides/integrations-guide/mdx/)を使用します。 - -### `@astrojs/image`を削除する - - -Astro v2.xで画像インテグレーションを使用していた場合は、以下の手順を完了させてください。 - -1. `@astrojs/image`を削除します。 - - [インテグレーションを削除する](/ja/guides/integrations-guide/#インテグレーションを削除する)ためにアンインストールし、また`astro.config.mjs`ファイルからも削除する必要があります。 - - ```js del={3,7} - // astro.config.mjs - import { defineConfig } from 'astro/config'; - import image from '@astrojs/image'; - - export default defineConfig({ - integrations: [ - image(), - ] - }) - ``` - -2. (必要に応じて)型を更新します。 - - `src/env.d.ts`に`@astrojs/image`のための特別な型を設定していた場合、v3へのアップグレードでこのステップが完了していなければ、デフォルトのAstroの型に戻す必要があるかもしれません。 - - ```ts title="src/env.d.ts" del={1} ins={2} - /// - /// - ``` - - 同様に、必要に応じて`tsconfig.json`を更新します。 - - ```json title="tsconfig.json" del={3} ins={4} - { - "compilerOptions": { - "types": ["@astrojs/image/client"] - "types": ["astro/client"] - } - } - ``` - -3. 既存の``コンポーネントを移行します。 - - 新しい組み込みの``コンポーネントを使用するために、`@astrojs/image/components`からの`import`文をすべて`astro:assets`に変更します。 - - [現在サポートされていない画像アセットのプロパティ](#プロパティ)を削除します。 - - たとえば、`aspectRatio`はもうサポートされていません。これは、`width`と`height`属性から自動的に推測されるためです。 - - ```astro title="src/components/MyComponent.astro" del= {2,11} ins={3} - --- - import { Image } from '@astrojs/image/components'; - import { Image } from 'astro:assets' - import localImage from "../assets/logo.png"; - const localAlt = "Astroのロゴ"; - --- - - {localAlt} - ``` - -4. デフォルトの画像サービスを選択します。 - - [Sharp](https://github.com/lovell/sharp)は、`astro:assets`で使用されるデフォルトの画像サービスとなりました。Sharpを使用する場合は、特に設定は必要ありません。 - - 画像を変換するために[Squoosh](https://github.com/GoogleChromeLabs/squoosh)を使用したい場合は、以下の`image.service`オプションを使用して設定を更新します。 - - ```js title="astro.config.mjs" ins={4-6} - import { defineConfig, squooshImageService } from 'astro/config'; - - export default defineConfig({ - image: { - service: squooshImageService(), - }, - }); - ``` - -### コンテンツコレクションのスキーマを更新する - -ブログ記事のカバー画像など、コンテンツコレクションのエントリに関連付けられた画像を、現在のフォルダからの相対パスによりフロントマターに宣言できるようになりました。 - -コンテンツコレクションの新しい`image`ヘルパーにより、Zodを使用して画像のメタデータを検証できるようになりました。コンテンツコレクションで画像を使用する方法について、詳しくは[こちら](#コンテンツコレクションと画像)を参照してください。 - -### Astro v3.0での画像インポートの扱い - -Astro v3.0で、以前の画像をインポートした際の挙動を維持しなければならず、画像URLの文字列が必要な場合は、以下のように画像パスの末尾に`?url`を追加してください。 - -```astro title="src/pages/blog/MyImages.astro" ---- -import Sprite from '../assets/logo.svg?url'; ---- - - - -``` - -この方法により、URLの文字列を取得できます。なお、Astroは開発中に`src/`パスを使用しますが、ビルド時には`/_astro/cat.a6737dd3.png`のようなハッシュ化されたパスを生成することに注意してください。 - -画像オブジェクト自体を直接扱いたい場合は、`.src`プロパティにアクセスできます。この方法は、Core Web Vitalsメトリクスのための画像サイズの調整や、CLSの防止などのタスクに最適です。 - -新しいインポートの挙動に移行する場合は、`?url`と`.src`の両方を組み合わせることが、シームレスに画像を扱うための正しい方法かもしれません。 diff --git a/src/content/docs/ja/guides/imports.mdx b/src/content/docs/ja/guides/imports.mdx deleted file mode 100644 index df13fa496b19c..0000000000000 --- a/src/content/docs/ja/guides/imports.mdx +++ /dev/null @@ -1,296 +0,0 @@ ---- -title: インポート -description: Astroでさまざまな種類のコンテンツをインポートする方法を説明します。 -i18nReady: true ---- -import RecipeLinks from "~/components/RecipeLinks.astro"; -import ReadMore from '~/components/ReadMore.astro' - -Astroは、ほとんどの静的アセットを設定不要でサポートしています。プロジェクトのJavaScript(Astro frontmatterスクリプトを含む)のどこでも`import`文を使用でき、Astroは最終ビルドにその静的アセットのビルドされた最適化されたコピーを含めます。また、`@import`はCSSと` -``` - -### スコープされたスタイル - -Astroの` -``` - -このようにコンパイルします。 - -```astro - -``` - -スコープされたスタイルはリークしないので、サイトの他の部分に影響を与えることはありません。Astroでは、`h1 {}`や`p {}`のようなユニークではないセレクタを使用しても問題ありません。なぜなら、最終的な出力ではスコープされてコンパイルされるからです。 - -また、スコープされたスタイルは、テンプレート内に含まれる他のAstroコンポーネントには適用されません。子コンポーネントにスタイルを設定する必要がある場合、そのコンポーネントを`
`(または他の要素)でラップしてからスタイルを付与するか検討してください。 - -スコープされたスタイルの詳細度は維持され、他のCSSファイルやCSSライブラリと一緒に一貫して動作でき、スタイルがコンポーネント外に適用されるのを防ぐ境界は維持されます。 - -### グローバルスタイル - -ほとんどのコンポーネントではスコープされたスタイルを使うことをおすすめしますが、いずれはグローバルでスコープされていないCSSを書くまっとうな理由が見つかるかもしれません。この場合、` -``` - -また、`:global()`セレクタを使用すると、同じ` -

Title

-
-``` - -これは、ブログの投稿や、CMSを使用したドキュメントなど、コンテンツがAstroの外にあるものをスタイルするのに最適な方法です。ただし、特定の親コンポーネントを持つかどうかで外観が異なるコンポーネントは、トラブルシューティングが困難になる可能性があるので注意が必要です。 - -できるだけスコープされたスタイルを使用してください。グローバルなスタイルは、必要なときだけ使うべきです。 - -### `class:list`によるクラスの結合 - -要素上のクラスを動的に組み合わせる必要がある場合、`.astro`ファイルの`class:list`ユーティリティ属性を使用できます。 - -```astro title="src/components/ClassList.astro" /class:list={.*}/ ---- -const { isRed } = Astro.props; ---- - - -
- -``` - -`class:list`の詳細については、[ディレクティブのリファレンス](/ja/reference/directives-reference/#classlist)ページを参照してください。 - - -### CSS変数 - -

- -Astroの` -

こんにちは

-``` - -`define:vars`については、[ディレクティブのリファレンス](/ja/reference/directives-reference/#definevars)のページをご覧ください。 - - -### 子コンポーネントへの`class`の受け渡し - -Astroでは、`class`のようなHTML属性は子コンポーネントには自動で伝わりません。 - -その代わり、子コンポーネントで`class`プロパティを受け取り、それをルート要素に適用します。`class`はJavaScriptの[予約語](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Lexical_grammar#reserved_words)なので、分割代入を利用して名前を変更する必要があります。 - -デフォルト設定でスコープ付きスタイルを使用する場合は、`data-astro-cid-*`属性も渡す必要があります。これは、Propsの残り(`...rest`)をコンポーネントに渡すことで行うことができます。`scopedStyleStrategy`を`class`または`where`に変更した場合は、`...rest`Propsは必要ありません。 - -```astro title="src/components/MyComponent.astro" {2,4} ---- -const { class: className, ...rest } = Astro.props; ---- -
- -
-``` - -```astro title="src/pages/index.astro" ---- -import MyComponent from "../components/MyComponent.astro" ---- - -This will be red! -``` - -:::note[親コンポーネントからスコープされたクラス] -`data-astro-cid-*`属性は親のスコープに子を含むため、親から子へスタイルがカスケードされる可能性があります。 これが意図しない副作用をもたらすのを避けるには、子コンポーネントで一意なクラス名を使用するようにしてください。 -::: - -### インラインスタイル - -HTML要素は、`style`属性を使ってインラインでスタイルを設定できます。これは、CSS文字列またはCSSプロパティのオブジェクトで指定できます。 - -```astro title="src/pages/index.astro" -// これらは同じです -

テキスト

-

テキスト

-``` - - -## 外部スタイル - -外部のグローバルなスタイルシートを参照する方法は2つあります。プロジェクトのソース内にあるファイルの場合はESMのインポート、`public/` ディレクトリにあるファイルやプロジェクトの外部でホストされているファイルの場合は絶対URLリンクになります。 - -詳しくは`public/`や`src/`にある[静的アセット](/ja/guides/imports/)の使い方をご覧ください。 - -### ローカルスタイルシートのインポート - -:::caution[npmパッケージを使用する場合] -npmパッケージからインポートする場合、`astro.config`を更新する必要があるかもしれません。以下の[スタイルシートをnpmパッケージからインポートする](#npmパッケージからスタイルシートをインポートする)をご覧ください。 -::: - -ESMのインポート構文を使用して、Astroコンポーネントのfrontmatterでスタイルシートをインポートできます。CSSのインポートは、[Astroコンポーネント内の他のESMのインポート](/ja/basics/astro-components/#コンポーネントスクリプト)のように動作し、**コンポーネントからの相対パス**を、ほかのimportと同様にコンポーネントスクリプトの**先頭**に記述しなければなりません。 - -```astro title="src/pages/index.astro" {4} ---- -// AstroはこのCSSを自動的にバンドルし、最適化します。 -// これは.scssや.stylなどのプリプロセッサーのファイルにも有効です。 -import '../styles/utils.css'; ---- - -``` - -ESMによるCSSの`import`は、ReactやPreactのようなJSXコンポーネントを含む、あらゆるJavaScriptファイル内でサポートされています。 これは、Reactコンポーネントに対して、コンポーネント単位できめ細かいスタイルを記述するのに便利です。 - -### npmパッケージからスタイルシートをインポートする - -また、外部のnpmパッケージからスタイルシートを読み込む必要がある場合もあります。これは特に[Open Props](https://open-props.style/)のようなユーティリティでよくあることです。パッケージが**ファイル拡張子の使用を推奨**している場合(例:`package-name/styles`の代わりに `package-name/styles.css` )、これは他のローカルスタイルシートと同様に動作するはずです。 - -```astro ---- -// src/pages/random-page.astro -import 'package-name/styles.css'; ---- - -``` - -パッケージが**ファイル拡張子の使用を推奨していない**場合(例: `package-name/styles`)は、まずAstroの設定を更新する必要があります! - -`package-name`から`normalize`という名前のCSSファイルをインポートしているとします(ファイル拡張子は省略されています)。ページを正しくプリレンダリングするために、`package-name`を[`vite.ssr.noExternal`配列](https://vite.dev/config/#ssr-noexternal)に追加してください。 - -```js ins={7} -// astro.config.mjs -import { defineConfig } from 'astro/config'; - -export default defineConfig({ - vite: { - ssr: { - noExternal: ['package-name'], - } - } -}) -``` - -:::note -これは[Vite固有の設定](https://vite.dev/config/#ssr-noexternal)であり、[Astro SSR](/ja/guides/on-demand-rendering/)とは関係がありません。 -::: - -これで、`package-name/normalize`を自由にインポートできるようになりました。これは、他のローカルスタイルシートと同様に、Astroによってバンドルされ、最適化されます。 - -```astro {3} ---- -// src/pages/random-page.astro -import 'package-name/normalize'; ---- - -``` - -### "link"タグで静的スタイルシートを読み込む - -また、``要素を使用して、ページにスタイルシートを読み込めます。これは、`/public`ディレクトリにあるCSSファイルへの絶対URLパスか、外部のウェブサイトへのURLである必要があります。``のhref値を相対パスで指定することはサポートされていません。 - -```astro title="src/pages/index.astro" {3,5} - - - - - - -``` - -この方法では`public/`ディレクトリを使用するため、Astroが提供する通常のCSS処理、バンドル、最適化はスキップされます。これらの変換が必要な場合は、上記の[ローカルスタイルシートのインポート](#ローカルスタイルシートのインポート)の方法を使用してください。 - -## カスケード順序 - -Astroのコンポーネントは、複数のCSSのソースを評価しなければならないことがあります。たとえば、コンポーネントはCSSスタイルシートをインポートし、それ自身の` -
-

- このヘッダーは紫(purple)になります! -

-
-``` - -2つのルールが同じ詳細度を持つ場合、出現順序が評価され、最後のルールの値が優先されます。 - -```astro title="src/components/MyComponent.astro" - -
-

- このヘッダーは赤(red)になります! -

-
-``` - -Astro CSSのルールは、つぎの出現順で評価されます。 - -- **head内の``タグ** (最も低い優先順位) -- **インポートされたスタイル** -- **scoped styles** (最優先) - -### スコープされたスタイル - -[スコープされたスタイル](#スコープされたスタイル)を使用しても、CSSの詳細度が高まるわけではありませんが、常に登場順が最後になります。したがって、同じ比重の他のスタイルよりも優先されます。たとえば、スコープされたスタイルと競合するスタイルシートをインポートした場合、スコープされたスタイルの値が適用されます。 - -```css title="src/components/make-it-purple.css" -h1 { - color: purple; -} -``` - -```astro title="src/components/MyComponent.astro" ---- -import "./make-it-purple.css" ---- - -
-

- このヘッダーは赤(red)になります! -

-
-``` - -インポートされたスタイルの詳細度をあげると、スコープされたスタイルより優先されます。 - -```css title="src/components/make-it-purple.css" -div > h1 { - color: purple; -} -``` - -```astro title="src/components/MyComponent.astro" ---- -import "./make-it-purple.css" ---- - -
-

- このヘッダーは紫(purple)になります! -

-
-``` - -### インポート順序 - -Astroコンポーネントで複数のスタイルシートをインポートする場合、CSSルールはインポートされた順番に評価されます。CSSがいつ評価されるかにかかわらず、より高い詳細度によって、表示するスタイルが常に決定されます。しかし、競合するスタイルが同じ比重を持つ場合、最後にインポートされたものが優先されます。 - -```css title="src/components/make-it-purple.css" -div > h1 { - color: purple; -} -``` -```css title="src/components/make-it-green.css" -div > h1 { - color: green; -} -``` -```astro title="src/components/MyComponent.astro" ---- -import "./make-it-green.css" -import "./make-it-purple.css" ---- - -
-

- このヘッダーは紫(purple)になります! -

-
-``` - -` -
-

- このヘッダーは紫(purple)になります! -

-
-``` - -:::tip -Astroでよくあるパターンは、[Layoutコンポーネント](/ja/basics/layouts/)の中にグローバルCSSをインポートすることです。Layoutコンポーネントは必ず他のインポートより先にインポートして、優先順位を一番低くしてください。 -::: - -### `link`タグ - -[linkタグ](#linkタグで静的スタイルシートを読み込む)で読み込まれたスタイルシートは、Astroファイル内の他のどのスタイルよりも先に、順番に評価されます。したがって、これらのスタイルは、インポートされたスタイルシートやスコープされたスタイルよりも優先順位が低くなります。 - -```astro title="src/pages/index.astro" ---- -import "../components/make-it-purple.css" ---- - - - - - - - Astro - - - -
-

これは紫(purple)になります

-
- - -``` - -## CSSインテグレーション - -Astroには、[Tailwind](https://tailwindcss.com)など、人気のCSSライブラリやツール、フレームワークをプロジェクトに追加するための仕組みがあります! - -### Tailwind - -プロジェクトでTailwindを使用するには、公式の[Astro Tailwindインテグレーション][tailwind]を、パッケージマネージャーの`astro add`コマンドを使ってインストールします。 - - - - ```shell - npx astro add tailwind - ``` - - - ```shell - pnpm astro add tailwind - ``` - - - ```shell - yarn astro add tailwind - ``` - - - -Astroインテグレーションのインストール、インポート、設定の手順については、[インテグレーションガイド](/ja/guides/integrations-guide/)を参照してください。 - -## CSSプリプロセッサ - -Astroは、[Vite][vite-preprocessors]を通じて、[Sass][sass]、[Stylus][stylus]、[Less][less]といったCSSプリプロセッサをサポートしています。 - -### SassとSCSS - - ```shell - npm install sass - ``` - -`.astro`ファイルで` -``` - -詳しくは[Viteのドキュメント](https://vite.dev/guide/assets.html#importing-asset-as-url)をご覧ください。 - -### `?url` CSSインポート - -高度な使い方をする場合、プロジェクトの`src/`ディレクトリ内にあるCSSファイルを直接のURL参照でインポートできます。これは、CSSファイルがどのようにページに読み込まれるかを完全に制御する必要がある場合に便利です。しかし、この場合、そのCSSファイルをページの残りのCSSと一緒に最適化することはできません。 - -これはほとんどのユーザーにはおすすめできません。代わりに、CSSファイルを`public/`内に配置し、一貫したURLの参照を得られるようにしましょう。 - -:::caution -`?url`を指定して小さいCSSファイルをインポートすると、Base64でエンコードされたCSSファイルの内容がデータURLとして返されることがありますが、これは最終的なビルドのときだけです。エンコードされたデータURL(`data:text/css;base64,...`)をサポートするようにコードを書くか、この機能を無効にするために[`vite.build.assetsInlineLimit`](https://vite.dev/config/#build-assetsinlinelimit)設定オプションを `0`にセットする必要があります。 -::: - -```astro ---- -// 高度な例! ほとんどのユーザーにおすすめされません。 -import stylesUrl from '../styles/main.css?url'; ---- - - -``` - -詳しくは[Viteのドキュメント](https://vite.dev/guide/assets.html#importing-asset-as-url)をご覧ください。 - - -[less]: https://lesscss.org/ -[sass]: https://sass-lang.com/ -[stylus]: https://stylus-lang.com/ -[svelte-style]: https://svelte.dev/docs#component-format-style -[tailwind]: /ja/guides/integrations-guide/tailwind/ -[vite-preprocessors]: https://vite.dev/guide/features.html#css-pre-processors -[vue-css-modules]: https://vue-loader.vuejs.org/guide/css-modules.html -[vue-scoped]: https://vue-loader.vuejs.org/guide/scoped-css.html diff --git a/src/content/docs/ja/guides/syntax-highlighting.mdx b/src/content/docs/ja/guides/syntax-highlighting.mdx index 7d81df6256dfe..d8f343d581d15 100644 --- a/src/content/docs/ja/guides/syntax-highlighting.mdx +++ b/src/content/docs/ja/guides/syntax-highlighting.mdx @@ -124,7 +124,7 @@ Astroで使用する場合は次に注意します。 - [``](#code-)(Shikiベース) - [``](#prism-)(Prismベース) -各コンポーネントの`Props`は[`ComponentProps`型](/ja/guides/typescript/#componentprops型)で参照できます。 +各コンポーネントの`Props`は[`ComponentProps`型](/ja/guides/typescript/#componentprops-type)で参照できます。 ### `` diff --git a/src/content/docs/ja/guides/testing.mdx b/src/content/docs/ja/guides/testing.mdx deleted file mode 100644 index 215f55eabdc7e..0000000000000 --- a/src/content/docs/ja/guides/testing.mdx +++ /dev/null @@ -1,269 +0,0 @@ ---- -title: テスト -description: Astroでのテスト入門 -i18nReady: true ---- -import PackageManagerTabs from '~/components/tabs/PackageManagerTabs.astro' - - -テストは、動作するAstroコードを書き、メンテナンスするために役立ちます。Astroは、Jest、Mocha、Jasmine、[Cypress](https://cypress.io)、[Playwright](https://playwright.dev)など、ユニットテスト、コンポーネントテスト、エンドツーエンド(E2E)テスト用の人気ツールを多数サポートしています。UIフレームワークのコンポーネントをテストするために、React Testing Libraryなど特定フレームワーク向けのテストライブラリをインストールすることもできます。 - -テストフレームワークにより、コードが特定の状況でどのように動作するべきかについての**アサーション**または**期待値**を記述し、これらを現在のコードの実際の動作と比較できます。 - -## Vitest - -esbuildによるESM、TypeScript、JSXサポートを備えた、Viteネイティブのユニットテストフレームワークです。 - -Astroの`getViteConfig()`ヘルパーを[`vitest.config.ts`設定ファイル](https://vitest.dev/config/)で使用すると、Astroプロジェクトの設定ファイルによりVitestを設定できます。 - -```js -// vitest.config.ts -import { getViteConfig } from 'astro/config'; - -export default getViteConfig({ - test: { - // Vitestの設定オプション - }, -}); -``` - -GitHubの[Astro + Vitestスターターテンプレート](https://github.com/withastro/astro/tree/latest/examples/with-vitest)を参照してください。 - -## Cypress - -Cypressは、モダンなウェブのために作成されたフロントエンドテストツールです。Cypressにより、AstroサイトのE2Eテストを記述できます。 - -### インストール - -お好みのパッケージマネージャーを使用してCypressをインストールできます。 - - - - ```shell - npm install -D cypress - ``` - - これにより、プロジェクトの開発用依存関係としてCypressがローカルにインストールされます。 - - - ```shell - pnpm add cypress --save-dev - ``` - - - ```shell - yarn add cypress --dev - ``` - - - -### 設定 - -プロジェクトのルートに、以下の内容の`cypress.config.js`ファイルを作成します。 - -```js title="cypress.config.js" -import { defineConfig } from 'cypress' - -export default defineConfig({ - e2e: { - supportFile: false - } -}) -``` - -### 最初のCypressのテストを作成する - -1. テストするページを選択します。ここでは以下の`index.astro`ページを例としてテストします。 - - ```html title="src/pages/index.astro" - --- - --- - - - Astro最高! - - - -

Hello world from Astro

- - - ``` - -2. `cypress/e2e`フォルダに`index.cy.js`ファイルを作成します。以下のテストをファイルで使用し、ページのタイトルとヘッダーが正しいことを確認します。 - - ```js title="cypress/e2e/index.cy.js" - it('タイトルが正しい', () => { - const page = cy.visit('http://localhost:4321'); - - page.get('title').should('have.text', 'Astro最高!') - page.get('h1').should('have.text', 'Hello world from Astro'); - }); - ``` - - :::tip[baseUrlをセットする] - [`"baseUrl": "http://localhost:4321"`](https://docs.cypress.io/guides/end-to-end-testing/testing-your-app#Step-3-Configure-Cypress)を`cypress.config.js`の設定ファイルに定義して`cy.visit("/")`を使用すると、`cy.visit("http://localhost:4321/")`よりも楽にURLを扱うことができます。 - ::: - -### Cypressのテストを実行する - -コマンドラインやCypressアプリケーションを通じてCypressを実行できます。アプリケーションは、テストの実行とデバッグのためのビジュアルインターフェースを提供します。 - -まず、動作中のサイトにCypressがアクセスできるように、開発用サーバーを起動します。 - -コマンドラインから上の例のテストを実行するには、次のコマンドを実行します。 - -```shell -npx cypress run -``` - -または、次のコマンドを実行してCypressアプリケーションによりテストを実行します。 - -```shell -npx cypress open -``` - -Cypressアプリケーションが起動したら、**E2E Testing**を選択し、テストを実行するブラウザを選択します。 - -テストの実行が完了すると、緑色のチェックマークが表示され、テストがパスしたことを確認できます。 - -```shell title="Output from npx cypress run" -Running: index.cy.js (1 of 1) - - -✓ titles are correct (107ms) - -1 passing (1s) -``` - -:::note[テストを失敗させる] -テストが本当に動作しているかを確認するために、`index.astro`ファイルの以下の行を変更します。 - -```astro title="src/pages/index.astro" del={2} ins={3} - -

Hello world from Astro

-

Hello from Astro

- -``` - -そしてテストを再実行します。テストが失敗したことを示す赤い「x」が出力されるはずです。 -::: - -### 次のステップ - -Cypressについての詳細は、以下のリンクを参照してください。 - -- [Introduction to Cypress](https://docs.cypress.io/guides/basics/introduction-to-cypress) -- [Testing Your App](https://docs.cypress.io/guides/end-to-end-testing/testing-your-app) - -## Playwright - -Playwrightは、モダンなウェブアプリケーションのためのE2Eテストフレームワークです。Playwright APIをJavaScriptやTypeScriptで使用し、Chromium、WebKit、FirefoxなどのすべてのモダンなレンダリングエンジンでAstroコードをテストできます。 - -### インストール - -[VS Code拡張機能](https://playwright.dev/docs/getting-started-vscode)を使用してテストを実行できます。 - -または、お好みのパッケージマネージャーを使用してAstroプロジェクトにPlaywrightをインストールできます。CLIの各ステップに従って、JavaScriptかTypeScriptを選択し、テストフォルダを命名し、オプションのGitHub Actionsワークフローを追加してください。 - - - - ```shell - npm init playwright@latest - ``` - - - ```shell - pnpm dlx create-playwright - ``` - - - ```shell - yarn create playwright - ``` - - - -### 初めてのPlaywrightのテストを作成する - -1. テストするページを選択します。ここでは以下の`index.astro`ページを例としてテストします。 - - ```html title="src/pages/index.astro" - --- - --- - - - Astro最高! - - - - - ``` - -1. 新しいフォルダを作成し、`src/test`に以下のテストファイルを追加します。以下のテストをファイルに貼り付けて、ページのメタ情報が正しいことを確認します。ページの``の値を、テストするページと一致するように更新してください。 - - ```jsx title="src/test/index.spec.ts" "Astro最高!" - import { test, expect } from '@playwright/test'; - - test('メタ情報が正しい', async ({ page }) => { - await page.goto("http://localhost:4321/"); - - await expect(page).toHaveTitle('Astro最高!'); - }); - ``` - - :::tip[baseurlをセットする] - 設定ファイル`playwright.config.ts`で[`"baseURL": "http://localhost:4321"`](https://playwright.dev/docs/api/class-testoptions#test-options-base-url)と設定すると、`page.goto("http://localhost:4321/")`の代わりに、より便利なURLとして`page.goto("/")`を使用できます。 - ::: - -### Playwrightのテストを実行する - -ひとつまたは複数のテストを、複数のブラウザで実行可能です。デフォルトでは、テスト結果はターミナルに表示されます。必要に応じて、HTML Test Reporterを開いて完全なレポートを表示したり、テスト結果をフィルタリングできます。 - -1. 上の例のテストをコマンドラインから実行するには、`test`コマンドを使用します。単一のテストのみを実行する場合は、ファイル名をコマンドに含めます。 - - ```sh - npx playwright test index.spec.ts - ``` - -1. HTML Test Reportの全体を確認するには、次のコマンドを使用して開きます。 - - ```sh - npx playwright show-report - ``` - -:::tip -実際にデプロイされたサイトにより近付けるため、本番環境のコードをテストしましょう。 -::: - -#### 応用:テスト中に開発用Webサーバーを起動する - -Playwrightの設定ファイルで[`webServer`](https://playwright.dev/docs/test-advanced#launching-a-development-web-server-during-the-tests)オプションを使用すると、テストスクリプトの実行時に、Playwrightに開発用Webサーバーを起動させることもできます。 - -以下はnpmを使用する場合の設定とコマンドの例です。 - -1. プロジェクトのルートにある`package.json`ファイルに、`"test:e2e": "playwright test"`のようにテストスクリプトを追加します。 - -1. `playwright.config.ts`に`webServer`オブジェクトを追加し、コマンドの値を`npm run preview`に設定します。 - - ```js title="playwright.config.ts" ins={4-9} "npm run preview" - import { defineConfig } from '@playwright/test'; - - export default defineConfig({ - webServer: { - command: 'npm run preview', - url: 'http://localhost:4321/', - timeout: 120 * 1000, - reuseExistingServer: !process.env.CI, - }, - use: { - baseURL: 'http://localhost:4321/', - }, - }); - ``` - -1. `npm run build`を実行した上で、`npm run test:e2e`によりPlaywrightのテストを実行します。 - -Playwrightについての詳細は、以下のリンクを参照してください。 - -- [Getting started with Playwright](https://playwright.dev/docs/intro) -- [Use a development server](https://playwright.dev/docs/test-webserver#configuring-a-web-server) diff --git a/src/content/docs/ja/guides/troubleshooting.mdx b/src/content/docs/ja/guides/troubleshooting.mdx deleted file mode 100644 index 78aeafe37d1c4..0000000000000 --- a/src/content/docs/ja/guides/troubleshooting.mdx +++ /dev/null @@ -1,192 +0,0 @@ ---- -title: トラブルシューティング -description: 助けが必要ですか?何か困ったことがありますか?私たちはあなたを支援します。 -i18nReady: true ---- - -Astroは、コードのトラブルシューティングとデバッグを支援するため、いくつかのツールを提供しています。 - -## よくあるエラーメッセージ - -ターミナルで表示される一般的なエラーメッセージとその意味、および対処法を紹介します。 - -### Cannot use import statement outside a module (モジュール外でimport文が使えません) - -Astroコンポーネントでは、`<script>`タグはデフォルトで[JavaScriptモジュール](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Modules)として巻き上げられロードされます。タグに[`is:inline`ディレクティブ](/ja/reference/directives-reference/#isinline)などの属性が含まれていると、このデフォルトの動作は解除されます。 - -**解決方法**: もし、`<script>`タグに何らかの属性を追加している場合は、import文を使用できるように`type="module"`属性も追加する必要があります。 - -**ステータス**: 期待されるAstroの動作、意図したとおりです。 - -**自分だけの問題ではないと思うなら?** -[この問題](https://github.com/withastro/astro/issues?q=is%3Aissue+is%3Aopen+Cannot+use+import+statement)を報告した人が他にいないか確認してください! - -### Unable to render component(コンポーネントをレンダリングできません) - -Astroテンプレートにインポートして使用しているコンポーネントにエラーがあることを示します。 - -#### よくある原因 - -レンダリング時、`window`または`document`オブジェクトにアクセスしようとした場合、発生する可能性があります。デフォルトでは、Astroはコンポーネントを[アイソモーフィック](https://en.wikipedia.org/wiki/Isomorphic_JavaScript)にレンダリングします。つまり、ブラウザのランタイムが利用できないサーバー上で実行されるということです。この事前レンダリングステップを無効にするには、[`client:only`ディレクティブ](/ja/reference/directives-reference/#clientonly)を使用します。 - -**解決方法**: レンダリング後にそれらのオブジェクトにアクセスしてみてください(例: Reactの[`useEffect()`](https://react.dev/reference/react/useEffect)またはVueの[`onMounted()`](https://vuejs.org/api/composition-api-lifecycle.html#onmounted)とSvelteの[`onMount()`](https://svelte.dev/docs#run-time-svelte-onmount))。 - -**ステータス**: 期待されるAstroの動作、意図したとおりです。 - -#### そうではない? - -**解決方法**: [Astroコンポーネント](/ja/basics/astro-components/)または[UIフレームワークコンポーネント](/ja/guides/framework-components/)の適切なドキュメントをチェックする。[Astro.new](https://astro.new)からAstroのスターターテンプレートを開き、最小限のAstroプロジェクトでコンポーネントのみのトラブルシューティングを検討してください。 - -**自分だけの問題ではないと思うなら?** -[この問題](https://github.com/withastro/astro/issues?q=is%3Aissue+is%3Aopen+Unable+to+render+Component)を報告した人が他にいないか確認してください! - -### Expected a default export(デフォルトのエクスポートを予想) - -このエラーは、無効なコンポーネントをインポートまたはレンダリングしようとしたとき、または正しく動作していないコンポーネントをインポートまたはレンダリングしようとしたときに表示されることがあります。(この特定のメッセージは、AstroでのUIコンポーネントのインポートが動作する方法によって発生します。) - -**解決方法**: インポートおよびレンダリングしているコンポーネントのエラーを探し、それが正しく動作していることを確認してください。[astro.new](https://astro.new)からAstroスターターテンプレートを開き、最小限のAstroプロジェクトであなたのコンポーネントだけをトラブルシューティングすることを検討してみてください。 - -**ステータス**: 期待されるAstroの動作、意図したとおりです。 - - -## 共通の不具合 - -### コンポーネントがレンダリングされない - -まず、[`.astro`コンポーネントスクリプト](/ja/basics/astro-components/#コンポーネントスクリプト)または[`.mdx`ファイル](/ja/guides/markdown-content/#mdxでコンポーネントを使用)で**コンポーネントがインポート**しているかどうか確認します。 - -それから、import文を確認してください。 - -- インポートのリンク先が違っていませんか?(importパスを確認してください) -- インポートしたコンポーネントと同じ名前になっていますか?(コンポーネント名と、[`.Astro`構文にしたがっていること](/ja/reference/astro-syntax/#astroとjsxの違い)を確認してください。) -- インポート時に拡張子が含まれていますか?(インポートしたファイルに拡張子が含まれているか確認してください。例: `.Astro`、`.md`、`.vue`、`.svelte`。 注: `.js(x)`と`.ts(x)`のファイルのみ、拡張子は必要ありません。) - -### コンポーネントがインタラクティブでない - -もし、コンポーネントがレンダリングされているのに(上記参照)、ユーザーの操作に反応しない場合、コンポーネントをハイドレートするための[`client:*` ディレクティブ](/ja/reference/directives-reference/#クライアントディレクティブ)が不足している可能性があります。 - -デフォルトでは、[UIフレームワークコンポーネントはクライアントでハイドレーションされません](/ja/guides/framework-components/#インタラクティブなコンポーネント)。もし`client:*`ディレクティブが提供されない場合、そのHTMLはJavaScriptなしでページにレンダリングされます。 - -:::tip -[Astroコンポーネント](/ja/basics/astro-components/)は、HTMLだけのテンプレートコンポーネントで、クライアントサイドのランタイムはありません。しかし、Astroコンポーネントのテンプレートで`<script>`タグを使用すると、グローバルスコープで実行されるJavaScriptをブラウザに送信できます。 -::: - -### パッケージ'X'が見つかりません - -Astroの起動時に `"Cannot find package 'react'"`(または同様の)警告が表示された場合、そのパッケージをプロジェクトにインストールする必要があることを意味します。すべてのパッケージマネージャーが、peer dependenciesを自動的にインストールするわけではありません。Node v16+でnpmを使用している場合、このセクションを気にする必要はありません。 - -たとえば、Reactは`@astrojs/react`インテグレーションのpeer dependenciesです。つまり、公式の`react`と`react-dom`パッケージを、インテグレーションと一緒にインストールする必要があります。そうすると、インテグレーションは自動的にこれらのパッケージから取得します。 - -```shell ins="react react-dom" -# 例: インテグレーションとフレームワークを一緒にインストールする -npm install @astrojs/react react react-dom -``` - -フレームワークのレンダラーやCSSツールなどのパッケージをAstroに追加する方法は、[Astroのインテグレーションガイド](/ja/guides/integrations-guide/)を参照してください。 - -### `Astro.glob()` - no matches found(一致するものはありません) - -`Astro.glob()`を使用してファイルをインポートする場合は、必要なファイルすべてにマッチする正しいglob構文を使用するようにしてください。 - -#### ファイルパス - -たとえば、`src/pages/index.Astro` で `../components/**/*.js` を使用すると、次の両方のファイルをインポートできます。 -- `src/components/MyComponent.js` -- `src/components/includes/MyOtherComponent.js` - -#### サポートされている値 - -`Astro.glob()`は動的変数と文字列補間をサポートしていません。 - -これはAstroのバグではありません。Viteの[`import.meta.glob()`関数](https://vite.dev/guide/features.html#glob-import)の制限によるもので、静的な文字列リテラルしかサポートしていません。 - -これを回避するには、代わりに`Astro.glob()`を使って必要なファイルをすべて含む、より大きなファイル群をインポートし、フィルタリングしてください。 - -```astro {6-7} ---- -// src/components/featured.astro -const { postSlug } = Astro.props; -const pathToMyFeaturedPost = `src/pages/blog/${postSlug}.md`; - -const posts = await Astro.glob('../pages/blog/*.md'); -const myFeaturedPost = posts.find(post => post.file.includes(pathToMyFeaturedPost)); ---- - -<p> - お気に入りの投稿をみてください! <a href={myFeaturedPost.url}>{myFeaturedPost.frontmatter.title}</a> -</p> -``` - -### Yarn 2+でAstroを使う(Berry) - -Yarn 2+、通称Berryは、Nodeモジュールの保存と管理に[Plug'n'Play (PnP)](https://yarnpkg.com/features/pnp)という技術を使用しているため、`create-astro`による新しいAstroプロジェクトの初期化やAstroでの作業中に[問題を引き起こす](https://github.com/withastro/astro/issues/3450)ことがあります。回避するには、`yarnrc.yml`の[`nodeLinker`プロパティ](https://yarnpkg.com/configuration/yarnrc#nodeLinker)を`node-modules`に設定します。 - -```yaml -nodeLinker: "node-modules" -``` - -## ヒントとコツ - -### `console.log()`を使ったデバッグ - -`console.log()`は、Astroのコードをデバッグするためのシンプルでありながら人気のある方法です。`console.log`ステートメントをどこに書くかによって、デバッグ出力がどこに出力されるかが決まります。 - -#### Frontmatter - -AstroのFrontmatterの`console.log()`は、常にAstro CLIを実行している**ターミナル**に出力されます。これは、Astroがサーバー上で動作していて、ブラウザ上では動作しないためです。 - -```astro {5} ---- -const sum = (a, b) => a + b; - -// 例: CLIターミナルに "4 "を出力する。 -console.log(sum(2, 2)); ---- -``` - -#### JSスクリプト - -Astroの`<script>`タグ内に記述またはインポートされたコードは、ブラウザ上で実行されます。`console.log()`ステートメントやその他のデバッグ出力は、ブラウザのコンソールに出力されます。 - -### フレームワークコンポーネントのデバッグ - -[フレームワークコンポーネント](/ja/guides/framework-components/)(ReactやSvelteなど)はユニークです。これらはデフォルトでサーバーサイドにレンダリングされ、`console.log()`のデバッグ出力がターミナルに表示されることを意味します。しかし、これらはブラウザ用にハイドレートすることもでき、それによってデバッグログがブラウザにも表示されるかもしれません。 - -これはSSR出力とブラウザのハイドレートされたコンポーネントとの間の差異をデバッグするのに便利でしょう。 - -### Astro `<Debug />` コンポーネント - -Astroコンポーネントのデバッグを支援するために、Astroは組み込みの`<Debug />`コンポーネントを提供し、任意の値をコンポーネントHTMLテンプレートに直接レンダリングします。これは、ターミナルとブラウザの間を行ったり来たりすることなく、ブラウザ上で素早くデバッグするのに便利です。 - - -```astro {2,7} ---- -import { Debug } from 'astro/components'; -const sum = (a, b) => a + b; ---- - -<!-- 例: {answer: 6}をブラウザに出力 --> -<Debug answer={sum(2, 4)} /> -``` - -Debugコンポーネントは、さらに柔軟で簡潔なデバッグを行うためのさまざまな構文オプションをサポートしています。 - -```astro {2,7-9} ---- -import { Debug } from 'astro/components'; -const sum = (a, b) => a + b; -const answer = sum(2, 4); ---- -<!-- 例: 3つの例はすべて等価である。 --> -<Debug answer={sum(2, 4)} /> -<Debug {{answer: sum(2, 4)}} /> -<Debug {answer} /> -``` - -## もっと知りたい? - -[Discord](https://astro.build/chat)の`#support`チャンネルで、問題を説明してください。私たちはいつでも喜んでお手伝いします! - -現在の[アストロの未解決問題](https://github.com/withastro/astro/issues/)にアクセスして、既知の問題に遭遇しているかどうかを確認したり、バグレポートを提出したりできます。 - -また、[RFCディスカッション](https://github.com/withastro/rfcs/discussions/)では、Astroの既知の制限事項があるか確認し、あなたのユースケースに関連する提案があるか確認できます。 diff --git a/src/content/docs/ja/guides/typescript.mdx b/src/content/docs/ja/guides/typescript.mdx deleted file mode 100644 index 4ecefe67b7f6f..0000000000000 --- a/src/content/docs/ja/guides/typescript.mdx +++ /dev/null @@ -1,326 +0,0 @@ ---- -title: TypeScript -description: Astro組み込みのTypeScriptサポートの使い方を学ぶ。 -i18nReady: true ---- - -import Since from '~/components/Since.astro' -import PackageManagerTabs from '~/components/tabs/PackageManagerTabs.astro' - -Astroには[TypeScript](https://www.typescriptlang.org/)のサポートが組み込まれています。Astroプロジェクトで`.ts`や`.tsx`ファイルをインポートしたり、[Astroコンポーネント](/ja/basics/astro-components/#コンポーネントスクリプト)の中で直接TypeScriptコードを書いたり、お好みで[`astro.config.ts`](/ja/guides/configuring-astro/#astroの設定ファイル)ファイルを使うこともできます。 - -TypeScriptにより、オブジェクトやコンポーネントの形状(shape)をコードで定義して実行時エラーを防ぐことができます。たとえば、TypeScriptで[コンポーネントのpropsに型を付ける](#コンポーネントprops)と、コンポーネントが受け付けないpropを設定した場合にエディタ内にエラーが発生します。 - -AstroプロジェクトでTypeScriptコードを書かなくても、その恩恵を受けられます。Astroは常にコンポーネントのコードをTypeScriptとして扱い、[Astro VSCode拡張機能](/ja/editor-setup/)は自動補完やヒント、エラーをエディタ内で提供するためにできる限りの推論を行います。 - -Astroの開発サーバーは型チェックを行いませんが、[スクリプトの追加](#型チェック)によりコマンドラインから型エラーをチェックできます。 - -## 準備 - -Astroのスタータープロジェクトには`tsconfig.json`ファイルが含まれています。TypeScriptコードを書かない場合でも、AstroやVS Codeなどのツールがプロジェクトを理解するために、このファイルは重要です。`tsconfig.json`ファイルがないと、npmパッケージのインポートなどの一部の機能がエディタで完全にサポートされません。Astroを手動でインストールする場合は、必ずこのファイルを自分で作成してください。 - -Astroには、`base`、`strict`、`strictest`という3つの拡張可能な`tsconfig.json`のテンプレートが含まれています。`base`テンプレートは、JavaScriptのモダンな機能のサポートを可能とし、他のテンプレートの基礎としても使用されます。プロジェクトでTypeScriptを書く予定がある場合は、`strict`または`strictest`を使用することをお勧めします。[astro/tsconfigs/](https://github.com/withastro/astro/blob/main/packages/astro/tsconfigs/)で3つのテンプレートの設定を確認・比較できます。 - -いずれかのテンプレートを継承するには、[`extends`という設定項目](https://www.typescriptlang.org/tsconfig#extends)を使用します。 - -```json title="tsconfig.json" -{ - "extends": "astro/tsconfigs/base" -} -``` - -また、[Viteのクライアント型](https://vite.dev/guide/features.html#client-types)をプロジェクトで利用できるように、テンプレートには`src`フォルダ内に`env.d.ts`が含まれています。 - -```typescript title="env.d.ts" -/// <reference types="astro/client" /> -``` - -VSCodeを使っていない場合は、[Astro TypeScriptプラグイン](https://www.npmjs.com/package/@astrojs/ts-plugin)をインストールすることで、`.ts`ファイルからの`.astro`ファイルのインポートをサポートできます(これは再エクスポートに便利なことがあります)。 - -<PackageManagerTabs> - <Fragment slot="npm"> - ```shell - npm install @astrojs/ts-plugin - ``` - </Fragment> - <Fragment slot="pnpm"> - ```shell - pnpm add @astrojs/ts-plugin - ``` - </Fragment> - <Fragment slot="yarn"> - ```shell - yarn add @astrojs/ts-plugin - ``` - </Fragment> -</PackageManagerTabs> - -そして、以下の設定を`tsconfig.json`に追加します。 - -```json title="tsconfig.json" - "compilerOptions": { - "plugins": [ - { - "name": "@astrojs/ts-plugin" - }, - ], - } -``` - -プラグインが正しく機能していることを確認するには、`.ts`ファイルを作成し、その中にAstroコンポーネントをインポートします。エディタには警告メッセージが何も表示されないはずです。 - -### UIフレームワーク - -プロジェクトで[UIフレームワーク](/ja/guides/framework-components/)を使用する場合は、フレームワークに応じた追加の設定が必要かもしれません。詳細については、フレームワークのTypeScriptドキュメントを参照してください。 ([Vue](https://vuejs.org/guide/typescript/overview.html#using-vue-with-typescript)、[React](https://react-typescript-cheatsheet.netlify.app/docs/basic/setup)、[Preact](https://preactjs.com/guide/v10/typescript)、[Solid](https://www.solidjs.com/guides/typescript)) - -## 型のインポート - -可能な限り、明示的な型のインポートとエクスポートを使用しましょう。 - -```js del={1} ins={2} ins="type" -import { SomeType } from './script'; -import type { SomeType } from './script'; -``` - -こうすることで、Astroのバンドラーがインポートした型をJavaScriptであるかのように誤ってバンドルするようなエッジケースを避けることができます。 - -`tsconfig.json`ファイルで、型のインポートを強制するようにTypeScriptを設定できます。[`verbatimModuleSyntax`](https://www.typescriptlang.org/tsconfig#verbatimModuleSyntax)を`true`に設定してください。TypeScriptはインポートをチェックし、いつ`import type`を使用するべきかを伝えてくれます。この設定はAstroのすべてのプリセットでデフォルトで有効化されています。 - -```json title="tsconfig.json" ins={3} - { - "compilerOptions": { - "verbatimModuleSyntax": true - } - } -``` - -## Importエイリアス - -Astroは、`tsconfig.json`と`jsconfig.json`の`paths`設定で定義する[importエイリアス](/ja/guides/imports/#importエイリアス)をサポートしています。 - - -```astro title="src/pages/about/nate.astro" "@components" "@layouts" ---- -import HelloWorld from '@components/HelloWorld.astro'; -import Layout from '@layouts/Layout.astro'; ---- -``` - -```json title="tsconfig.json" {5-6} -{ - "compilerOptions": { - "baseUrl": ".", - "paths": { - "@components/*": ["src/components/*"], - "@layouts/*": ["src/layouts/*"] - } - } -} -``` - -## `window`と`globalThis`の拡張 - -グローバルオブジェクトにプロパティを追加することもできます。これは、`env.d.ts`ファイルに`declare`キーワードを使用してトップレベルの宣言を追加することで可能です。 - -```ts title="env.d.ts" -declare const myString: string; -declare function myFunction(): boolean; -``` - -これにより、`globalThis.myString`と`globalThis.myFunction`、さらに`window.myString`と`window.myFunction`に型が提供されます。 - -`window`はクライアントサイドのコード内でのみ利用可能なことに注意してください。`globalThis`はサーバーサイドとクライアントサイドの両方で利用できますが、サーバーサイドの値はクライアントとは共有されません。 - -`window`オブジェクト上のプロパティにのみ型付けしたい場合は、代わりに`Window`インターフェイスを提供してください。 - -```ts title="env.d.ts" -interface Window { - myFunction(): boolean; -} -``` - -## コンポーネントProps - -AstroはTypeScriptによるコンポーネントpropsの型付けをサポートしています。有効にするには、コンポーネントのfrontmatterにTypeScriptの`Props`インターフェースを追加します。`export`文を使用することもできますが、必須ではありません。[Astro VSCode拡張機能](/ja/editor-setup/)は、`Props`インターフェースを自動的に探し、そのコンポーネントを他のテンプレート内で使用するときに適切なTSサポートを提供します。 - -```astro title="src/components/HelloProps.astro" ins={2-5} ---- -interface Props { - name: string; - greeting?: string; -} -const { greeting = 'Hello', name } = Astro.props; ---- -<h2>{greeting}, {name}!</h2> -``` - -### propsの型でよくあるパターン - -- コンポーネントがpropsやスロット経由のコンテンツを受け取らない場合は、`type Props = Record<string, unknown>`を使用できます。 - -- コンポーネントがデフォルトスロットから子要素を受け取る必要がある場合は、`type Props = { children: any; };`によりこれを強制できます。 - -## 型ユーティリティ - -<p><Since v="1.6.0" /></p> - -Astroには、propsに型を付ける際によく出くわすパターン向けに、組み込みのユーティリティ型を提供しています。これらは`astro/types`エントリポイントから利用可能です。 - -### 組み込みのHTML属性 - -Astroは、マークアップが有効なHTML属性を使用していることを確認するために`HTMLAttributes`型を提供しています。この型により、コンポーネントのpropsを構成しやすくなります。 - -たとえば`<Link>`コンポーネントを作成する場合、次のようにコンポーネントのprops型に`<a>`タグのデフォルトHTML属性を反映できます。 - -```astro title="src/components/Link.astro" ins="HTMLAttributes" ins="HTMLAttributes<'a'>" ---- -import { HTMLAttributes } from 'astro/types'; -// `type`を使う -type Props = HTMLAttributes<'a'>; -// または`interface`を拡張します -interface Props extends HTMLAttributes<'a'> { - myProp?: boolean; -} -const { href, ...attrs } = Astro.props; ---- -<a href={href} {...attrs}> - <slot /> -</a> -``` - -また、`.d.ts`ファイルで`astroHTML.JSX`名前空間を再宣言し、デフォルトのJSX定義を拡張して非標準の属性を追加することも可能です。 - -```ts -// src/custom-attributes.d.ts - -declare namespace astroHTML.JSX { - interface HTMLAttributes { - 'data-count'?: number; - 'data-label'?: string; - } - - // CSSのカスタムプロパティをスタイルオブジェクトに追加する - interface CSSProperties { - '--theme-color'?: 'black' | 'white'; - } -} -``` - -:::note -`astroHTML`は`.astro`コンポーネント内にグローバルに注入されます。TypeScriptファイルで使用するには、[triple-slashディレクティブ](https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html)を使用します。 - -```ts -/// <reference types="astro/astro-jsx" /> - -type MyAttributes = astroHTML.JSX.ImgHTMLAttributes; -``` -::: - -### `ComponentProps`型 - -<p><Since v="4.3.0" /></p> - -この型エクスポートを利用すると、別のコンポーネントが`Props`型を直接エクスポートしていなかったとしても、そのコンポーネントが受け付ける`Props`を参照できるようになります。 - -以下に示すのは、`astro/types`の`ComponentProps`を使用して`<Button />`コンポーネントの`Props`型を参照する例です。 - -```astro title="src/pages/index.astro" ---- -import type { ComponentProps } from 'astro/types'; - -import Button from "./Button.astro"; - -type ButtonProps = ComponentProps<typeof Button>; ---- -``` - -### ポリモーフィックな型 - -<p><Since v="2.5.0" /></p> - -Astroには、異なるHTML要素としてレンダリング可能なコンポーネントを、完全に型安全に作成することを簡単にするヘルパーがあります。これは、渡されたpropsに応じて、`<a>`または`<button>`のいずれかとしてレンダリングされる`<Link>`のようなコンポーネントに便利です。 - -以下の例では、完全に型付けされた、任意のHTML要素としてレンダリングできるポリモーフィックなコンポーネントを実装しています。[`HTMLTag`](#組み込みのhtml属性)型を使うことで、`as` propが有効なHTML要素であることを保証しています。 - -```astro ---- -import type { HTMLTag, Polymorphic } from 'astro/types'; - -type Props<Tag extends HTMLTag> = Polymorphic<{ as: Tag }>; - -const { as: Tag, ...props } = Astro.props; ---- - -<Tag {...props} /> -``` - -### `getStaticPaths()`の型の推論 - -<p><Since v="2.1.0" /></p> - -Astroには、動的ルーティングに対して[`getStaticPaths()`](/ja/reference/routing-reference/#getstaticpaths)関数から返される型を扱うためのヘルパーがあります。 - -[`Astro.params`](/ja/reference/api-reference/#params)の型は`InferGetStaticParamsType`で、[`Astro.props`](/ja/reference/api-reference/#props)の型は`InferGetStaticPropsType`で取得できます。 - -```astro title="src/pages/posts/[...slug].astro" {2,14-15} ---- -import type { InferGetStaticParamsType, InferGetStaticPropsType, GetStaticPaths } from 'astro'; - -export const getStaticPaths = (async () => { - const posts = await getCollection('blog'); - return posts.map((post) => { - return { - params: { slug: post.slug }, - props: { draft: post.data.draft, title: post.data.title }, - }; - }); -}) satisfies GetStaticPaths; - -type Params = InferGetStaticParamsType<typeof getStaticPaths>; -type Props = InferGetStaticPropsType<typeof getStaticPaths>; - -const { slug } = Astro.params as Params; -// ^? { slug: string; } -const { title } = Astro.props; -// ^? { draft: boolean; title: string; } ---- -``` - -## 型チェック - -エディタで型エラーを確認するには、[Astro VS Code拡張機能](/ja/editor-setup/)をインストールしてください。`astro start`と`astro build`コマンドは、esbuildでコードをトランスパイルしますが、型チェックは実行しないことに注意してください。TypeScriptのエラーが含まれている場合にビルドされないようにするには、`package.json`のbuildスクリプトを次のように変更します。 - -```json title="package.json" del={2} ins={3} ins="astro check &&" - "scripts": { - "build": "astro build", - "build": "astro check && astro build", - }, -``` - -:::note -`astro check`は、TypeScriptプロジェクトに含まれるすべてのファイルをチェックします。SvelteとVueファイル内の型をチェックするには、それぞれ[`svelte-check`](https://www.npmjs.com/package/svelte-check)と[`vue-tsc`](https://www.npmjs.com/package/vue-tsc)パッケージを使用できます。 -::: - -import ReadMore from '~/components/ReadMore.astro' - -<ReadMore>Astroにおける[`.ts`ファイルのインポート](/ja/guides/imports/#typescript)についてもっと読む。</ReadMore> - -<ReadMore>[TypeScriptの設定](https://www.typescriptlang.org/tsconfig/)についてもっと読む。</ReadMore> - -## トラブルシューティング - -### 同時に複数のJSXフレームワークを型付けしたときのエラー - -同じプロジェクトで複数のJSXフレームワークを使用する場合、フレームワークごとに`tsconfig.json`内の設定が異なり、互いにコンフリクトして問題が発生することがあります。 - -**解決策**:最も使用するフレームワークに合わせて、[`jsxImportSource`設定](https://www.typescriptlang.org/tsconfig#jsxImportSource)を`react`(デフォルト)、`preact`または`solid-js`に設定します。次に、競合する異なるフレームワークのファイル内で[プラグマコメント](https://www.typescriptlang.org/docs/handbook/jsx.html#configuring-jsx)を使用します。 - -デフォルト設定である`jsxImportSource: react`の場合は、次のように使用します。 - -```jsx -// Preact向け -/** @jsxImportSource preact */ - -// Solid向け -/** @jsxImportSource solid-js */ -``` diff --git a/src/content/docs/ja/guides/upgrade-to/v2.mdx b/src/content/docs/ja/guides/upgrade-to/v2.mdx deleted file mode 100644 index e18e0546f114e..0000000000000 --- a/src/content/docs/ja/guides/upgrade-to/v2.mdx +++ /dev/null @@ -1,423 +0,0 @@ ---- -title: Astro v2へのアップグレード -description: プロジェクトをAstroの最新にアップグレードする方法 -i18nReady: true ---- -import PackageManagerTabs from '~/components/tabs/PackageManagerTabs.astro' -import { FileTree } from '@astrojs/starlight/components'; - - -このガイドはAstro v1からAstro v2への移行へ役立ちます。 - -古いプロジェクトからv1へのアップグレードが必要ですか? [古い移行ガイド](/ja/guides/upgrade-to/v1/)をご覧ください。 - -## Astroをアップグレードする - -パッケージマネージャを使用して、プロジェクトのAstroのバージョンを最新版に更新してください。Astroインテグレーションを使用している場合は、それらも最新バージョンにアップデートしてください。 - -<PackageManagerTabs> - <Fragment slot="npm"> - ```shell - # Astro v2.xのアップグレード - npm install astro@latest - - # 例: ReactとTailwindのインテグレーションをアップグレードする - npm install @astrojs/react@latest @astrojs/tailwind@latest - ``` - </Fragment> - <Fragment slot="pnpm"> - ```shell - # Astro v2.xのアップグレード - pnpm add astro@latest - - # 例: ReactとTailwindのインテグレーションをアップグレードする - pnpm add @astrojs/react@latest @astrojs/tailwind@latest - ``` - </Fragment> - <Fragment slot="yarn"> - ```shell - # Astro v2.xのアップグレード - yarn add astro@latest - - # 例: ReactとTailwindのインテグレーションをアップグレードする - yarn add @astrojs/react@latest @astrojs/tailwind@latest - ``` - </Fragment> -</PackageManagerTabs> - -## Astro v2.0の互換性のない変更点 - -Astro v2.0では、いくつかの変更点があり、以前廃止された機能が削除されています。もしv2.0にアップグレードした後、プロジェクトが期待通りに動作しない場合、このガイドですべての変更点の概要とコードベースの更新方法を確認してください。 - -リリースノートの全文は[変更履歴](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md)をご覧ください。 - -### 削除: Node 14のサポート - -Node 14は2023年の4月に終了する予定です。 - -Astro v2.0では、Node 14のサポートを完全に停止し、すべてのAstroユーザーがNodeのよりモダンな機能を利用できるようにしました。 - -#### どうすればいいの? - - 開発環境とデプロイ環境の両方が**Node `16.12.0`以降**を使用していることを確認してください。 - -1. Nodeのローカルバージョンを確認します: - - ```sh - node -v - - ``` - ローカル環境のアップグレードが必要な場合は[Nodeをインストール](https://nodejs.org/ja/download/)してください。 - - -2. [デプロイ環境](/ja/guides/deploy/)自身のドキュメントを確認し、Node 16をサポートしているかどうかを確認します。 - - AstroプロジェクトにNode `16.12.0`を指定するには、ダッシュボードの設定、または`.nvmrc`ファイルのいずれかを使用します。 - - -### 予約: `src/content/` - -Astro v2.0では、MarkdownやMDXファイルを[コンテンツコレクション](/ja/guides/content-collections/)に整理するためのCollections APIが追加されました。このAPIは、`src/content/`を特別なフォルダとして予約します。 - -#### どうすればいいの? - -`src/content/`フォルダの名前を変更し、競合を回避します。このフォルダが存在する場合は、[コンテンツコレクション](/ja/guides/content-collections/)にのみ使用することができるようになりました。 - -### 変更: `Astro.site`末尾のスラッシュ - -v1.xでは、astro.config.mjsで `site` として設定したURLに `Astro.site` でアクセスすると、常に末尾にスラッシュが付くようにしました。 - -Astro v2.0では、`site`の値が変更されなくなりました。`Astro.site`は定義された正確な値を使用し、必要であれば末尾のスラッシュを指定する必要があります。 - -#### どうすればいいの? - - `astro.config.mjs`で、`site`に設定したURLの末尾にスラッシュを追加します。 - -```js del={5} ins={6} -// astro.config.mjs -import { defineConfig } from 'astro/config'; - -export default defineConfig({ - site: 'https://example.com', - site: 'https://example.com/', -}); -``` - -### 変更: ビルドアセット用の`_astro/`フォルダー - -v1.xでは、アセットは`assets/`や`chunks/`、ビルド出力のルートなど、様々な場所にビルドされていました。 - -Astro v2.0では、すべてのビルド出力アセットを新しい`_astro/`フォルダに移動し、場所を統一しています。 - -<FileTree> -- dist/ - - _astro - - client.9218e799.js - - index.df3f880e0.css -</FileTree> -{/* TODO: Set anchor link from #buildformat to #buildassets */} -この場所は[新しい`build.assets`設定オプション](/ja/reference/configuration-reference/#buildformat)で制御できます。 - -#### どうすればいいの? - -これらの資産の場所に依存している場合、開発プラットフォームの設定を更新します。 - -### 変更: Markdownプラグインの設定 - -#### 削除: `extendDefaultPlugins` - - v1.xでは、Astroは独自のMarkdownプラグインを追加する時に、Astroのデフォルトプラグインを再有効化するために`markdown.extendDefaultPlugins`を使用しました。 - -Astro v2.0ではこの動作がデフォルトとなったため、この設定オプションを完全に削除しています。 - -Markdownの設定でremarkとrehypeのプラグインを適用しても、**Astroのデフォルトのプラグインを無効にしなくなりました。** GitHub-Flavored MarkdownとSmartypantsは、カスタムの `remarkPlugins` や `rehypePlugins` が設定されているかどうかにかかわらず適用されるようになりました。 - -##### どうすればいいの? - -設定の`extendDefaultPlugins`を削除してください。これはv2.0のAstroのデフォルトの動作になったので、この行を削除しても差し支えはありません。 - -```js del={6} -// astro.config.mjs -import { defineConfig } from 'astro/config'; - -export default defineConfig({ - markdown: { - extendDefaultPlugins, - } -}); -``` - -#### 追加: `gfm`と`smartypants` - -v1.xでは、 `markdown.extendDefaultPlugins: false`を設定することでAstroのデフォルトMarkdownプラグイン(GitHub-Flavored MarkdownとSmartyPants)の両方を無効化することができました。 - -Astro v2.0では、`markdown.extendDefaultPlugins: false`を、Astroに内蔵されたデフォルトのMarkdownプラグインを個別に制御するブール値のオプションに置き換えました。これらはデフォルトで有効になっており、個別に `false` に設定できます。 - -##### どうすればいいの? - -`extendDefaultPlugins: false`を削除し、その代わりに各プラグインを個別に無効化するフラグを追加しました。 - -- `markdown.gfm: false` GitHub-Flavored Markdownを無効化する -- `markdown.smartypants: false` SmartyPantsを無効化する - -```js del={6} ins={7-8} -// astro.config.mjs -import { defineConfig } from 'astro/config'; - -export default defineConfig({ - markdown: { - extendDefaultPlugins: false, - smartypants: false, - gfm: false, - } -}); -``` - -### 変更: MDXプラグイン設定 - -#### 置き換え: `extendPlugins`が`extendMarkdownConfig`へ変更されました。 - -v1.xでは、MDXインテグレーションの`extendPlugins`オプションで、MDXファイルがMarkdownの設定をどのように継承するかを管理しました。Markdownの全設定(`markdown`)、またはAstroのデフォルトプラグインのみ(`default`)です。 - -Astro v2.0では、`mdx.extendPlugins`で制御される動作を、デフォルトで`true`になる3つの新しい独立した設定可能なオプションに置き換えています。 - -- **[`mdx.extendMarkdownConfig`](/ja/guides/integrations-guide/mdx/#extendmarkdownconfig)** を使えば、Markdownの設定のすべてまたは一部を引き継げます。 -- **`mdx.gfm`** でMDXのGitHub-Flavored Markdownの有効・無効化を設定します。 -- **`mdx.smartypants`** MDXのSmartyPantsの有効・無効化を設定します。 - -##### どうすればいいの? - -`extendPlugins: 'markdown'`を設定から削除してください。これで、デフォルトの動作になります。 - -```js del={8} -// astro.config.mjs -import { defineConfig } from 'astro/config'; -import mdx from '@astrojs/mdx'; - -export default defineConfig({ - integrations: [ - mdx({ - extendPlugins: 'markdown', - }), - ], -}); -``` - -`extendPlugins: 'defaults'`を`extendMarkdownConfig: false`に置き換え、GitHub-Flavored MarkdownとSmartyPantsの個別のオプションを追加し、これらのデフォルトプラグインをMDXで個別に有効化します。 - -```js del={8} ins={9-11} -// astro.config.mjs -import { defineConfig } from 'astro/config'; -import mdx from '@astrojs/mdx'; - -export default defineConfig({ - integrations: [ - mdx({ - extendPlugins: 'defaults', - extendMarkdownConfig: false, - smartypants: true, - gfm: true, - }), - ], -}); -``` - -#### 追加: Markdownに対応したMDX設定オプションの追加 - -Astro v2.0では、MDXインテグレーション設定において、[利用可能なすべてのMarkdown設定オプション](/ja/reference/configuration-reference/#マークダウンのオプション)(`drafts`を除く)を個別に設定できるようになりました。 - -```js -// astro.config.mjs -import { defineConfig } from 'astro/config'; -import mdx from '@astrojs/mdx'; - -export default defineConfig({ - markdown: { - remarkPlugins: [remarkPlugin1], - gfm: true, - }, - integrations: [ - mdx({ - remarkPlugins: [remarkPlugin2], - gfm: false, - }) - ] -}); -``` - -##### どうすればいいの? - -MarkdownとMDXの設定を再検討し、既存の設定と利用可能な新しいオプションを比較します。 - - - -### 変更: フロントマターへのプラグインアクセス - -v1.xでは、remarkとrehypeプラグインはユーザーのフロントマターにアクセスすることができませんでした。Astroはプラグインのフロントマターをファイルのフロントマターにマージし、ファイルのフロントマターをプラグインに渡さないようにしました。 - -Astro v2.0ではremarkとrehypeプラグインがフロントマターインジェクションを介してユーザーのフロントマターへのアクセスを提供します。これにより、プラグインの作者はユーザーの既存のフロントマターを変更したり、他のプロパティに基づいて新しいプロパティを計算したりすることができます。 - - -#### どうすればいいの? - -あなたが書いたremarkやrehypeプラグインの動作が変わったかどうか確認してください。`data.astro.frontmatter`は空のオブジェクトではなく、完全なMarkdownまたはMDXドキュメントのフロントマターになったことに注意してください。 - -### 変更: RSSの構成 - -v1.xでは、AstroのRSSパッケージは、`items: import.meta.glob(...)`を使って、RSSフィードアイテムのリストを生成することができました。この使い方は現在非推奨であり、いずれ削除される予定です。 - -Astro v2.0では、`items`プロパティに`pagesGlobToRssItems()`が導入されました。 - -#### どうすればいいの? - -`import.meta.glob()`を含む既存の関数を`pagesGlobToRssItems()`ヘルパーでラップしてください。 - -```js ins={3, 8, 10} -// src/pages/rss.xml.js -import rss, { - pagesGlobToRssItems -} from '@astrojs/rss'; - -export async function get(context) { - return rss({ - items: await pagesGlobToRssItems( - import.meta.glob('./blog/*.{md,mdx}'), - ), - }); -} -``` - -### 変更: Svelte IDEのサポート - -Astro v2.0では、[`@astrojs/svelte`インテグレーション](/ja/guides/integrations-guide/svelte/)を使用する場合、プロジェクトに`svelte.config.js`ファイルが必要です。これはIDEの自動補完を提供するために必要です。 - -#### どうすればいいの? - -プロジェクトのルートに`svelte.config.js`ファイルを追加します。 - -```js -// svelte.config.js -import { vitePreprocess } from '@astrojs/svelte'; - -export default { - preprocess: vitePreprocess(), -}; -``` - -新規ユーザーの場合、`astro add svelte`を実行すると、このファイルが自動的に追加されます。 - -### 削除: `legacy.astroFlavoredMarkdown` - -v1.0では、Astroは古いastroFlavored Markdown(Components in Markdownとしても知られている)をレガシ機能へ移行しました。 - -Astro v2.0では、`legacy.astroFlavoredMarkdown` オプションは完全に削除されました。`.md`ファイル内のコンポーネントをインポートして使うことはできなくなります。 - -#### どうすればいいの? - -このレガシーフラグを削除します。 Astroでは使用できなくなりました。 - -```js del={3-5} -// astro.config.mjs -export default defineConfig({ - legacy: { - astroFlavoredMarkdown: true, - }, -}) - -``` - -v1.xでこの機能を使用していた場合は、[MDXインテグレーション](/ja/guides/integrations-guide/mdx/)を使用することをお勧めします。これにより、コンポーネントとJSX式をMarkdown構文で組み合わせることができます。 - -### 削除: `Astro.resolve()` - -v0.24では、Astroは、ブラウザーで参照する可能性があるアセットへの解決済みURLを取得するための `Astro.resolve()` を非推奨にしました。 - -Astro v2.0では、このオプションが完全に削除されています。あなたのコードで`Astro.resolve()`を使用すると、エラーが発生します。 - -#### どうすればいいの? - -アセットパスの解決は、代わりに`import`を使用します。例えば、次のようになります。 - -```astro -// src/pages/index.astro ---- -import 'style.css'; -import imageUrl from './image.png'; ---- - -<img src={imageUrl} /> -``` - -### 削除: `Astro.fetchContent()` - -v0.26では、ローカルのMarkdownファイルからデータを取得するための`Astro.fetchContent()`を非推奨にしました。 - -Astro v2.0では、このオプションは完全に削除されています。あなたのコードで`Astro.fetchContent()`を実行すると、エラーになります。 - -#### どうすればいいの? - -{/* TODO: Set anchor link from #その他のアセット to #astroglob */} -[`Astro.glob()`](/ja/guides/imports/#その他のアセット)を使ってローカルのMarkdownファイルを取得したり、[コンテンツコレクション](/ja/guides/content-collections/)に変換したりできます。 - -```astro -// src/pages/index.astro ---- -const allPosts = await Astro.glob('./posts/*.md'); ---- -``` - -### 更新: `Astro.canonicalURL` - -v1.0では、Astroは正規のURLを構築するための`Astro.canonicalURL`を非推奨にしました。 - -Astro v2.0では、このオプションは完全に削除されています。あなたのコードで`Astro.canonicalURL`を実行すると、エラーになります。 - - -#### どうすればいいの? - -`Astro.url`を使用して、正規のURLを構築します。 - -```astro -// src/pages/index.astro ---- -const canonicalURL = new URL(Astro.url.pathname, Astro.site); ---- - -``` - -### 更新: Vite 4 - -Astro v2.0は、2022年12月にリリースされたVite 3から[Vite 4](https://vite.dev/)にアップグレードします。 - -#### どうすればいいの? - -コードの変更は必要ありません。Astro内部でほとんどのアップグレードに対応しました。ただし、Viteの微妙な動作はバージョンによって変化することがあります。 - -問題が発生した場合は、公式の[Vite移行ガイド](https://vite.dev/guide/migration.html)を参照してください。 - -## Astro v2.0 実験用フラグを削除しました。 - -`astro.config.mjs`から以下の実験的フラグを削除します。 - -```js del={5-9} -// astro.config.mjs -import { defineConfig } from 'astro/config'; - -export default defineConfig({ - experimental: { - contentCollections: true, - prerender: true, - errorOverlay: true, - }, -}) -``` - -これらの機能は、デフォルトで利用できるようになりました。 - -- MarkdownやMDXのファイルを型安全で管理する方法として、[コンテンツコレクション](/ja/guides/content-collections/)があります。 -- SSR使用時に[個別ページ静的HTMLにプリレンダリング](/ja/guides/on-demand-rendering/)をし、高速化とキャッシュ性能の向上を図る。 -- エラーメッセージのオーバーレイのデザインを変更しました。 - -## 既知の問題点 - -現在、既知の問題はありません。 diff --git a/src/content/docs/ja/guides/upgrade-to/v3.mdx b/src/content/docs/ja/guides/upgrade-to/v3.mdx deleted file mode 100644 index a9f594b02a6eb..0000000000000 --- a/src/content/docs/ja/guides/upgrade-to/v3.mdx +++ /dev/null @@ -1,695 +0,0 @@ ---- -title: Astro v3へのアップグレード -description: プロジェクトを最新版のAstro(v3.0)にアップグレードする方法。 -i18nReady: true ---- -import PackageManagerTabs from '~/components/tabs/PackageManagerTabs.astro' - -このガイドでは、Astro v2からAstro v3への移行方法について説明します。 - -古いプロジェクトをv2にアップグレードする必要がありますか? [以前の移行ガイド](/ja/guides/upgrade-to/v2/)を参照してください。 - -## Astroをアップグレードする - -パッケージマネージャーを使用して、プロジェクトのAstroのバージョンを最新に更新します。 Astroのインテグレーションを使用している場合は、そちらも最新バージョンに更新してください。 - -<PackageManagerTabs> - <Fragment slot="npm"> - ```shell - # Astro v3.xにアップグレード - npm install astro@latest - - # ReactとTailwindのインテグレーションをアップグレードする例 - npm install @astrojs/react@latest @astrojs/tailwind@latest - ``` - </Fragment> - <Fragment slot="pnpm"> - ```shell - # Astro v3.xにアップグレード - pnpm add astro@latest - - # ReactとTailwindのインテグレーションをアップグレードする例 - pnpm add @astrojs/react@latest @astrojs/tailwind@latest - ``` - </Fragment> - <Fragment slot="yarn"> - ```shell - # Astro v3.xにアップグレード - yarn add astro@latest - - # ReactとTailwindのインテグレーションをアップグレードする例 - yarn add @astrojs/react@latest @astrojs/tailwind@latest - ``` - </Fragment> -</PackageManagerTabs> - -:::note[他にやることはありますか?] -Astroを最新版にアップグレードしたあと、プロジェクトへの変更が必要とは限りません! - -しかし、エラーや予想外の動作が発生した場合は、変更された内容と、プロジェクトを更新する必要があるかどうかを以下で確認してください。 -::: - -## Astro v3の実験的なフラグの削除 - -`astro.config.mjs`から以下の実験的なフラグを削除します。 - -```js del={5-8} -// astro.config.mjs -import { defineConfig } from 'astro/config'; - -export default defineConfig({ - experimental: { - assets: true, - viewTransitions: true, - }, -}) -``` - -これらの機能はデフォルトで利用できるようになりました。 - -- アニメーションによるページ遷移とアイランドを永続化するためのビュートランジション。 -- 新しい`<Image />`コンポーネントと`getImage()`関数を含む、Astroで画像を使用するための新しい画像サービスAPI`astro:assets`。**この実験的なフラグを使用していたかどうかにかかわらず**、詳細な[画像をアップグレードするためのアドバイス](/ja/guides/images/#v2xからv30へのアップグレード)を読んで、プロジェクトへの影響を確認してください。 - -以上2つのエキサイティングな機能とその他については、[3.0のブログ記事](https://astro.build/blog/astro-3/)を確認してください! - - - -## Astro v3の破壊的変更 - -Astro v3.0には、いくつかの破壊的な変更と、以前に非推奨になっていた機能の削除が含まれています。v3.0にアップグレードしたあとプロジェクトが期待通りに動作しない場合はこのガイドを読み、すべての破壊的な変更の概要と、コードベースを更新する方法についての手順を確認してください。 - -リリースノートの全文については、[変更履歴](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md)を参照してください。 - -### 削除: Node 16のサポート - -Node 16は2023年9月にサポート終了予定です。 - -すべてのAstroユーザーがNodeのよりモダンな機能を利用できるようにするため、Astro v3.0ではNode 16のサポートを完全に終了します。 - -#### どうすればいいですか? - -開発環境とデプロイ環境の両方が**Node `18.14.1`以上**を使用していることを確認してください。 - -1. ローカルのNodeのバージョンを確認します。 - - ```sh - node -v - ``` - - - -2. [デプロイ環境](/ja/guides/deploy/)のドキュメントを読み、Node 18がサポートされていることを確認してください。 - - AstroプロジェクトにNode `18.14.1`を指定するには、ダッシュボードの設定または`.nvmrc`ファイルを使用します。 - - ```bash title=".nvmrc" - 18.14.1 - ``` - -### 削除: TypeScript 4のサポート - -Astro v2.xの`tsconfig.json`のプリセットでは、TypeScript 4.xと5.xの両方がサポートされていました。 - -Astro v3.0では`tsconfig.json`のプリセットが更新され、TypeScript 5.xのみをサポートするようになりました。Astroは現在、TypeScript 5.0(2023年3月)を使用しているか、(VS Code 1.77などのように)エディタにTypeScript 5.0が含まれていることを前提とします。 - -#### どうすればいいですか? - -TypeScriptをローカルにインストールしている場合は、v5.0以上に更新してください。 - -```bash -npm install typescript@latest --save-dev -``` - -### 削除: `@astrojs/image` - -Astro v2.xでは、Astroは`<Image />`や`<Picture />`コンポーネントを含む公式の画像インテグレーションを提供していました。 - -Astro v3.0では、このインテグレーションはコードベースから完全に削除されます。Astroの新しい画像向けソリューションは、組み込みの画像サービスAPI`astro:assets`です。 - -#### どうすればいいですか? - -`@astrojs/image`インテグレーションをプロジェクトから削除します。インテグレーションをアンインストールするだけでなく、インポート文と、既存の`<Image />`と`<Picture />`コンポーネントを更新または削除する必要があります。また、デフォルトの画像処理サービスを設定する必要があるかもしれません。 - -画像のガイドには、[古い画像インテグレーションを削除するための完全なステップバイステップの手順](/ja/guides/images/#astrojsimageを削除する)が記載されています。 - -`astro:assets`に移行すると、新しい画像オプションや機能が追加されており、これらを使ってみたくなるはずです。詳細については、[v3.0の画像アップグレードアドバイス](/ja/guides/images/#v2xからv30へのアップグレード)をご覧ください! - -```js del={3,7} -// astro.config.mjs -import { defineConfig } from 'astro/config'; -import image from '@astrojs/image'; - -export default defineConfig({ - integrations: [ - image(), - ] -}) -``` - -### 削除: `<Markdown />`コンポーネント - -Astro v1.xで`<Markdown />`コンポーネントは非推奨となり、外部パッケージに移動されました。 - -Astro v3.0では、`@astrojs/markdown-component`パッケージは完全に削除されます。Astroの`<Markdown />`コンポーネントは、プロジェクトで動作しなくなります。 - -#### どうすればいいですか? - -`@astrojs/markdown-component`のすべてのインスタンスを削除します。 - -```astro del={2} title="src/components/MyAstroComponent.astro" ---- -import Markdown from '@astrojs/markdown-component'; ---- -``` - -コード内で同じような`<Markdown />`コンポーネントを引き続き使用するには、[`astro-remote`](https://github.com/natemoo-re/astro-remote)などの[コミュニティインテグレーション](https://astro.build/integrations/)を使用してみてください。インテグレーションのドキュメントに従って、必要に応じて`<Markdown />`コンポーネントのインポートと属性を更新してください。 - -それ以外の場合は、`.astro`ファイルからAstroの`<Markdown />`コンポーネントのインポートとコンポーネント自体を削除します。コンテンツを直接HTMLとして書き直すか、`.md`ファイルから[Markdownをインポート](/ja/guides/markdown-content/#markdownのインポート)する必要があります。 - -### 削除: 非推奨の1.xのAPI - -Astro v1.xでは、初期のAstroの設定値や、`<style global>`と`<script hoist>`のサポートは非推奨とされました。しかし、これらは後方互換性のためにまだサポートされていました。 - -Astro v3.0では、これらの非推奨APIは完全に削除されます。公式にサポートされている[設定](/ja/reference/configuration-reference/)と、モダンな`<style is:global>`と`<script>`構文を代わりに使用する必要があります。 - -#### どうすればいいですか? - -v1.xのAPIを引き続き使用する場合は、代わりに各機能に対応する新しいAPIを使用してください。 - -- 非推奨となった設定値については、[0.26移行ガイド](/ja/guides/upgrade-to/v1/#new-configuration-api)を参照してください。 -- 非推奨となったscript/style属性については、[0.26移行ガイド](/ja/guides/upgrade-to/v1/#new-default-script-behavior)を参照してください。 - -### 削除: サーバーコードでのWeb APIの部分的なシム - -Astro v2.xでは、サーバーでレンダリングされるコードで`document`や`localStorage`などのWeb APIの部分的なシムが提供されていました。これらのシムは、しばしば不完全で信頼性がありませんでした。 - -Astro v3.0では、これらの部分的なシムは完全に削除されます。サーバーでレンダリングされるコードではWeb APIは利用できなくなります。 - -#### どうすればいいですか? - -サーバーでレンダリングされるコンポーネントでWeb APIを使用している場合は、それらのAPIを使用している箇所に条件文を追加するか、[`client:only`クライアントディレクティブ](/ja/reference/directives-reference/#clientonly)を使用する必要があります。 - -### 削除: コンテンツコレクションの`astro:content`の`image` - -Astro v2.xでは、コンテンツコレクションAPIは、コンテンツコレクションのスキーマで使用するために`astro:content`からエクスポートしていた`image`を非推奨としました。 - -Astro v3.0では、このエクスポートは完全に削除されます。 - -#### どうすればいいですか? - -非推奨となった`astro:content`の`image()`を使用している場合、これはもう存在しないため削除してください。代わりに、[`schema`の`image`ヘルパー](/ja/guides/images/#コンテンツコレクションのスキーマを更新する)を使用して画像を検証します。 - - ```ts title="src/content/config.ts" del={1} ins={2} "({ image })" -import { defineCollection, z, image } from "astro:content"; -import { defineCollection, z } from "astro:content"; - - defineCollection({ - schema: ({ image }) => - z.object({ - image: image(), - }), -}); -``` - -### 削除: 0.14以前のShikiのテーマ名 - -Astro v2.xでは、Shikiの一部のテーマ名が変更されましたが、後方互換性のためにもとの名前が保持されていました。 - -Astro v3.0では、変更されたテーマ名を優先し、もとの名前は削除されます。 - -#### どうすればいいですか? - -プロジェクトで以下のテーマのいずれかを使用している場合は、新しい名前に変更してください。 - -- `material-darker` -> `material-theme-darker` -- `material-default` -> `material-theme` -- `material-lighter` -> `material-theme-lighter` -- `material-ocean` -> `material-theme-ocean` -- `material-palenight` -> `material-theme-palenight` - -### 削除: `class:list`機能 - -Astro v2.xでは、[`class:list`ディレクティブ](/ja/reference/directives-reference/#classlist)は、[`clsx`](https://github.com/lukeed/clsx)に影響されたカスタム実装を使用しており、重複排除や`Set`のサポートなど、いくつかの追加機能がありました。 - -Astro v3.0では、`class:list`で`clsx`を直接使用するようになり、重複排除や`Set`の値はサポートされなくなりました。 - -#### どうすればいいですか? - -`class:list`ディレクティブに渡している`Set`要素を、プレーンな`Array`に置き換えます。 - -```astro title="src/components/MyAstroComponent.astro" del={4} ins={5} -<Component class:list={[ - 'a', - 'b', - new Set(['c', 'd']) - ['c', 'd'] -]} /> -``` - -### 削除: propとしての`class:list`の受け渡し - -Astro v2.xでは、[`class:list`の値](/ja/reference/directives-reference/#classlist)は[`Astro.props['class:list']`](/ja/reference/api-reference/#props)を介してコンポーネントに送信されました。 - -Astro v3.0では、`class:list`の値は、`Astro.props['class']`を介してコンポーネントに送信される前に、文字列に正規化されます。 - -#### どうすればいいですか? - -`class:list`プロパティを受け取ることを期待しているコードを削除します。 - -```astro title="src/components/MyAstroComponent.astro" del={2,3,7} ins={4,8} "classList" "'class:list': classList" ---- -import { clsx } from 'clsx'; -const { class: className, 'class:list': classList } = Astro.props; -const { class: className } = Astro.props; ---- -<div - class:list={[className, classList]} - class:list={[className]} -/> -``` - -### 削除: キャメルケースのCSS変数のケバブケースへの変換 - -Astro v2.xでは、`style`属性に渡されたキャメルケースの[CSS変数](/ja/guides/styling/#css変数)は、(書かれた通りの)キャメルケースと(後方互換性のために必要な)ケバブケースの両方でレンダリングされました。 - -Astro v3.0では、キャメルケースのCSS変数名のケバブケースへの変換は削除され、もとのキャメルケースのCSS変数のみがレンダリングされます。 - -```astro "my-value" ---- -// src/components/MyAstroComponent.astro -const myValue = "red" ---- -<!-- 入力 --> -<div style={{ "--myValue": myValue }}></div> - -<!-- Astro 2.xの出力 --> -<div style="--my-value:var(--myValue);--myValue:red"></div> -<!-- Astro 3.0の出力 --> -<div style="--myValue:red"></div> -``` - -#### どうすればいいですか? - -Astroがスタイルをケバブケースへと変換することに依存している場合は、下の例のように既存のスタイルをキャメルケースに更新して、スタイルが失われないようにします。 - -```astro del={3} ins={4} title="src/components/MyAstroComponent.astro" -<style> - div { - color: var(--my-value); - color: var(--myValue); - } -</style> -``` - -### 削除: `getStaticPaths()`の戻り値の自動フラット化 - -Astro v2.xでは、[`getStaticPaths()`](/ja/reference/routing-reference/#getstaticpaths)の戻り値は、配列の配列を返してもエラーとならないように、自動的にフラット化されていました。 - -Astro v3.0では、`getStaticPaths()`の結果に対する自動フラット化が削除されます。 - -#### どうすればいいですか? - -期待されているオブジェクトの配列ではなく、配列の配列を返している場合は、`.flatMap`と`.flat`を使用して、フラットな配列を返すようにしてください。 - -コードを更新する必要がある場合は、[`getStaticPath()`の戻り値はオブジェクトの配列でなければならないことを示すエラーメッセージ](/ja/reference/errors/invalid-get-static-paths-entry/#何が問題か)が表示されます。 - -### 移動: `astro check`は外部パッケージが必要になりました - -Astro v2.xでは、[`astro check`](/ja/reference/cli-reference/#astro-check)はAstroにデフォルトで含まれており、その依存関係はAstroにバンドルされていました。これは、`astro check`を使用するかどうかにかかわらず、パッケージが肥大化することを意味していました。また、TypeScriptとAstro Language Serverのバージョンを制御できないという問題もありました。 - - -Astro v3.0では、`astro check`コマンドをAstroのコアから外に移動し、外部パッケージ`@astrojs/check`が必要になりました。さらに、`astro check`コマンドを使用するには、プロジェクトに`typescript`をインストールする必要があります。 - -#### どうすればいいですか? - -Astro v3.0にアップグレードして`astro check`コマンドを実行し、必要な依存関係をインストールしようとするプロンプトに従うか、`@astrojs/check`と`typescript`を手動でプロジェクトにインストールしてください。 - -### 非推奨: `build.excludeMiddleware`と`build.split` - -Astro v2.xでは、`build.excludeMiddleware`と`build.split`は、SSRモードでアダプターを使用する場合に、特定のファイルがどのように出力されるかを変更するために使用されました。 - -Astro v3.0では、これらのビルド設定オプションは、`edgeMiddleware`と`functionPerRoute`という、同様のタスクを実行するための新しい[SSRアダプター設定オプション](/ja/guides/integrations-guide/#公式インテグレーション)に置き換えられます。 - -#### どうすればいいですか? - -Astroの設定ファイルを更新して、**アダプターの設定**で新しいオプションを直接使用するようにします。 - -```js title="astro.config.mjs" del={5-7} ins={9} -import { defineConfig } from "astro/config"; -import vercel from "@astrojs/vercel/serverless"; - -export default defineConfig({ - build: { - excludeMiddleware: true - }, - adapter: vercel({ - edgeMiddleware: true - }), -}); -``` - -```js title="astro.config.mjs" del={5-7} ins={9} -import { defineConfig } from "astro/config"; -import netlify from "@astrojs/netlify/functions"; - -export default defineConfig({ - build: { - split: true - }, - adapter: netlify({ - functionPerRoute: true - }), -}); -``` - -### 非推奨: `markdown.drafts` - -Astro v2.xでは、`markdown.drafts`の設定を使用すると、開発サーバーでは閲覧可能ですが、本番環境ではビルドされないドラフトページを作成できました。 - -Astro v3.0では、この機能は非推奨となり、代わりにコンテンツコレクションにより手動でドラフトページをフィルタリングする方法が採用されました。これにより、より細かな制御が可能となりました。 - -#### どうすればいいですか? - -プロジェクト内の一部のページをドラフトとして扱い続けるには、[コンテンツコレクションに移行](/ja/guides/content-collections/#ファイルベースのルーティングからの移行)し、フロントマターで`draft: true`を使用して[ページを手動でフィルタリング](/ja/guides/content-collections/#コレクションクエリのフィルタリング)します。 - -### 非推奨: エンドポイントでのプレーンオブジェクトの返却 - -Astro v2.xでは、エンドポイントはプレーンオブジェクトを返すことができ、これはJSONレスポンスに変換されました。 - -Astro v3.0では、`Response`オブジェクトを直接返すことが推奨され、この動作は非推奨となりました。 - -#### どうすればいいですか? - -エンドポイントを更新して、`Response`オブジェクトを直接返すようにします。 - -```ts title="endpoint.json.ts" del={2} ins={3} -export async function GET() { - return { body: { "title": "Bobのブログ" }}; - return new Response(JSON.stringify({ "title": "Bobのブログ" })); -} -``` - -以前のフォーマットを維持する必要がある場合は、`ResponseWithEncoding`オブジェクトを使用できますが、将来的には非推奨となります。 - -```ts title="endpoint.json.ts" del={2} ins={3} -export async function GET() { - return { body: { "title": "Bob's blog" } }; - return new ResponseWithEncoding({ body: { "title": "Bob's blog" }}); -} -``` - -### デフォルトの変更: tsconfig.jsonプリセットの`verbatimModuleSyntax` - -Astro v2.xでは、[`verbatimModuleSyntax`](https://www.typescriptlang.org/tsconfig#verbatimModuleSyntax)の設定はデフォルトでオフになっており、これに相当するTypeScript 4.xの`importsNotUsedAsValues`が`strict`プリセットで有効になっていました。 - -Astro v3.0では、`verbatimModuleSyntax`はすべてのプリセットで有効になっています。 - -#### どうすればいいですか? - -このオプションでは、`import type`構文を使用して型をインポートする必要があります。 - -```astro title="src/components/MyAstroComponent.astro" "type" ---- -import { type CollectionEntry, getEntry } from "astro:content"; ---- -``` - -上記のように`type`を使用して型をインポートすることを推奨しますが、問題が発生する場合は、`tsconfig.json`ファイルで`verbatimModuleSyntax: false`を設定して無効にすることもできます。 - -```json title="tsconfig.json" "false" -{ - "compilerOptions": { - "verbatimModuleSyntax": false - } -} -``` - -### デフォルトの変更: `3000`番ポート - -Astro v2.xでは、Astroはデフォルトで`3000`番ポートで実行されていました。 - -{/* cli-referenceを更新したらリンク先を#--port-numberにする */} - -Astro v3.0では、[デフォルトのポート](/ja/reference/cli-reference/)が`4321`に変更されました。🚀 - -#### どうすればいいですか? - -テストや`README`などで`localhost:3000`を参照している場合は、新しいポート`localhost:4321`を反映するように更新します。 - - -### デフォルトの変更: import.meta.env.BASE_URLの`trailingSlash` - -Astro v2.xでは、`import.meta.env.BASE_URL`はデフォルトで[`base`](/ja/reference/configuration-reference/#base)の設定値の[末尾にスラッシュ](/ja/reference/configuration-reference/#trailingslash)を追加していました。`trailingSlash: "ignore"`も末尾にスラッシュを追加していました。 - -Astro v3.0では、`import.meta.env.BASE_URL`に末尾のスラッシュを追加しなくなりました。`trailingSlash: "ignore"`が設定されている場合も同様です。(`base`と`trailingSlash: "always"`または`trailingSlash: "never"`を組み合わせた場合の既存動作は変更されていません。) - -#### どうすればいいですか? - -`base`にすでに末尾のスラッシュがある場合は、変更は必要ありません。 - -`base`に末尾のスラッシュがなく、以前のデフォルト(または`trailingSlash: "ignore"`)の動作を維持したい場合は、末尾にスラッシュを追加します。 - -```js title="astro.config.mjs" del={4} ins={5} -import { defineConfig } from "astro/config"; - -export default defineConfig({ - base: 'my-base', - base: 'my-base/', -}); -``` - -### デフォルトの変更: `compressHTML` - -{/* configuration-referenceを更新したらリンク先を#compresshtmlにする */} - -Astro v2.xでは、[`compressHTML`](/ja/reference/configuration-reference/)が明示的に`true`に設定されている場合にのみ、Astroは出力されたHTMLを圧縮しました。デフォルト値は`false`でした。 - -Astro v3.0では、出力されたHTMLをデフォルトで圧縮します。 - -#### どうすればいいですか? - -`compressHTML: true`を設定している場合は、これが新しいデフォルトの動作となったため、削除できます。 - -```js title="astro.config.mjs" del={4} -import { defineConfig } from "astro/config"; - -export default defineConfig({ - compressHTML: true -}) -``` - -HTMLの圧縮を無効にするには、`compressHTML: false`を設定する必要があります。 - -### デフォルトの変更: `scopedStyleStrategy` - -{/* configuration-referenceを更新したらリンク先を#scopedstylestrategyにする */} - -Astro v2.xでは、[`scopedStyleStrategy`](/ja/reference/configuration-reference/)のデフォルト値は`"where"`でした。 - -Astro v3.0では、新しいデフォルト値`"attribute"`が導入されました。デフォルトでは、スタイルは`data-*`属性を使用して適用されます。 - -#### どうすればいいですか? - -プロジェクトで現在の[スタイルのスコープ](/ja/guides/styling/#スコープされたスタイル)を維持するには、設定ファイルを以前のデフォルト値に更新します。 - - -```js title="astro.config.mjs" ins={4} -import { defineConfig } from "astro/config"; - -export default defineConfig({ - scopedStyleStrategy: "where" -}) -``` - -### デフォルトの変更: `inlineStyleSheets` - -{/* configuration-referenceを更新したらリンク先を#buildinlinestylesheetsにする */} - -Astro v2.xでは、プロジェクトのすべてのスタイルシートはデフォルトでリンクタグとして送信されていました。[`build.inlineStylesheets`](/ja/reference/configuration-reference/)の設定を使用して、`"always"`で常に`<style>`タグにインライン化するか、あるいは`"auto"`で一定サイズ以下のスタイルシートのみをインライン化するかを選択できましたが、デフォルトの設定は`"never"`でした。 - -Astro v3.0では、`inlineStylesheets`のデフォルト値が`"auto"`に変更されました。`ViteConfig.build.assetsInlineLimit`(デフォルトは4kb)より小さいスタイルシートはデフォルトでインライン化されます。その他の場合は、プロジェクトのスタイルは外部スタイルシートとして送信されます。 - -#### どうすればいいですか? - -プロジェクトの現在の動作を維持する場合は、`build.inlineStylesheets`を以前のデフォルト値`"never"`に設定します。 - - -```js title="astro.config.mjs" ins={4-6} -import { defineConfig } from "astro/config"; - -export default defineConfig({ - build: { - inlineStylesheets: "never" - } -}) -``` - -### デフォルトの変更: 画像サービス - -Astro v2.xでは、Squooshが[デフォルトの画像処理サービス](/ja/guides/images/#デフォルトの画像サービス)でした。 - -Astro v3.0では、デフォルトの画像処理サービスとしてSharpが含まれており、またSquooshを使用するための設定オプションが提供されています。 - -#### どうすればいいですか? - -:::note -`pnpm`のような[厳格なパッケージマネージャー](https://pnpm.io/pnpm-vs-npm#npms-flat-tree)を使用している場合は、Astroの依存関係であるにもかかわらず、プロジェクトにSharpを手動でインストールする必要があるかもしれません。 - -```bash -pnpm add sharp -``` -::: - -画像の変換に引き続きSquooshを使用する場合は、次のように設定を更新します。 - -```ts title="astro.config.mjs" ins={4-6} -import { defineConfig, squooshImageService } from "astro/config"; - -export default defineConfig({ - image: { - service: squooshImageService(), - } -}) -``` - -### 変更: HTTPリクエストメソッドの大文字小文字 - -Astro v2.xでは、[HTTPリクエストメソッド](/ja/guides/endpoints/#httpメソッド)は、`get`、`post`、`put`、`all`、`del`のように小文字の関数名で書かれていました。 - -Astro v3.0では、大文字の関数名を使用します。`del`は`DELETE`となります。 - -#### どうすればいいですか? - -すべての関数を大文字に変更します。 - -- `get`は`GET` -- `post`は`POST` -- `put`は`PUT` -- `all`は`ALL` -- `del`は`DELETE` - -```js title="endpoint.ts" del={1} ins={2} -export function get() { -export function GET() { - return new Response(JSON.stringify({ "title": "Bobのブログ" })); -} -``` - -### 変更: 複数のJSXフレームワークの設定 - -Astro v2.xでは、同じプロジェクトで[複数のJSXフレームワークのインテグレーション](/ja/guides/integrations-guide/#公式インテグレーション)(React、Solid、Preact)を使用することができましたが、どのファイルがどのフレームワークのものであるかを指定する必要はありませんでした。 - -Astro v3.0では、複数のJSXフレームワークのインテグレーションがインストールされている場合、どのファイルにどのフレームワークを使用するかを指定するための、`include`と`exclude`という新しいインテグレーション設定オプションを使用する必要があります。これにより、Astroは単一フレームワークの使用や、React Fast Refreshなどの高度な機能を上手くサポートできるようになりました。 - -#### どうすればいいですか? - -同じプロジェクトで複数のJSXフレームワークを使用している場合は、`include`(また必要があれば`exclude`)をファイルとフォルダの配列に設定します。ワイルドカードを使用して複数のファイルパスを含めることができます。 - -`/components/react/`や`/components/solid/`のように、共通のフレームワークコンポーネントを同じフォルダに配置することをおすすめしますが、これは必須ではありません。 - -```js ins={13,16,19} -import { defineConfig } from 'astro/config'; -import preact from '@astrojs/preact'; -import react from '@astrojs/react'; -import svelte from '@astrojs/svelte'; -import vue from '@astrojs/vue'; -import solid from '@astrojs/solid-js'; - -export default defineConfig({ - // 複数のフレームワークを有効にして、さまざまな種類のコンポーネントをサポートします。 - // 単一のフレームワークのみを使用している場合、`include`は必要ありません! - integrations: [ - preact({ - include: ['**/preact/*'] - }), - react({ - include: ['**/react/*'] - }), - solid({ - include: ['**/solid/*'], - }), - ] -}); -``` - -### 変更: `Astro.cookies.get(key)`が`undefined`を返すようになりました - -Astro v2.xでは、[`Astro.cookies.get(key)`](/ja/reference/api-reference/#cookies)は、クッキーが存在しなくても常に[`AstroCookie`オブジェクト](/ja/reference/api-reference/#astrocookie-type)を返していました。存在を確認するには、`Astro.cookies.has(key)`を使用する必要がありました。 - -Astro v3.0では、クッキーが存在しない場合、`Astro.cookies.get(key)`は`undefined`を返します。 - -#### どうすればいいですか? - -`Astro.cookies.get(key)`を使用する前に`Astro.cookie`オブジェクトの存在を確認しているコードは、この変更によって壊れることはありませんが、存在確認はもう必要ありません。 - -`has()`を使用して`Astro.cookies`の値が`undefined`かどうかを確認しているコードは、安全に削除できます。 - -```js del={1-3} ins={5-7} -if (Astro.cookies.has(id)) { - const id = Astro.cookies.get(id)!; -} - -const id = Astro.cookies.get(id); -if (id) { -} -``` - -### 変更: Astro CLIのプログラムでの実行 - -Astro v2.xでは、`"astro"`パッケージエントリポイントは、Astro CLIを直接エクスポートして実行していました。この方法でAstroを実行することはおすすめしません。 - -Astro v3.0では、CLIをエントリポイントから削除し、`dev()`、`build()`、`preview()`、`sync()`などの新しい実験的なJavaScript APIをエクスポートします。 - -#### どうすればいいですか? - -{/* cli-referenceを更新したらリンク先を#advanced-apis-experimentalにする */} - -Astro CLIを[プログラムで実行する](/ja/reference/programmatic-reference/)には、新しい実験的なJavaScript APIを使用します。 - -```js -import { dev, build } from "astro"; - -// Astroの開発サーバーを起動する -const devServer = await dev(); -await devServer.stop(); - -// Astroプロジェクトをビルドする -await build(); -``` - - -### 変更: Astroの内部APIエントリポイントのエクスポートパス - -Astro v2.xでは、`astro/internal/*`と`astro/runtime/server/*`からAstroの内部APIをインポートすることができました。 - -Astro v3.0では、既存の`astro/runtime/*`エントリポイントを優先して、2つのエントリポイントを削除しました。さらに、コンパイラ固有のランタイムコードには、新しい`astro/compiler-runtime`エクスポートが追加されました。 - -#### どうすればいいですか? - -これらはAstroの内部APIのエントリポイントであり、プロジェクトに影響を与えることはありません。ただし、これらのエントリポイントを使用している場合は、以下のように更新します。 - -```js del={1,4,10} ins={2,5,11} -import 'astro/internal/index.js'; -import 'astro/runtime/server/index.js'; - -import 'astro/server/index.js'; -import 'astro/runtime/server/index.js'; -``` - -```js ins={5} del={4} -import { transform } from '@astrojs/compiler'; - -const result = await transform(source, { - internalURL: 'astro/runtime/server/index.js', - internalURL: 'astro/compiler-runtime', - // ... -}); -``` - -## コミュニティリソース - -Astro v3.0に関する良い資料をご存知ですか?[このページを編集](https://github.com/withastro/docs/edit/main/src/content/docs/en/guides/upgrade-to/v3.mdx)し、以下にリンクを追加してください! - -## 既知の問題 - -現在、既知の問題はありません。 diff --git a/src/content/docs/ja/guides/upgrade-to/v4.mdx b/src/content/docs/ja/guides/upgrade-to/v4.mdx deleted file mode 100644 index 730a737a25970..0000000000000 --- a/src/content/docs/ja/guides/upgrade-to/v4.mdx +++ /dev/null @@ -1,389 +0,0 @@ ---- -title: Astro v4へのアップグレード -description: プロジェクトを最新版のAstro(v4.0)にアップグレードする方法。 -i18nReady: true ---- -import PackageManagerTabs from '~/components/tabs/PackageManagerTabs.astro' - -このガイドでは、Astro v3からAstro v4への移行方法について説明します。 - -古いプロジェクトをv3にアップグレードする必要がありますか?[以前の移行ガイド](/ja/guides/upgrade-to/v3/)を参照してください。 - -v3のドキュメントが必要ですか?[ドキュメントサイトの以前のバージョン(メンテナンスされていないv3.6のスナップショット)](https://docs-git-v3-docs-unmaintained-astrodotbuild.vercel.app/)をご覧ください。 - -## Astroをアップグレードする - -パッケージマネージャーを使用して、プロジェクトのAstroとすべての公式インテグレーションを最新バージョンに更新します。 - -<PackageManagerTabs> - <Fragment slot="npm"> - ```shell - # Astroと公式インテグレーションを一緒にアップグレードする - npx @astrojs/upgrade - ``` - </Fragment> - <Fragment slot="pnpm"> - ```shell - # Astroと公式インテグレーションを一緒にアップグレードする - pnpm dlx @astrojs/upgrade - ``` - </Fragment> - <Fragment slot="yarn"> - ```shell - # Astroと公式インテグレーションを一緒にアップグレードする - yarn dlx @astrojs/upgrade - ``` - </Fragment> -</PackageManagerTabs> - - -必要であれば、[Astroインテグレーションの手動アップグレード](/ja/guides/integrations-guide/#手動アップグレード)も可能です。プロジェクトの他の依存関係もアップグレードする必要があるかもしれません。 - - -:::note[他に必要なことはありますか?] -Astroを最新版にアップグレードしたあと、プロジェクトへの変更が必要とは限りません! - -しかし、エラーや予想外の動作が発生した場合は、変更された内容と、プロジェクトを更新する必要があるかどうかを以下で確認してください。 -::: - -Astro v4.0は、[破壊的な可能性のある変更](#破壊的変更)や、[以前に非推奨となっていた機能の削除](#以前に非推奨となっていた機能の削除)を含んでいます。 - -v4.0にアップグレードしたあとプロジェクトが期待どおりに動作しない場合は、このガイドを確認して、すべての破壊的な変更の概要と、コードベースを更新する方法についての手順を確認してください。 - -完全なリリースノートについては、[チェンジログ](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md)を確認してください。 - -## Astro v4.0の実験的なフラグの削除 - -`astro.config.mjs`において、実験的な`devOverlay`フラグを削除し、`i18n`の設定をトップレベルに移動してください。 - -```js del={5-9} ins={11-14} title="astro.config.mjs" -import { defineConfig } from 'astro/config'; - -export default defineConfig({ - experimental: { - devOverlay: true, - i18n: { - defaultLocale: "en", - locales: ["en", "fr", "pt-br", "es"], - } - }, - i18n: { - defaultLocale: "en", - locales: ["en", "fr", "pt-br", "es"], - }, -}) -``` - -これらの設定、`i18n`とリネームされた`devToolbar`は、Astro v4.0で利用可能になりました。 - -[v4.0のブログ記事](https://astro.build/blog/astro-4/)で、これら2つのエキサイティングな機能の詳細などについて確認してください! - -## アップグレード - -Astroの依存関係のメジャーアップグレードは、プロジェクトに破壊的な変更をもたらす可能性があります。 - -### アップグレード: Vite 5.0 - -Astro v3.0では、開発サーバーと本番用バンドラーとしてVite 4が使用されていました。 - -Astro v4.0は、Vite 4をVite 5にアップグレードします。 - -#### どうすればいいですか? - -Vite固有のプラグインや設定、APIを使用している場合は、[Viteの移行ガイド](https://ja.vite.dev/guide/migration.html)にアクセスして、破壊的な変更を確認し、必要に応じてプロジェクトをアップグレードしてください。Astro自体に対する破壊的な変更はありません。 - -### アップグレード: unified、remarkとrehypeの依存関係 - -Astro v3.xでは、MarkdownとMDXを処理するために、unified v10およびそれと関連した互換性のあるremark/rehypeパッケージが使用されていました。 - -Astro v4.0は、[unifiedをv11](https://github.com/unifiedjs/unified/releases/tag/11.0.0)にアップグレードし、その他のremark/rehypeパッケージを最新バージョンにアップグレードします。 - -#### どうすればいいですか? - -カスタムのremark/rehypeパッケージを使用している場合は、それらがunified v11をサポートするように、パッケージマネージャーを使用してすべてのパッケージを最新バージョンに更新してください。使用しているパッケージは`astro.config.mjs`で確認できます。 - -アクティブに更新されているパッケージを使用している場合、大きな破壊的な変更はないはずですが、一部のパッケージはまだunified v11と互換性がないかもしれません。デプロイする前にMarkdown/MDXページを目視して、サイトが意図したとおりに機能しているかどうか確認してください。 - -## 破壊的変更 - -以下の変更は、Astroにおける破壊的な変更と見なされます。破壊的な変更には、一時的な後方互換性がある場合とない場合とがありますが、すべてのドキュメントは、現在サポートされているコードのみを示すように更新されています。 - -v3.xプロジェクトのドキュメントを参照する必要がある場合は、[v4.0がリリースされる前の(メンテナンスされていない)ドキュメントのスナップショット](https://docs-git-v3-docs-unmaintained-astrodotbuild.vercel.app/)を参照してください。 - -### リネーム: `entrypoint` (インテグレーションAPI) - -Astro v3.xでは、ルートのエントリーポイントを指定するインテグレーションAPI`injectRoute`のプロパティは`entryPoint`という名前でした。 - -Astro v4.0は、他のAstro APIとの整合性を保つために、このプロパティを`entrypoint`にリネームします。`entryPoint`プロパティは非推奨ですが、引き続き動作し、使用している場合はコードを更新するように促す警告がログに出力されます。 - -#### どうすればいいですか? - -`injectRoute` APIを使用するインテグレーションがある場合は、`entryPoint`プロパティを`entrypoint`にリネームしてください。あなたがAstro 3と4の両方をサポートしたいライブラリの作者である場合は、`entryPoint`と`entrypoint`の両方を指定できます。この場合、警告はログ出力されません。 - -```js ins={4} del={3} -injectRoute({ - pattern: '/fancy-dashboard', - entryPoint: '@fancy/dashboard/dashboard.astro' - entrypoint: '@fancy/dashboard/dashboard.astro' -}); -``` - -### 変更: インテグレーションAPIの`app.render`のシグネチャ - -Astro v3.0では、`app.render()`メソッドは、`routeData`と`locals`を別々のオプション引数として受け取っていました。 - -Astro v4.0は、`app.render()`のシグネチャを変更します。これら2つのプロパティは、単一のオブジェクトにまとめられるようになりました。このオブジェクトと2つのプロパティは、いずれも必須ではありません。 - -#### どうすればいいですか? - -アダプタをメンテナンスしている場合、現在のシグネチャは次のメジャーバージョンまで引き続き動作します。新しいシグネチャに移行するには、複数の独立した引数としてではなく、`routeData`と`locals`をオブジェクトのプロパティとして渡します。 - -```diff lang="js" -- app.render(request, routeData, locals) -+ app.render(request, { routeData, locals }) -``` -### 変更: アダプターはサポートする機能を指定する必要があります - -Astro v3.xでは、アダプターはサポートする機能を指定する必要はありませんでした。 - -Astro v4.0では、アダプターはサポートする機能のリストを指定するために、`supportedAstroFeatures{}`プロパティを渡す必要があります。このプロパティは任意ではなくなりました。 - -#### どうすればいいですか? - -アダプターの作者は、サポートする機能のリストを指定するために、`supportedAstroFeatures{}`オプションを渡す必要があります。 - -```js title="my-adapter.mjs" ins={9-11} -export default function createIntegration() { - return { - name: '@matthewp/my-adapter', - hooks: { - 'astro:config:done': ({ setAdapter }) => { - setAdapter({ - name: '@matthewp/my-adapter', - serverEntrypoint: '@matthewp/my-adapter/server.js', - supportedAstroFeatures: { - staticOutput: 'stable' - } - }); - }, - }, - }; -} -``` - -### 削除: Shiki言語の`path`プロパティ - -Astro v3.xでは、`markdown.shikiConfig.langs`に渡されるShiki言語は、自動的にShikiji互換の言語に変換されました。Shikijiは、Astroが構文のハイライトに使用している内部ツールです。 - -Astro v4.0は、設定をわかりづらくさせていたShiki言語の`path`プロパティのサポートを削除します。これは、`langs`に直接渡すことができるインポートに置き換えられます。 - -#### どうすればいいですか? - -言語のJSONファイルをインポートし、オプションに渡します。 - -```diff lang="js" -// astro.config.js -+ import customLang from './custom.tmLanguage.json' - -export default defineConfig({ - markdown: { - shikiConfig: { - langs: [ -- { path: '../../custom.tmLanguage.json' }, -+ customLang, - ], - }, - }, -}) -``` - -## 非推奨 - -以下の非推奨機能へのサポートは終了し、以後はドキュメントの追加もおこなわれません。プロジェクトを適切に更新してください。 - -一部の非推奨機能は、完全に削除されるまで一時的に機能し続ける場合があります。その他の機能は、単に無効になるか、あるいはコードを更新するように促すエラーが発生します。 - -### 非推奨: ビュートランジションの`submit`イベントの`handleForms` - -Astro v3.xでは、`<ViewTransitions />`コンポーネントを使用するプロジェクトは、`form`要素の`submit`イベントに対する処理を有効にする必要がありました。このためには`handleForms`プロパティを渡す必要がありました。 - -Astro v4.0では、`<ViewTransitions />`を使用すると、`form`要素の`submit`イベントをデフォルトで処理します。`handleForms`プロパティは非推奨となり、何の効果もなくなりました。 - -#### どうすればいいですか? - -`ViewTransitions`コンポーネントから`handleForms`プロパティを削除します。これはもう必要ありません。 - -```astro title="src/pages/index.astro" del="handleForms" ---- -import { ViewTransitions } from "astro:transitions"; ---- -<html> - <head> - <ViewTransitions handleForms /> - </head> - <body> - <!-- 色々 --> - </body> -</html> -``` - -`submit`イベントの処理を無効にしたい場合は、該当する`form`要素に`data-astro-reload`属性を追加します。 - -```astro title="src/components/Form.astro" ins="data-astro-reload" -<form action="/contact" data-astro-reload> - <!-- --> -</form> -``` - -## 以前に非推奨となっていた機能の削除 - -以下の非推奨機能は、コードベースから完全に削除され、使用できなくなりました。これらの機能の一部は、非推奨となってからもプロジェクトで引き続き機能する可能性があります。他の機能は、単に無効になるかもしれません。 - -これらの削除された機能を使用しているプロジェクトはビルドできなくなり、機能を削除するよう促すサポートドキュメントはもうありません。 - -### 削除: エンドポイントでのプレーンオブジェクトの返却 - -Astro v3.0では、エンドポイントからプレーンオブジェクトを返すことは非推奨となりましたが、Astro v2との互換性を維持するために引き続きサポートされていました。また、移行を容易にするために`ResponseWithEncoding`ユーティリティも提供されていました。 - -Astro v4.0では、プレーンオブジェクトのサポートが削除され、エンドポイントは常に`Response`を返す必要があります。`ResponseWithEncoding`ユーティリティも適切な`Response`型に置き換えられるかたちで削除されています。 - -#### どうすればいいですか? - -`Response`オブジェクトを直接返すようにエンドポイントを更新します。 - -```diff lang="ts" - export async function GET() { -- return { body: { "title": "ボブのブログ" }}; -+ return new Response(JSON.stringify({ "title": "ボブのブログ" })); - } -``` - -`ResponseWithEncoding`の使用箇所を削除するには、`ArrayBuffer`を使用するようにコードをリファクタリングします。 - -```diff lang="ts" - export async function GET() { - const file = await fs.readFile('./bob.png'); -- return new ResponseWithEncoding(file.toString('binary'), undefined, 'binary'); -+ return new Response(file.buffer); - } -``` - -### 削除: `build.split`と`build.excludeMiddleware` - -Astro v3.0では、`build.split`と`build.excludeMiddleware`のビルド設定オプションは非推奨となり、同じタスクを実行するために[アダプターの設定オプション](/ja/reference/adapter-reference/#アダプターの機能について)に置き換えられました。 - -Astro v4.0では、これらのプロパティは完全に削除されます。 - -#### どうすればいいですか? - -非推奨の`build.split`または`build.excludeMiddleware`を使用している場合、これらはもう存在しないため、削除する必要があります。 - -アダプターの設定で[これらの非推奨のミドルウェアプロパティを更新する](/ja/guides/upgrade-to/v3/#非推奨-buildexcludemiddlewareとbuildsplit)ためのv3の移行ガイドを参照してください。 - -### 削除: `Astro.request.params` - -Astro v3.0では、`Astro.request.params` APIは非推奨となりましたが、後方互換性のために保持されていました。 - -Astro v4.0では、このオプションは完全に削除されます。 - -#### どうすればいいですか? - -すべての出現箇所を、サポートされている置き換え先である[`Astro.params`](/ja/reference/api-reference/#params)に更新します。 - -```astro del={1} ins={2} -const { id } = Astro.request.params; -const { id } = Astro.params; -``` - -### 削除: `markdown.drafts` - -Astro v3.0では、下書きの記事のビルドを制御するために`markdown.drafts`を使用することは非推奨となりました。 - -Astro v4.0では、このオプションは完全に削除されます。 - -#### どうすればいいですか? - -非推奨の`markdown.drafts`を使用している場合、これはもう存在しないため、削除する必要があります。 - -プロジェクト内の一部のページを下書きとしてマークし続けるには、[コンテンツコレクションに移行](/ja/guides/content-collections/#ファイルベースのルーティングからの移行)し、代わりに`draft: true`フロントマタープロパティで[ページを手動でフィルタリング](/ja/guides/content-collections/#コレクションクエリのフィルタリング)します。 - -### 削除: `getHeaders()` - -Astro v3.0では、`getHeaders()` Markdownのエクスポートは非推奨となり、`getHeadings()`に置き換えられました。 - -Astro v4.0では、このオプションは完全に削除されます。 - -#### どうすればいいですか? - -非推奨の`getHeaders()`を使用している場合、これはもう存在しないため、削除する必要があります。サポートされている置き換え先である`getHeadings()`に置き換えてください。 - -```js del={2} ins={3} -const posts = await Astro.glob('../content/blog/*.mdx'); -const firstPostHeadings = posts.at(0).getHeaders(); -const firstPostHeadings = posts.at(0).getHeadings(); -``` - - -### 削除: `getStaticPaths()`における`rss`の使用 - -Astro v3.0では、`getStaticPaths()`で非推奨の`rss`ヘルパーを使用するとエラーが発生しました。 - -Astro v4.0では、このヘルパーは完全に削除されます。 - -#### どうすればいいですか? - -RSSフィードを生成するためにこのサポートされていないメソッドを使用している場合は、RSSのセットアップに[`@astrojs/rss`インテグレーション](/ja/recipes/rss/)を使用する必要があります。 - -### 削除: 小文字のHTTPメソッド名 - -Astro v3.0では、小文字のHTTPリクエストメソッド名(`get`、`post`、`put`、`all`、`del`)を使用することは非推奨となりました。 - -Astro v4.0では、小文字の名前へのサポートは完全に削除されます。すべてのHTTPリクエストメソッドは、大文字を使用して記述する必要があります。 - -#### どうすればいいですか? - -非推奨の小文字の名前を使用している場合、これらを対応する大文字の名前に置き換える必要があります。 - -[大文字のHTTPリクエストメソッドを使用する方法](/ja/guides/upgrade-to/v3/#変更-httpリクエストメソッドの大文字小文字)については、v3の移行ガイドを参照してください。 - -### 削除: `base`プレフィックスがない場合の301リダイレクト - -Astro v3.xでは、ベースパスがなしでパブリックディレクトリのアセットにアクセスすると、Astroのプレビューサーバーは301リダイレクトを返しました。 - -Astro v4.0では、プレビューサーバーが実行されている場合、開発サーバーと同じ動作になるように、ベースパスのプレフィックスがない場合にはパブリックディレクトリのアセットに対して404ステータスが返されます。 - -#### どうすればいいですか? - -Astroのプレビューサーバーを使用する場合、パブリックディレクトリからのすべての静的アセットのインポートとURLには、[baseの値](/ja/reference/configuration-reference/#base)がパスの先頭に付けられている必要があります。 - -以下の例は、`base: '/docs'`が設定されている場合に、パブリックフォルダから画像を表示するために必要な`src`属性を示しています。 - -```astro title="src/pages/index.astro" ins="/docs" -// public/images/my-image.pngにアクセスする: - -<img src="/docs/images/my-image.png" alt=""> -``` - -### 削除: `astro/client-image`の自動変換 - -Astro v3.xでは、非推奨の画像インテグレーションで使用されていた`astro/client-image`型が削除されましたが、`env.d.ts`ファイルでこれが見つかった場合は、デフォルトのAstro型`astro/client`に自動変換されました。 - -Astro v4.0では、`astro/client-image`は無視され、`env.d.ts`は自動的には更新されなくなります。 - -#### どうすればいいですか? - -`src/env.d.ts`で`@astrojs/image`の型を設定していて、v3.0にアップグレードしても型が自動的に変換されなかった場合は、`astro/client-image`型を`astro/client`に手動で置き換えてください。 - -```ts title="src/env.d.ts" del={1} ins={2} - /// <reference types="astro/client-image" /> - /// <reference types="astro/client" /> -``` - - -## コミュニティリソース - -Astro v4.0に関する良い資料をご存知ですか?[このページを編集](https://github.com/withastro/docs/edit/main/src/content/docs/en/guides/upgrade-to/v4.mdx)し、以下にリンクを追加してください! - -## 既知の問題 - -[GitHub上のAstroのissues](https://github.com/withastro/astro/issues/)で報告済みの問題を確認するか、問題を報告してください。 diff --git a/src/content/docs/ja/guides/view-transitions.mdx b/src/content/docs/ja/guides/view-transitions.mdx deleted file mode 100644 index ad5b0ccfc768d..0000000000000 --- a/src/content/docs/ja/guides/view-transitions.mdx +++ /dev/null @@ -1,749 +0,0 @@ ---- -title: ビュートランジション -description: >- - ビュートランジションを使用して、Astroでページ間のシームレスなナビゲーションを実現する。 -i18nReady: true ---- -import Since from '~/components/Since.astro' -import { Steps } from '@astrojs/starlight/components' - -Astroでは、**オプトイン式ページ単位のビュートランジション**を数行のコードで実現できます。ビュートランジションは、ブラウザがナビゲーション時に通常おこなうページ全体の更新なしでページコンテンツを更新し、ページ間のシームレスなアニメーションを提供します。 - -Astroは、単一のページの`<head>`に追加可能な`<ClientRouter />`ルーティングコンポーネントを提供しており、これにより別ページへの遷移を制御できます。このコンポーネントは軽量なクライアントサイドルーターを提供し、[ナビゲーションをインターセプト](#クライアントサイドナビゲーションの流れ)してページ間の遷移をカスタマイズできるようにします。 - -このコンポーネントを共通のヘッドやレイアウトなど再利用可能な`.astro`コンポーネントに追加すると、サイト全体でのアニメーション付きのページ遷移(SPAモード)が可能になります。 - -Astroのビュートランジションは新しい[View Transitions](https://developer.chrome.com/docs/web-platform/view-transitions/)ブラウザAPIによって提供されており、また以下の機能も含みます。 - -- `fade`や`slide`、`none`など、いくつかの[組み込みのアニメーションオプション](#組み込みのアニメーションディレクティブ)。 -- 戻る・進むの両ナビゲーションでのアニメーションのサポート。 -- [トランジションアニメーションのすべての要素を完全にカスタマイズ](#アニメーションをカスタマイズする)し、さらに独自のアニメーションを作成する機能。 -- [非ページへのリンクに対しクライアントサイドナビゲーションを防止する](#クライアントサイドナビゲーションの防止)オプション。 -- まだView Transition APIをサポートしていないブラウザのための[フォールバック用動作の制御](#フォールバックの制御)。 -- [`prefers-reduced-motion`](#prefers-reduced-motion)の自動サポート。 - -:::note -デフォルトでは、すべてのページは通常のフルページのブラウザナビゲーションを使用します。ビュートランジションを有効化すると、ページ単位またはサイト全体で使用できます。 -::: - -## ページにビュートランジションを追加する - -`<ClientRouter />`ルーティングコンポーネントをインポートし、`<head>`内に追加することで、ビュートランジションを個別のページで有効化できます。 - -```astro title="src/pages/index.astro" ins={2,7} ---- -import { ClientRouter } from 'astro:transitions'; ---- -<html lang="ja"> - <head> - <title>私のホームページ - - - -

私のウェブサイトへようこそ!

- - -``` - -## サイト全体でのビュートランジション(SPAモード) - -``をインポートし、共通の``または共有のレイアウトコンポーネントに追加します。Astroは、旧ページと新ページの類似点に基づいてデフォルトのページアニメーションを作成し、サポートされていないブラウザに対するフォールバック動作も提供します。 - -以下の例では、このコンポーネントをインポートし`` Astroコンポーネントに追加することで、Astroのデフォルトのページナビゲーションアニメーションをサイト全体に追加しています。これにより、サポートされていないブラウザに対するフォールバック動作も追加されます。 - -```astro title="components/CommonHead.astro" ins={2,12} ---- -import { ClientRouter } from 'astro:transitions'; ---- - - - - -{title} - - - - -``` - -Astroのデフォルトのクライアントサイドナビゲーションを有効にするために、他に必要な設定はありません! - -より細かな制御のためには、[トランジションディレクティブ](#トランジションディレクティブ)を使用するか、個々の要素で[デフォルトのクライアントサイドナビゲーションをオーバーライド](#クライアントサイドナビゲーションの防止)します。 - -## トランジションディレクティブ - -Astroは、旧ページと新ページの両方に存在する対応する要素に、共通かつ一意の`view-transition-name`を自動的に割り当てます。マッチする要素のペアは、要素の種類とDOM内の位置の両方によって推測されます。 - -`.astro`コンポーネント内のページ要素にオプションの`transition:*`ディレクティブを使用すると、ナビゲーション中のページ遷移の動作をより細かく制御できます。 - -- `transition:name`: 新旧コンテンツのアニメーションに関するAstroデフォルトの要素のマッチング方式をオーバーライドし、DOM要素のペアを関連付ける[トランジション名を指定](#トランジションに名前を付ける)できます。 -- `transition:animate`: アニメーションの種類を指定することで、旧要素を新要素で置き換える際のAstroのデフォルトのアニメーションをオーバーライドできます。Astroの[組み込みのアニメーションディレクティブ](#組み込みのアニメーションディレクティブ)を使用するか、[独自のトランジションアニメーションを作成](#アニメーションをカスタマイズする)します。 -- `transition:persist`: 旧要素を新要素で置き換えるAstroのデフォルトの挙動をオーバーライドし、[別のページに移動した際にコンポーネントとHTML要素を保持](#状態を保持する)します。 - -### トランジションに名前を付ける - -場合によっては、対応するビュートランジション要素を自分で特定したい、または特定する必要があるかもしれません。`transition:name`ディレクティブを使用して、要素のペアに名前を付けることができます。 - -```astro title="old-page.astro" -