From 58ea19390eca8ea64d7d1dd8520451e7c75c8e85 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Fri, 13 Dec 2024 03:06:57 +0000
Subject: [PATCH] sync docs@c824a7a
---
.github/ISSUE_TEMPLATE/bug_report.md | 18 +-
.github/ISSUE_TEMPLATE/issue_template.md | 1 -
.../01-getting-started/01-installation.mdx | 147 ++--
.../02-project-structure.mdx | 296 ++++----
.../03-layouts-and-pages.mdx | 305 ++++++++
.../04-images-and-fonts.mdx | 433 ++++++++++++
.../01-getting-started/05-css-and-styling.mdx | 640 +++++++++++++++++
.../06-data-fetching-and-streaming.mdx | 413 +++++++++++
docs/01-app/01-getting-started/index.mdx | 9 +-
.../01-routing/04-linking-and-navigating.mdx | 128 ++--
.../01-routing/05-error-handling.mdx | 108 ++-
.../01-routing/07-redirecting.mdx | 258 +++----
.../01-routing/15-internationalization.mdx | 62 +-
.../02-data-fetching/01-fetching.mdx | 242 ++++---
.../03-server-actions-and-mutations.mdx | 330 +++++----
.../04-incremental-static-regeneration.mdx | 244 +++----
.../03-rendering/01-server-components.mdx | 114 +--
.../03-rendering/03-composition-patterns.mdx | 210 +++---
.../04-caching/index.mdx | 393 +++++------
.../05-styling/01-css.mdx | 110 +--
.../06-optimizing/02-videos.mdx | 191 +++--
.../07-configuring/05-mdx.mdx | 240 ++++---
.../07-configuring/10-custom-server.mdx | 65 +-
.../07-configuring/16-debugging.mdx | 102 +--
.../16-progressive-web-apps.mdx | 237 ++++---
.../09-authentication/index.mdx | 667 +++++++++---------
.../10-deploying/index.mdx | 250 ++++---
.../11-upgrading/01-codemods.mdx | 133 ++--
.../11-upgrading/02-canary.mdx | 38 +
.../11-upgrading/03-version-14.mdx | 36 -
.../{02-version-15.mdx => 03-version-15.mdx} | 210 +++---
.../11-upgrading/04-version-14.mdx | 36 +
...ration.mdx => 05-app-router-migration.mdx} | 0
...t-app.mdx => 06-from-create-react-app.mdx} | 0
.../{06-from-vite.mdx => 07-from-vite.mdx} | 0
.../03-api-reference/02-components/image.mdx | 467 ++++++------
.../03-api-reference/02-components/link.mdx | 276 ++++----
.../01-metadata/sitemap.mdx | 72 +-
.../03-file-conventions/default.mdx | 28 +-
.../03-file-conventions/forbidden.mdx | 59 ++
.../03-file-conventions/layout.mdx | 90 +--
.../03-file-conventions/not-found.mdx | 24 +-
.../03-file-conventions/page.mdx | 48 +-
.../03-file-conventions/unauthorized.mdx | 141 ++++
.../03-api-reference/04-functions/after.mdx | 137 ++++
.../04-functions/cacheLife.mdx | 112 +--
.../04-functions/connection.mdx | 27 +-
.../03-api-reference/04-functions/cookies.mdx | 114 +--
.../04-functions/draft-mode.mdx | 50 +-
.../04-functions/expirePath.mdx | 144 ----
.../04-functions/expireTag.mdx | 102 ---
.../03-api-reference/04-functions/fetch.mdx | 45 +-
.../04-functions/forbidden.mdx | 208 ++++++
.../04-functions/generate-sitemaps.mdx | 33 +-
.../04-functions/generate-static-params.mdx | 132 ++--
.../03-api-reference/04-functions/headers.mdx | 40 +-
.../04-functions/revalidatePath.mdx | 58 +-
.../04-functions/revalidateTag.mdx | 36 +-
.../04-functions/unauthorized.mdx | 288 ++++++++
.../04-functions/unstable_after.mdx | 72 --
.../04-functions/unstable_expirePath.mdx | 145 ++++
.../04-functions/unstable_expireTag.mdx | 103 +++
.../04-functions/unstable_noStore.mdx | 19 +-
.../01-next-config-js/authInterrupts.mdx | 44 ++
.../01-next-config-js/cssChunking.mdx | 19 +-
.../05-config/01-next-config-js/inlineCss.mdx | 77 ++
.../01-next-config-js/reactCompiler.mdx | 47 +-
.../01-next-config-js/staleTimes.mdx | 34 +-
.../05-config/01-next-config-js/turbo.mdx | 74 +-
.../05-config/02-typescript.mdx | 145 ++--
.../03-api-reference/05-config/03-eslint.mdx | 290 +++++---
docs/01-app/03-api-reference/06-cli/next.mdx | 222 +++---
docs/01-app/03-api-reference/07-edge.mdx | 258 +++----
docs/01-app/03-api-reference/08-turbopack.mdx | 85 +++
docs/03-architecture/nextjs-compiler.mdx | 188 +++--
docs/03-architecture/turbopack.mdx | 81 ---
kj-diff.json | 80 ++-
next.js | 2 +-
static/img/docs/dark/app-getting-started.avif | Bin 3912 -> 4311 bytes
static/img/docs/dark/blog-nested-route.avif | Bin 0 -> 12788 bytes
.../img/docs/dark/blog-post-nested-route.avif | Bin 0 -> 18291 bytes
static/img/docs/dark/caching-overview.avif | Bin 23812 -> 24340 bytes
.../docs/dark/copy-devtool-url-example.avif | Bin 33762 -> 34548 bytes
static/img/docs/dark/data-cache.avif | Bin 16454 -> 16737 bytes
.../dark/deduplicated-fetch-requests.avif | Bin 28593 -> 32073 bytes
static/img/docs/dark/full-route-cache.avif | Bin 11412 -> 11722 bytes
static/img/docs/dark/layout-special-file.avif | Bin 5940 -> 8105 bytes
static/img/docs/dark/loading-file.avif | Bin 0 -> 10116 bytes
static/img/docs/dark/loading-overview.avif | Bin 15388 -> 14564 bytes
static/img/docs/dark/loading-ui.avif | Bin 8980 -> 8347 bytes
.../nested-error-component-hierarchy.avif | Bin 17830 -> 18270 bytes
static/img/docs/dark/nested-layouts.avif | Bin 0 -> 19996 bytes
.../img/docs/dark/on-demand-revalidation.avif | Bin 15768 -> 15852 bytes
static/img/docs/dark/page-special-file.avif | Bin 5822 -> 6788 bytes
.../project-organization-app-root-split.avif | Bin 8271 -> 9527 bytes
.../dark/project-organization-app-root.avif | Bin 6865 -> 8014 bytes
.../dark/project-organization-colocation.avif | Bin 18544 -> 20140 bytes
.../project-organization-not-routable.avif | Bin 8398 -> 8864 bytes
.../project-organization-private-folders.avif | Bin 10362 -> 11640 bytes
.../project-organization-project-root.avif | Bin 6783 -> 7908 bytes
.../project-organization-route-groups.avif | Bin 10341 -> 11357 bytes
.../project-organization-src-directory.avif | Bin 7557 -> 8137 bytes
static/img/docs/dark/public-folder.avif | Bin 0 -> 5323 bytes
static/img/docs/dark/request-memoization.avif | Bin 12559 -> 12786 bytes
.../docs/dark/shared-dashboard-layout.avif | Bin 6620 -> 7295 bytes
.../docs/dark/static-and-dynamic-routes.avif | Bin 24551 -> 25149 bytes
.../docs/dark/time-based-revalidation.avif | Bin 21752 -> 22597 bytes
.../img/docs/light/app-getting-started.avif | Bin 3452 -> 3708 bytes
static/img/docs/light/blog-nested-route.avif | Bin 0 -> 11063 bytes
.../docs/light/blog-post-nested-route.avif | Bin 0 -> 14700 bytes
static/img/docs/light/caching-overview.avif | Bin 19757 -> 20690 bytes
.../light/deduplicated-fetch-requests.avif | Bin 16624 -> 18758 bytes
static/img/docs/light/full-route-cache.avif | Bin 11347 -> 11644 bytes
.../img/docs/light/layout-special-file.avif | Bin 4662 -> 7271 bytes
static/img/docs/light/loading-file.avif | Bin 0 -> 8592 bytes
static/img/docs/light/loading-overview.avif | Bin 14630 -> 14051 bytes
static/img/docs/light/nested-layouts.avif | Bin 0 -> 16955 bytes
.../docs/light/on-demand-revalidation.avif | Bin 11853 -> 12145 bytes
static/img/docs/light/page-special-file.avif | Bin 5147 -> 6081 bytes
static/img/docs/light/partial-rendering.avif | Bin 12277 -> 13514 bytes
.../project-organization-app-root-split.avif | Bin 6179 -> 7116 bytes
.../light/project-organization-app-root.avif | Bin 5629 -> 6300 bytes
.../light/project-organization-routable.avif | Bin 7961 -> 8779 bytes
static/img/docs/light/public-folder.avif | Bin 0 -> 4402 bytes
.../img/docs/light/request-memoization.avif | Bin 11807 -> 12190 bytes
.../docs/light/shared-dashboard-layout.avif | Bin 5039 -> 5706 bytes
.../docs/light/static-and-dynamic-routes.avif | Bin 24272 -> 24442 bytes
.../docs/light/time-based-revalidation.avif | Bin 15637 -> 16513 bytes
128 files changed, 7188 insertions(+), 4194 deletions(-)
create mode 100644 docs/01-app/01-getting-started/03-layouts-and-pages.mdx
create mode 100644 docs/01-app/01-getting-started/04-images-and-fonts.mdx
create mode 100644 docs/01-app/01-getting-started/05-css-and-styling.mdx
create mode 100644 docs/01-app/01-getting-started/06-data-fetching-and-streaming.mdx
create mode 100644 docs/01-app/02-building-your-application/11-upgrading/02-canary.mdx
delete mode 100644 docs/01-app/02-building-your-application/11-upgrading/03-version-14.mdx
rename docs/01-app/02-building-your-application/11-upgrading/{02-version-15.mdx => 03-version-15.mdx} (55%)
create mode 100644 docs/01-app/02-building-your-application/11-upgrading/04-version-14.mdx
rename docs/01-app/02-building-your-application/11-upgrading/{04-app-router-migration.mdx => 05-app-router-migration.mdx} (100%)
rename docs/01-app/02-building-your-application/11-upgrading/{05-from-create-react-app.mdx => 06-from-create-react-app.mdx} (100%)
rename docs/01-app/02-building-your-application/11-upgrading/{06-from-vite.mdx => 07-from-vite.mdx} (100%)
create mode 100644 docs/01-app/03-api-reference/03-file-conventions/forbidden.mdx
create mode 100644 docs/01-app/03-api-reference/03-file-conventions/unauthorized.mdx
create mode 100644 docs/01-app/03-api-reference/04-functions/after.mdx
delete mode 100644 docs/01-app/03-api-reference/04-functions/expirePath.mdx
delete mode 100644 docs/01-app/03-api-reference/04-functions/expireTag.mdx
create mode 100644 docs/01-app/03-api-reference/04-functions/forbidden.mdx
create mode 100644 docs/01-app/03-api-reference/04-functions/unauthorized.mdx
delete mode 100644 docs/01-app/03-api-reference/04-functions/unstable_after.mdx
create mode 100644 docs/01-app/03-api-reference/04-functions/unstable_expirePath.mdx
create mode 100644 docs/01-app/03-api-reference/04-functions/unstable_expireTag.mdx
create mode 100644 docs/01-app/03-api-reference/05-config/01-next-config-js/authInterrupts.mdx
create mode 100644 docs/01-app/03-api-reference/05-config/01-next-config-js/inlineCss.mdx
create mode 100644 docs/01-app/03-api-reference/08-turbopack.mdx
delete mode 100644 docs/03-architecture/turbopack.mdx
create mode 100644 static/img/docs/dark/blog-nested-route.avif
create mode 100644 static/img/docs/dark/blog-post-nested-route.avif
create mode 100644 static/img/docs/dark/loading-file.avif
create mode 100644 static/img/docs/dark/nested-layouts.avif
create mode 100644 static/img/docs/dark/public-folder.avif
create mode 100644 static/img/docs/light/blog-nested-route.avif
create mode 100644 static/img/docs/light/blog-post-nested-route.avif
create mode 100644 static/img/docs/light/loading-file.avif
create mode 100644 static/img/docs/light/nested-layouts.avif
create mode 100644 static/img/docs/light/public-folder.avif
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index dd84ea78..b5c68e55 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -4,7 +4,6 @@ about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
-
---
**Describe the bug**
@@ -12,6 +11,7 @@ A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
+
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
@@ -24,15 +24,17 @@ A clear and concise description of what you expected to happen.
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- - OS: [e.g. iOS]
- - Browser [e.g. chrome, safari]
- - Version [e.g. 22]
+
+- OS: [e.g. iOS]
+- Browser [e.g. chrome, safari]
+- Version [e.g. 22]
**Smartphone (please complete the following information):**
- - Device: [e.g. iPhone6]
- - OS: [e.g. iOS8.1]
- - Browser [e.g. stock browser, safari]
- - Version [e.g. 22]
+
+- Device: [e.g. iPhone6]
+- OS: [e.g. iOS8.1]
+- Browser [e.g. stock browser, safari]
+- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.
diff --git a/.github/ISSUE_TEMPLATE/issue_template.md b/.github/ISSUE_TEMPLATE/issue_template.md
index 4be775cb..e04efde8 100644
--- a/.github/ISSUE_TEMPLATE/issue_template.md
+++ b/.github/ISSUE_TEMPLATE/issue_template.md
@@ -4,7 +4,6 @@ about: Standard issue template for Nextjs-docs-ja
title: ''
labels: ''
assignees: ''
-
---
#### Description
diff --git a/docs/01-app/01-getting-started/01-installation.mdx b/docs/01-app/01-getting-started/01-installation.mdx
index 0abfd7ba..21419c99 100644
--- a/docs/01-app/01-getting-started/01-installation.mdx
+++ b/docs/01-app/01-getting-started/01-installation.mdx
@@ -1,27 +1,27 @@
---
-title: 'Next.jsプロジェクトをセットアップする方法'
-sidebar_label: 'インストール'
-description: '`create-next-app`を使用して新しいNext.jsアプリケーションを作成し、TypeScript、ESLint、モジュールパスエイリアスを設定する方法を学びます。'
+title: '新しい Next.js プロジェクトをセットアップする方法'
+nav_title: 'インストール'
+description: '`create-next-app` CLIを使用して新しい Next.js アプリケーションを作成し、TypeScript、ESLint、モジュールパスエイリアスをセットアップします。'
---
-{/* このドキュメントの内容はapp routerとpages routerに共有されています。Pages Routerに特化したコンテンツを追加するために`コンテンツ`コンポーネントを使用することができます。共有されたコンテンツはコンポーネントでラップしないでください。 */}
+{/* このドキュメントの内容は app router と pages router の間で共有されています。Pages Router に特有のコンテンツを追加するには `Content` コンポーネントを使用できます。共有コンテンツはコンポーネントでラップすべきではありません。 */}
## システム要件 {#system-requirements}
-- [Node.js 18.18](https://nodejs.org/) 以上。
-- macOS、Windows(WSLを含む)、Linuxがサポートされています。
+- [Node.js 18.18](https://nodejs.org/) 以上
+- macOS、Windows(WSLを含む)、およびLinuxがサポートされています
## 自動インストール {#automatic-installation}
-私たちは、すべてを自動的に設定する[`create-next-app`](/docs/app/api-reference/cli/create-next-app)を使用して新しいNext.jsアプリを始めることをお勧めします。プロジェクトを作成するには、以下のコマンドを実行してください:
+[`create-next-app`](/docs/app/api-reference/cli/create-next-app) を使用して新しい Next.js アプリを始めることをお勧めします。これにより、すべてが自動的にセットアップされます。プロジェクトを作成するには、以下を実行します:
-```bash title="ターミナル"
+```bash title="Terminal"
npx create-next-app@latest
```
-インストール中に、次のプロンプトが表示されます:
+インストール時に、次のプロンプトが表示されます:
-```txt title="ターミナル"
+```txt title="Terminal"
What is your project named? my-app
Would you like to use TypeScript? No / Yes
Would you like to use ESLint? No / Yes
@@ -33,17 +33,17 @@ Would you like to customize the import alias (`@/*` by default)? No / Yes
What import alias would you like configured? @/*
```
-プロンプトが完了すると、[`create-next-app`](/docs/app/api-reference/cli/create-next-app)はあなたのプロジェクト名でフォルダを作成し、必要な依存関係をインストールします。
+プロンプトに答えた後、[`create-next-app`](/docs/app/api-reference/cli/create-next-app) はプロジェクト名のフォルダを作成し、必要な依存関係をインストールします。
## 手動インストール {#manual-installation}
-手動で新しいNext.jsアプリを作成するには、必要なパッケージをインストールします:
+新しい Next.js アプリを手動で作成するには、必要なパッケージをインストールします:
-```bash title="ターミナル"
+```bash title="Terminal"
npm install next@latest react@latest react-dom@latest
```
-`package.json`ファイルを開き、以下の`scripts`を追加してください:
+`package.json` ファイルを開き、次の `scripts` を追加します:
```json title="package.json"
{
@@ -56,30 +56,30 @@ npm install next@latest react@latest react-dom@latest
}
```
-これらのスクリプトは、アプリケーションの開発のさまざまな段階を参照しています:
+これらのスクリプトは、アプリケーション開発の異なる段階を指します:
-- `dev`: [`next dev`](/docs/app/api-reference/cli/next#next-dev-options)を実行して、Next.jsを開発モードで開始します
-- `build`: [`next build`](/docs/app/api-reference/cli/next#next-build-options)を実行して、アプリケーションを本番環境用にビルドします
-- `start`: [`next start`](/docs/app/api-reference/cli/next#next-start-options)を実行して、Next.jsの本番サーバーを開始します
-- `lint`: [`next lint`](/docs/app/api-reference/cli/next#next-lint-options)を実行して、Next.jsの組み込みESLint構成を設定します
+- `dev`: [`next dev`](/docs/app/api-reference/cli/next#next-dev-options) を実行して、Next.js を開発モードで開始します
+- `build`: [`next build`](/docs/app/api-reference/cli/next#next-build-options) を実行して、本番での使用のためにアプリケーションをビルドします
+- `start`: [`next start`](/docs/app/api-reference/cli/next#next-start-options) を実行して、Next.js の本番サーバーを開始します
+- `lint`: [`next lint`](/docs/app/api-reference/cli/next#next-lint-options) を実行して、Next.js の組み込みESLint設定をセットアップします
-### `app`ディレクトリを作成する {#create-the-app-directory}
+### `app` ディレクトリを作成する {#create-the-app-directory}
-Next.jsはファイルシステムルーティングを使用しており、アプリケーション内のルートはファイルの構造によって決まります。
+Next.js はファイルシステムルーティングを使用しており、アプリケーション内のルートはファイルの構造によって決まります。
-`app`フォルダを作成し、次に`layout.tsx`と`page.tsx`ファイルを追加します。これらは、ユーザーがアプリケーションのroot(`/`)にアクセスしたときに表示されます。
+`app` フォルダを作成し、次に `layout.tsx` と `page.tsx` ファイルを追加します。これらは、ユーザーがアプリケーションの root (`/`) を訪問したときにレンダリングされます。
-[Root レイアウト](/docs/app/building-your-application/routing/layouts-and-templates#root-layout-required)を`app/layout.tsx`内に作成し、必要な``と``タグを含めます:
+[Root レイアウト](/docs/app/building-your-application/routing/layouts-and-templates#root-layout-required) を `app/layout.tsx` 内に `` および `` タグを含めて作成します:
@@ -91,7 +91,7 @@ export default function RootLayout({
children: React.ReactNode
}) {
return (
-
+
{children}
)
@@ -104,7 +104,7 @@ export default function RootLayout({
```jsx title="app/layout.js" switcher
export default function RootLayout({ children }) {
return (
-
+
{children}
)
@@ -114,7 +114,7 @@ export default function RootLayout({ children }) {
-最後に、初期コンテンツのあるホームページ`app/page.tsx`を作成します:
+最後に、初期コンテンツを含むホームページ `app/page.tsx` を作成します:
@@ -139,18 +139,18 @@ export default function Page() {
> **Good to know**:
>
-> - `layout.tsx`を作成し忘れた場合、`next dev`で開発サーバーを実行すると、Next.jsが自動的にこのファイルを作成します
-> - プロジェクトのrootに[`src`ディレクトリ](/docs/app/building-your-application/configuring/src-directory)を使用して、アプリケーションのコードを設定ファイルから分離することができます
+> - `layout.tsx` の作成を忘れると、Next.js は `next dev` で開発サーバーを実行するときに自動的にこのファイルを作成します。
+> - プロジェクトの root にある[`src` ディレクトリ](/docs/app/building-your-application/configuring/src-directory)を使用して、アプリケーションのコードを設定ファイルから分離することができます。
-### `pages`ディレクトリを作成する {#create-the-pages-directory}
+### `pages` ディレクトリを作成する {#create-the-pages-directory}
-Next.jsはファイルシステムルーティングを使用しており、アプリケーション内のルートはファイルの構造によって決まります。
+Next.js はファイルシステムルーティングを使用しており、アプリケーション内のルートはファイルの構造によって決まります。
-プロジェクトのrootに`pages`ディレクトリを作成します。それから、`pages`フォルダ内に`index.tsx`ファイルを追加します。これがホームページ(`/`)になります:
+プロジェクトの root に `pages` ディレクトリを作成します。次に、`pages` フォルダ内に `index.tsx` ファイルを追加します。これがホームページ (`/`) になります:
@@ -173,7 +173,7 @@ export default function Page() {
-次に、`pages/`内に`_app.tsx`ファイルを追加して、グローバルレイアウトを定義します。 [カスタムAppファイル](https://nextjs.org/docs/canary/pages/building-your-application/routing/custom-app)についてさらに学びます。
+次に、 `pages/` 内に `_app.tsx` ファイルを追加して、グローバルレイアウトを定義します。詳細は [カスタム App ファイル](https://nextjs.org/docs/canary/pages/building-your-application/routing/custom-app) を参照してください。
@@ -198,7 +198,7 @@ export default function App({ Component, pageProps }) {
-最後に、`pages/`内に`_document.tsx`ファイルを追加して、サーバーからの初期応答を制御します。[カスタムDocumentファイル](https://nextjs.org/docs/canary/pages/building-your-application/routing/custom-document)についてさらに学びます。
+最後に、`pages/` 内に `_document.tsx` ファイルを追加して、サーバーからの初期応答を制御します。詳細は [カスタム Document ファイル](https://nextjs.org/docs/canary/pages/building-your-application/routing/custom-document) を参照してください。
@@ -243,57 +243,52 @@ export default function Document() {
-### `public`フォルダを作成する(オプション) {#create-the-public-folder-optional}
+### `public` フォルダを作成する(オプション) {#create-the-public-folder-optional}
-プロジェクトのrootに[`public`フォルダ](/docs/app/building-your-application/optimizing/static-assets)を作成して、画像、フォントなどの静的アセットを保存することができます。`public`内のファイルは、それ以降コード内で基準URL(`/`)から参照することができます。
+プロジェクトの root に [`public` フォルダ](/docs/app/building-your-application/optimizing/static-assets) を作成して、画像やフォントなどの静的アセットを保存することができます。`public` 内のファイルは、ベースURL (`/`) から始まるコードで参照できます。
## 開発サーバーを実行する {#run-the-development-server}
-1. `npm run dev`を実行して、開発サーバーを開始します。
-2. `http://localhost:3000`にアクセスして、アプリケーションを表示します。
-3. `app/page.tsx` `pages/index.tsx` ファイルを編集して保存し、ブラウザで更新された結果を確認します。
+1. `npm run dev` を実行して開発サーバーを開始します。
+2. `http://localhost:3000` にアクセスしてアプリケーションを表示します。3.`app/page.tsx` `pages/index.tsx` ファイルを編集して保存すると、ブラウザで更新された結果が表示されます。
-## TypeScriptを設定する {#set-up-typescript}
+## TypeScript をセットアップする {#set-up-typescript}
-> 最低限のTypeScriptバージョン: `v4.5.2`
+> 最小 TypeScript バージョン: `v4.5.2`
-Next.jsは、組み込みのTypeScriptサポートを備えています。プロジェクトにTypeScriptを追加するには、ファイルの形式を`.ts`または`.tsx`に変更します。`next dev`を実行すると、Next.jsが必要な依存関係を自動的にインストールし、推奨構成オプションを含む`tsconfig.json`ファイルを追加します。
-
-> **Good to know**:
->
-> - すでに`jsconfig.json`ファイルを持っている場合は、古い`jsconfig.json`から新しい`tsconfig.json`に`paths`コンパイラオプションをコピーし、古い`jsconfig.json`ファイルを削除します。
+Next.js は組み込みの TypeScript サポートを提供しています。プロジェクトに TypeScript を追加するには、ファイルを `.ts` / `.tsx` にリネームします。`next dev` を実行すると、Next.js は自動的に必要な依存関係をインストールし、推奨される設定オプションを持つ `tsconfig.json` ファイルを追加します。
-### IDEプラグイン {#ide-plugin}
+### IDE プラグイン {#ide-plugin}
-Next.jsには、カスタムTypeScriptプラグインと型チェッカーが含まれており、VSCodeおよび他のコードエディタで高度な型検査と自動補完を利用できます。
+Next.js にはカスタム TypeScript プラグインと型チェッカーが含まれており、VSCode や他のコードエディターが高度な型チェックや自動補完に使用することができます。
-VS Codeでこのプラグインを有効にするには、以下の手順に従ってください:
+VS Code でプラグインを有効にするには:
1. コマンドパレットを開く(`Ctrl/⌘` + `Shift` + `P`)
2. 「TypeScript: Select TypeScript Version」を検索
3. 「Use Workspace Version」を選択
-これでファイルを編集すると、カスタムプラグインが有効になります。`next build`を実行すると、カスタム型チェッカーが使用されます。
+ファイルを編集するときに、カスタムプラグインが有効になります。`next build` を実行すると、カスタムの型チェッカーが使用されます。
-[TypeScript構成](/docs/app/api-reference/config/next-config-js/typescript)ページでは、プロジェクトでTypeScriptを使用する方法についてさらに詳しく知ることができます。
+プロジェクトで TypeScript を使用する方法の詳細については、[TypeScript の設定](/docs/app/api-reference/config/next-config-js/typescript) ページを参照してください。
-## ESLintを設定する {#set-up-eslint}
+## ESLintをセットアップする {#set-up-eslint}
-Next.jsは組み込みのESLintを備えており、`create-next-app`で新しいプロジェクトを作成する際に必要なパッケージを自動的にインストールし、適切な設定を行います。
+Next.js には組み込みのESLintが含まれており、プロジェクトを `create-next-app` で作成するときに必要なパッケージを自動的にインストールし、適切な設定を行います。
-既存のプロジェクトにESLintを追加するには、`package.json`に`next lint`をスクリプトとして追加します:
+既存のプロジェクトに ESLint を追加するには、`package.json` に `next lint` をスクリプトとして追加します:
```json title="package.json"
{
@@ -303,33 +298,33 @@ Next.jsは組み込みのESLintを備えており、`create-next-app`で新し
}
```
-その後、`npm run lint`を実行すると、インストールおよび設定プロセスがガイドされます。
+次に、`npm run lint` を実行すると、インストールと設定のプロセスが案内されます。
-```bash title="ターミナル"
+```bash title="Terminal"
pnpm lint
```
-次のようなプロンプトが表示されます:
+次のようなプロンプトが表示されます:
-> ? How would you like to configure ESLint?
+> ? ESLint をどのように設定しますか?
>
-> ❯ Strict (recommended)
-> Base
-> Cancel
+> ❯ 厳格(推奨)
+> 基本
+> キャンセル
-- **Strict**: Next.jsの基本的なESLint構成と、より厳格なCore Web Vitalsルールセットを含みます。初めてESLintを設定する開発者には、この設定が推奨されます
-- **Base**: Next.jsの基本的なESLint構成を含みます
-- **Cancel**: どのESLint構成も含まれません。このオプションは独自のカスタムESLint構成を設定する予定がある場合にのみ選択してください
+- **厳格**: Next.js の基本 ESLint 設定に加えて、より厳しい Core Web Vitals ルールセットが含まれます。これが初めて ESLint を設定する開発者のための推奨設定です。
+- **基本**: Next.js の基本 ESLint 設定が含まれます。
+- **キャンセル**: どの ESLint 設定も含まれません。このオプションは、独自のカスタム ESLint 設定を計画している場合にのみ選択します。
-2つの構成オプションのいずれかが選択されると、Next.jsは自動的に`eslint`と`eslint-config-next`をアプリケーションの依存関係としてインストールし、プロジェクトのrootに選択した構成を含む`.eslintrc.json`ファイルを作成します。
+どちらかの設定オプションを選択した場合、Next.js は自動的に `eslint` と `eslint-config-next` をアプリケーション内に依存関係としてインストールし、選択した設定を含む `.eslintrc.json` ファイルをプロジェクトの root に作成します。
-ESLintを実行してエラーを検出したい時はいつでも`next lint`を実行できます。ESLintが設定されると、毎回のビルド(`next build`)中にも自動的に実行されます。エラーはビルドを失敗させ、警告はビルドを失敗させません。
+ESLint でエラーを検出するたびに `next lint` を実行できます。ESLint の設定が終わると、ビルド(`next build`)時にも自動的に実行されます。エラーはビルドを失敗させ、警告は失敗させません。
-[ESLint Plugin](/docs/app/api-reference/config/next-config-js/eslint)ページでは、プロジェクトでESLintを設定する方法についてさらに詳しく知ることができます。
+プロジェクトで ESLint を設定する方法の詳細については、[ESLint プラグイン](/docs/app/api-reference/config/next-config-js/eslint) ページを参照してください。
-## 絶対インポートとモジュールパスエイリアスを設定する {#set-up-absolute-imports-and-module-path-aliases}
+## 絶対インポートとモジュールパスエイリアスをセットアップする {#set-up-absolute-imports-and-module-path-aliases}
-Next.jsは、`tsconfig.json`および`jsconfig.json`ファイルの`"paths"`および`"baseUrl"`オプションをサポートしています。これらのオプションを利用することで、プロジェクトディレクトリを絶対パスにエイリアスし、モジュールのインポートをより簡単にすることができます。例:
+Next.js は `tsconfig.json` および `jsconfig.json` ファイルの `"paths"` と `"baseUrl"` オプションをサポートしています。これらのオプションを使用してプロジェクトディレクトリを絶対パスにエイリアスし、モジュールのインポートを簡単にします。たとえば:
```jsx
// 変更前
@@ -339,9 +334,9 @@ import { Button } from '../../../components/button'
import { Button } from '@/components/button'
```
-絶対インポートを設定するには、`tsconfig.json`または`jsconfig.json`ファイルに`baseUrl`構成オプションを追加します。例:
+絶対インポートを設定するには、`tsconfig.json` または `jsconfig.json` ファイルに `baseUrl` 設定オプションを追加します。例:
-```json title="tsconfig.jsonまたはjsconfig.json"
+```json title="tsconfig.json または jsconfig.json"
{
"compilerOptions": {
"baseUrl": "src/"
@@ -349,11 +344,11 @@ import { Button } from '@/components/button'
}
```
-また、`baseUrl`パスを構成するほかに、`"paths"`オプションを使ってモジュールパスを"エイリアス"することができます。
+`baseUrl` パスを設定するだけでなく、`"paths"` オプションを使用してモジュールパスを `"alias"` することもできます。
-例として、次の構成は`@/components/*`を`components/*`にマッピングします:
+例えば、次の設定では、`@/components/*` を `components/*` にマップします:
-```json title="tsconfig.jsonまたはjsconfig.json"
+```json title="tsconfig.json または jsconfig.json"
{
"compilerOptions": {
"baseUrl": "src/",
@@ -365,7 +360,7 @@ import { Button } from '@/components/button'
}
```
-各`"paths"`は`baseUrl`の場所に対して相対的です。例:
+各 `"paths"` は `baseUrl` の場所からの相対パスです。例えば:
diff --git a/docs/01-app/01-getting-started/02-project-structure.mdx b/docs/01-app/01-getting-started/02-project-structure.mdx
index dc026be2..06d74005 100644
--- a/docs/01-app/01-getting-started/02-project-structure.mdx
+++ b/docs/01-app/01-getting-started/02-project-structure.mdx
@@ -1,121 +1,121 @@
---
-title: 'プロジェクト構造と組織化'
-nav_title: 'プロジェクト構造'
-description: 'Next.jsプロジェクトにおけるフォルダとファイルの規約、そしてプロジェクトの組織化方法について学びます'
+title: 'プロジェクトの構造と組織化'
+nav_title: 'Project Structure'
+description: 'Next.jsにおけるフォルダーおよびファイルの規約の概要と、プロジェクトの組織化方法について。'
---
-このページでは、Next.jsにおけるフォルダとファイルの規約、およびプロジェクトを組織化するためのヒントを紹介します。
+このページでは、Next.jsにおけるフォルダーおよびファイルの規約の概要と、プロジェクトの組織化に関するヒントを提供します。
-## フォルダとファイルの規約 {#folder-and-file-conventions}
+## フォルダーとファイルの規約 {#folder-and-file-conventions}
-### 最上位フォルダ {#top-level-folders}
+### トップレベルのフォルダー {#top-level-folders}
-最上位フォルダは、アプリケーションのコードと静的アセットを整理するために使用されます。
+トップレベルのフォルダーは、アプリケーションのコードと静的アセットを整理するために使用されます。
-| | |
-| --------------------------------------------------------------------------------- | ------------------------------------------ |
-| [`app`](/docs/app/building-your-application/routing) | App Router |
-| [`pages`](https://nextjs.org/docs/canary/pages/building-your-application/routing) | Pages Router |
-| [`public`](/docs/app/building-your-application/optimizing/static-assets) | サーブされる静的アセット |
-| [`src`](/docs/app/building-your-application/configuring/src-directory) | オプションのアプリケーションソースフォルダ |
-
-### 最上位ファイル {#top-level-files}
-
-最上位ファイルは、アプリケーションの設定、依存関係の管理、ミドルウェアの実行、モニタリングツールの統合、環境変数の定義に使用されます。
-
-| | |
-| ------------------------------------------------------------------------------------------- | ------------------------------------------------- |
-| **Next.js** | |
-| [`next.config.js`](/docs/app/api-reference/config/next-config-js) | Next.jsの設定ファイル |
-| [`package.json`](/docs/app/getting-started/installation#manual-installation) | プロジェクトの依存関係とスクリプト |
-| [`instrumentation.ts`](/docs/app/building-your-application/optimizing/instrumentation) | OpenTelemetryとインストゥルメンテーションファイル |
-| [`middleware.ts`](/docs/app/building-your-application/routing/middleware) | Next.jsリクエストミドルウェア |
-| [`.env`](/docs/app/building-your-application/configuring/environment-variables) | 環境変数 |
-| [`.env.local`](/docs/app/building-your-application/configuring/environment-variables) | ローカル環境変数 |
-| [`.env.production`](/docs/app/building-your-application/configuring/environment-variables) | 本番環境変数 |
-| [`.env.development`](/docs/app/building-your-application/configuring/environment-variables) | 開発環境変数 |
-| [`.eslintrc.json`](/docs/app/api-reference/config/eslint) | ESLintの設定ファイル |
-| `.gitignore` | Gitで無視されるファイルとフォルダ |
-| `next-env.d.ts` | Next.jsのTypeScript宣言ファイル |
-| `tsconfig.json` | TypeScriptの設定ファイル |
-| `jsconfig.json` | JavaScriptの設定ファイル |
+| | |
+| --------------------------------------------------------------------------------- | -------------------------------------------- |
+| [`app`](/docs/app/building-your-application/routing) | App Router |
+| [`pages`](https://nextjs.org/docs/canary/pages/building-your-application/routing) | Pages Router |
+| [`public`](/docs/app/building-your-application/optimizing/static-assets) | 提供される静的アセット |
+| [`src`](/docs/app/building-your-application/configuring/src-directory) | オプションのアプリケーションソースフォルダー |
+
+### トップレベルのファイル {#top-level-files}
+
+トップレベルのファイルは、アプリケーションの設定、依存関係の管理、ミドルウェアの実行、監視ツールの統合、環境変数の定義に使用されます。
+
+| | |
+| ------------------------------------------------------------------------------------------- | ---------------------------------------- |
+| **Next.js** | |
+| [`next.config.js`](/docs/app/api-reference/config/next-config-js) | Next.jsの設定ファイル |
+| [`package.json`](/docs/app/getting-started/installation#manual-installation) | プロジェクトの依存関係とスクリプト |
+| [`instrumentation.ts`](/docs/app/building-your-application/optimizing/instrumentation) | OpenTelemetryとInstrumentationのファイル |
+| [`middleware.ts`](/docs/app/building-your-application/routing/middleware) | Next.jsリクエストミドルウェア |
+| [`.env`](/docs/app/building-your-application/configuring/environment-variables) | 環境変数 |
+| [`.env.local`](/docs/app/building-your-application/configuring/environment-variables) | ローカル環境変数 |
+| [`.env.production`](/docs/app/building-your-application/configuring/environment-variables) | 本番環境変数 |
+| [`.env.development`](/docs/app/building-your-application/configuring/environment-variables) | 開発環境変数 |
+| [`.eslintrc.json`](/docs/app/api-reference/config/eslint) | ESLintの設定ファイル |
+| `.gitignore` | Gitで無視するファイルやフォルダー |
+| `next-env.d.ts` | Next.jsの型定義ファイル |
+| `tsconfig.json` | TypeScriptの設定ファイル |
+| `jsconfig.json` | JavaScriptの設定ファイル |
### ルーティングファイル {#routing-files}
-| | | |
-| ------------------------------------------------------------------------------- | ------------------- | ------------------------------------ |
-| [`layout`](/docs/app/api-reference/file-conventions/layout) | `.js` `.jsx` `.tsx` | レイアウト |
-| [`page`](/docs/app/api-reference/file-conventions/page) | `.js` `.jsx` `.tsx` | ページ |
-| [`loading`](/docs/app/api-reference/file-conventions/loading) | `.js` `.jsx` `.tsx` | ローディングUI |
-| [`not-found`](/docs/app/api-reference/file-conventions/not-found) | `.js` `.jsx` `.tsx` | 見つからないUI |
-| [`error`](/docs/app/api-reference/file-conventions/error) | `.js` `.jsx` `.tsx` | エラーUI |
-| [`global-error`](/docs/app/api-reference/file-conventions/error#global-errorjs) | `.js` `.jsx` `.tsx` | グローバルエラーUI |
-| [`route`](/docs/app/api-reference/file-conventions/route) | `.js` `.ts` | APIエンドポイント |
-| [`template`](/docs/app/api-reference/file-conventions/template) | `.js` `.jsx` `.tsx` | 再レンダリングされたレイアウト |
-| [`default`](/docs/app/api-reference/file-conventions/default) | `.js` `.jsx` `.tsx` | パラレルルートのフェールバックページ |
-
-### ネストルート {#nested-routes}
-
-| | |
-| ---------------------------------------------------------------------------- | ---------------------- |
-| [`folder`](/docs/app/building-your-application/routing#route-segments) | ルートセグメント |
-| [`folder/folder`](/docs/app/building-your-application/routing#nested-routes) | ネストルートセグメント |
+| | | |
+| ------------------------------------------------------------------------------- | ------------------- | -------------------------------- |
+| [`layout`](/docs/app/api-reference/file-conventions/layout) | `.js` `.jsx` `.tsx` | レイアウト |
+| [`page`](/docs/app/api-reference/file-conventions/page) | `.js` `.jsx` `.tsx` | ページ |
+| [`loading`](/docs/app/api-reference/file-conventions/loading) | `.js` `.jsx` `.tsx` | ローディングUI |
+| [`not-found`](/docs/app/api-reference/file-conventions/not-found) | `.js` `.jsx` `.tsx` | Not found UI |
+| [`error`](/docs/app/api-reference/file-conventions/error) | `.js` `.jsx` `.tsx` | エラーUI |
+| [`global-error`](/docs/app/api-reference/file-conventions/error#global-errorjs) | `.js` `.jsx` `.tsx` | グローバルエラーUI |
+| [`route`](/docs/app/api-reference/file-conventions/route) | `.js` `.ts` | APIエンドポイント |
+| [`template`](/docs/app/api-reference/file-conventions/template) | `.js` `.jsx` `.tsx` | 再レンダリングされたレイアウト |
+| [`default`](/docs/app/api-reference/file-conventions/default) | `.js` `.jsx` `.tsx` | 平行ルートのフォールバックページ |
+
+### 入れ子になったルート {#nested-routes}
+
+| | |
+| ---------------------------------------------------------------------------- | ------------------------------ |
+| [`folder`](/docs/app/building-your-application/routing#route-segments) | ルートセグメント |
+| [`folder/folder`](/docs/app/building-your-application/routing#nested-routes) | 入れ子になったルートセグメント |
### 動的ルート {#dynamic-routes}
-| | |
-| --------------------------------------------------------------------------------------------------------- | ------------------------------------------ |
-| [`[folder]`](/docs/app/building-your-application/routing/dynamic-routes#convention) | 動的ルートセグメント |
-| [`[...folder]`](/docs/app/building-your-application/routing/dynamic-routes#catch-all-segments) | キャッチオールルートセグメント |
-| [`[[...folder]]`](/docs/app/building-your-application/routing/dynamic-routes#optional-catch-all-segments) | オプションのキャッチオールルートセグメント |
+| | |
+| --------------------------------------------------------------------------------------------------------- | -------------------------------- |
+| [`[folder]`](/docs/app/building-your-application/routing/dynamic-routes#convention) | 動的ルートセグメント |
+| [`[...folder]`](/docs/app/building-your-application/routing/dynamic-routes#catch-all-segments) | Catch-all route segment |
+| [`[[...folder]]`](/docs/app/building-your-application/routing/dynamic-routes#optional-catch-all-segments) | Optional catch-all route segment |
-### ルートグループとプライベートフォルダ {#route-groups-and-private-folders}
+### Route Groupsとプライベートフォルダー {#route-groups-and-private-folders}
-| | |
-| --------------------------------------------------------------------------------- | ---------------------------------------------------- |
-| [`(folder)`](/docs/app/building-your-application/routing/route-groups#convention) | ルーティングに影響を与えずにルートをグループ化 |
-| [`_folder`](#private-folders) | フォルダとすべての子セグメントをルーティングから除外 |
+| | |
+| --------------------------------------------------------------------------------- | -------------------------------------------------------------- |
+| [`(folder)`](/docs/app/building-your-application/routing/route-groups#convention) | ルーティングに影響を与えずにルートをグループ化する |
+| [`_folder`](#private-folders) | フォルダーとそのすべての子セグメントをルーティングから除外する |
-### パラレルルートとインターセプタールート {#parallel-and-intercepted-routes}
+### Parallel RoutesとIntercepted Routes {#parallel-and-intercepted-routes}
-| | |
-| ---------------------------------------------------------------------------------------------- | -------------------------- |
-| [`@folder`](/docs/app/building-your-application/routing/parallel-routes#slots) | 名前付きスロット |
-| [`(.)folder`](/docs/app/building-your-application/routing/intercepting-routes#convention) | 同じレベルでインターセプト |
-| [`(..)folder`](/docs/app/building-your-application/routing/intercepting-routes#convention) | 1レベル上でインターセプト |
-| [`(..)(..)folder`](/docs/app/building-your-application/routing/intercepting-routes#convention) | 2レベル上でインターセプト |
-| [`(...)folder`](/docs/app/building-your-application/routing/intercepting-routes#convention) | rootからインターセプト |
+| | |
+| ---------------------------------------------------------------------------------------------- | ----------------------------- |
+| [`@folder`](/docs/app/building-your-application/routing/parallel-routes#slots) | 名前付きスロット |
+| [`(.)folder`](/docs/app/building-your-application/routing/intercepting-routes#convention) | 同じレベルのインターセプト |
+| [`(..)folder`](/docs/app/building-your-application/routing/intercepting-routes#convention) | 1つ上のレベルのインターセプト |
+| [`(..)(..)folder`](/docs/app/building-your-application/routing/intercepting-routes#convention) | 2つ上のレベルのインターセプト |
+| [`(...)folder`](/docs/app/building-your-application/routing/intercepting-routes#convention) | rootからのインターセプト |
### メタデータファイルの規約 {#metadata-file-conventions}
#### アプリのアイコン {#app-icons}
-| | | |
-| --------------------------------------------------------------------------------------------------------------- | ----------------------------------- | ----------------------------- |
-| [`favicon`](/docs/app/api-reference/file-conventions/metadata/app-icons#favicon) | `.ico` | ファビコンファイル |
-| [`icon`](/docs/app/api-reference/file-conventions/metadata/app-icons#icon) | `.ico` `.jpg` `.jpeg` `.png` `.svg` | アプリアイコンファイル |
-| [`icon`](/docs/app/api-reference/file-conventions/metadata/app-icons#generate-icons-using-code-js-ts-tsx) | `.js` `.ts` `.tsx` | 生成されたアプリアイコン |
-| [`apple-icon`](/docs/app/api-reference/file-conventions/metadata/app-icons#apple-icon) | `.jpg` `.jpeg`, `.png` | Appleアプリアイコンファイル |
-| [`apple-icon`](/docs/app/api-reference/file-conventions/metadata/app-icons#generate-icons-using-code-js-ts-tsx) | `.js` `.ts` `.tsx` | 生成されたAppleアプリアイコン |
+| | | |
+| --------------------------------------------------------------------------------------------------------------- | ----------------------------------- | ------------------------------- |
+| [`favicon`](/docs/app/api-reference/file-conventions/metadata/app-icons#favicon) | `.ico` | Faviconファイル |
+| [`icon`](/docs/app/api-reference/file-conventions/metadata/app-icons#icon) | `.ico` `.jpg` `.jpeg` `.png` `.svg` | アプリのアイコンファイル |
+| [`icon`](/docs/app/api-reference/file-conventions/metadata/app-icons#generate-icons-using-code-js-ts-tsx) | `.js` `.ts` `.tsx` | 生成されたアプリのアイコン |
+| [`apple-icon`](/docs/app/api-reference/file-conventions/metadata/app-icons#apple-icon) | `.jpg` `.jpeg`, `.png` | Appleアプリのアイコンファイル |
+| [`apple-icon`](/docs/app/api-reference/file-conventions/metadata/app-icons#generate-icons-using-code-js-ts-tsx) | `.js` `.ts` `.tsx` | 生成されたAppleアプリのアイコン |
-#### Open GraphとTwitterの画像 {#open-graph-and-twitter-images}
+#### Open GraphおよびTwitterの画像 {#open-graph-and-twitter-images}
-| | | |
-| --------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ------------------------ |
-| [`opengraph-image`](/docs/app/api-reference/file-conventions/metadata/opengraph-image#opengraph-image) | `.jpg` `.jpeg` `.png` `.gif` | Open Graph画像ファイル |
-| [`opengraph-image`](/docs/app/api-reference/file-conventions/metadata/opengraph-image#generate-images-using-code-js-ts-tsx) | `.js` `.ts` `.tsx` | 生成されたOpen Graph画像 |
-| [`twitter-image`](/docs/app/api-reference/file-conventions/metadata/opengraph-image#twitter-image) | `.jpg` `.jpeg` `.png` `.gif` | Twitter画像ファイル |
-| [`twitter-image`](/docs/app/api-reference/file-conventions/metadata/opengraph-image#generate-images-using-code-js-ts-tsx) | `.js` `.ts` `.tsx` | 生成されたTwitter画像 |
+| | | |
+| --------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | -------------------------- |
+| [`opengraph-image`](/docs/app/api-reference/file-conventions/metadata/opengraph-image#opengraph-image) | `.jpg` `.jpeg` `.png` `.gif` | Open Graphの画像ファイル |
+| [`opengraph-image`](/docs/app/api-reference/file-conventions/metadata/opengraph-image#generate-images-using-code-js-ts-tsx) | `.js` `.ts` `.tsx` | 生成されたOpen Graphの画像 |
+| [`twitter-image`](/docs/app/api-reference/file-conventions/metadata/opengraph-image#twitter-image) | `.jpg` `.jpeg` `.png` `.gif` | Twitterの画像ファイル |
+| [`twitter-image`](/docs/app/api-reference/file-conventions/metadata/opengraph-image#generate-images-using-code-js-ts-tsx) | `.js` `.ts` `.tsx` | 生成されたTwitter画像 |
#### SEO {#seo}
@@ -134,35 +134,35 @@ description: 'Next.jsプロジェクトにおけるフォルダとファイル
| | | |
| ------------------------------------------------------------------------------------------------------------------------------------ | ------------------- | -------------------- |
-| [`_app`](https://nextjs.org/docs/canary/pages/building-your-application/routing/custom-app) | `.js` `.jsx` `.tsx` | カスタムApp |
-| [`_document`](https://nextjs.org/docs/canary/pages/building-your-application/routing/custom-document) | `.js` `.jsx` `.tsx` | カスタムDocument |
+| [`_app`](https://nextjs.org/docs/canary/pages/building-your-application/routing/custom-app) | `.js` `.jsx` `.tsx` | カスタムアプリ |
+| [`_document`](https://nextjs.org/docs/canary/pages/building-your-application/routing/custom-document) | `.js` `.jsx` `.tsx` | カスタムドキュメント |
| [`_error`](https://nextjs.org/docs/canary/pages/building-your-application/routing/custom-error#more-advanced-error-page-customizing) | `.js` `.jsx` `.tsx` | カスタムエラーページ |
| [`404`](https://nextjs.org/docs/canary/pages/building-your-application/routing/custom-error#404-page) | `.js` `.jsx` `.tsx` | 404エラーページ |
| [`500`](https://nextjs.org/docs/canary/pages/building-your-application/routing/custom-error#500-page) | `.js` `.jsx` `.tsx` | 500エラーページ |
### ルート {#routes}
-| | | |
-| ----------------------------------------------------------------------------------------------------------------------- | ------------------- | ------------ |
-| **フォルダの規約** | | |
-| [`index`](https://nextjs.org/docs/canary/pages/building-your-application/routing/pages-and-layouts#index-routes) | `.js` `.jsx` `.tsx` | ホームページ |
-| [`folder/index`](https://nextjs.org/docs/canary/pages/building-your-application/routing/pages-and-layouts#index-routes) | `.js` `.jsx` `.tsx` | ネストページ |
-| **ファイルの規約** | | |
-| [`index`](https://nextjs.org/docs/canary/pages/building-your-application/routing/pages-and-layouts#index-routes) | `.js` `.jsx` `.tsx` | ホームページ |
-| [`file`](https://nextjs.org/docs/canary/pages/building-your-application/routing/pages-and-layouts) | `.js` `.jsx` `.tsx` | ネストページ |
+| | | |
+| ----------------------------------------------------------------------------------------------------------------------- | ------------------- | -------------------- |
+| **フォルダーの規約** | | |
+| [`index`](https://nextjs.org/docs/canary/pages/building-your-application/routing/pages-and-layouts#index-routes) | `.js` `.jsx` `.tsx` | ホームページ |
+| [`folder/index`](https://nextjs.org/docs/canary/pages/building-your-application/routing/pages-and-layouts#index-routes) | `.js` `.jsx` `.tsx` | 入れ子になったページ |
+| **ファイルの規約** | | |
+| [`index`](https://nextjs.org/docs/canary/pages/building-your-application/routing/pages-and-layouts#index-routes) | `.js` `.jsx` `.tsx` | ホームページ |
+| [`file`](https://nextjs.org/docs/canary/pages/building-your-application/routing/pages-and-layouts) | `.js` `.jsx` `.tsx` | 入れ子になったページ |
### 動的ルート {#dynamic-routes}
-| | | |
-| ------------------------------------------------------------------------------------------------------------------------------------------ | ------------------- | ------------------------------------------ |
-| **フォルダの規約** | | |
-| [`[folder]/index`](https://nextjs.org/docs/canary/pages/building-your-application/routing/dynamic-routes) | `.js` `.jsx` `.tsx` | 動的ルートセグメント |
-| [`[...folder]/index`](https://nextjs.org/docs/canary/pages/building-your-application/routing/dynamic-routes#catch-all-segments) | `.js` `.jsx` `.tsx` | キャッチオールルートセグメント |
-| [`[[...folder]]/index`](https://nextjs.org/docs/canary/pages/building-your-application/routing/dynamic-routes#optional-catch-all-segments) | `.js` `.jsx` `.tsx` | オプションのキャッチオールルートセグメント |
-| **ファイルの規約** | | |
-| [`[file]`](https://nextjs.org/docs/canary/pages/building-your-application/routing/dynamic-routes) | `.js` `.jsx` `.tsx` | 動的ルートセグメント |
-| [`[...file]`](https://nextjs.org/docs/canary/pages/building-your-application/routing/dynamic-routes#catch-all-segments) | `.js` `.jsx` `.tsx` | キャッチオールルートセグメント |
-| [`[[...file]]`](https://nextjs.org/docs/canary/pages/building-your-application/routing/dynamic-routes#optional-catch-all-segments) | `.js` `.jsx` `.tsx` | オプションのキャッチオールルートセグメント |
+| | | |
+| ------------------------------------------------------------------------------------------------------------------------------------------ | ------------------- | ---------------------------------- |
+| **フォルダーの規約** | | |
+| [`[folder]/index`](https://nextjs.org/docs/canary/pages/building-your-application/routing/dynamic-routes) | `.js` `.jsx` `.tsx` | 動的ルートセグメント |
+| [`[...folder]/index`](https://nextjs.org/docs/canary/pages/building-your-application/routing/dynamic-routes#catch-all-segments) | `.js` `.jsx` `.tsx` | Catch-allルートセグメント |
+| [`[[...folder]]/index`](https://nextjs.org/docs/canary/pages/building-your-application/routing/dynamic-routes#optional-catch-all-segments) | `.js` `.jsx` `.tsx` | Optional catch-allルートセグメント |
+| **ファイルの規約** | | |
+| [`[file]`](https://nextjs.org/docs/canary/pages/building-your-application/routing/dynamic-routes) | `.js` `.jsx` `.tsx` | 動的ルートセグメント |
+| [`[...file]`](https://nextjs.org/docs/canary/pages/building-your-application/routing/dynamic-routes#catch-all-segments) | `.js` `.jsx` `.tsx` | Catch-allルートセグメント |
+| [`[[...file]]`](https://nextjs.org/docs/canary/pages/building-your-application/routing/dynamic-routes#optional-catch-all-segments) | `.js` `.jsx` `.tsx` | Optional catch-allルートセグメント |
@@ -170,36 +170,36 @@ description: 'Next.jsプロジェクトにおけるフォルダとファイル
## プロジェクトの組織化 {#organizing-your-project}
-Next.jsは、[フォルダとファイルの規約](/docs/app/getting-started/project-structure)以外では、プロジェクトファイルの組織化や配置方法に対して**特に意見を持っていません**。しかし、プロジェクトを整理するためのいくつかの機能を提供しています。
+[フォルダーとファイルの規約](/docs/app/getting-started/project-structure)とは別に、Next.jsはプロジェクトファイルの整理や配置方法について特に意見を持たない**unopinionated**です。しかし、プロジェクトを整理するためのさまざまな機能を提供しています。
### コロケーション {#colocation}
-`app`ディレクトリ内では、[ネストフォルダ階層](/docs/app/building-your-application/routing#route-segments)がルート構造を定義します。各フォルダは、URLパス内の対応するセグメントにマッピングされるルートセグメントを表しています。
+`app`ディレクトリ内で、[入れ子になったフォルダーハイラルキー](/docs/app/building-your-application/routing#route-segments)がルート構造を定義します。各フォルダーは、URLパスと対応するルートセグメントを表しています。
-ただし、ルート構造はフォルダを通して定義されますが、`page.js`または`route.js`ファイルがルートセグメントに追加されるまでは、ルートは**公開されません**。
+ただし、ルート構造がフォルダーを通じて定義されている場合でも、`page.js`または`route.js`ファイルがルートセグメントに追加されるまでは、ルートは**公開アクセス不可能**です。
-そして、ルートが公開されるときも、クライアントに送信されるのは`page.js`または`route.js`によって返される**コンテンツだけ**です。
+そして、ルートが公開アクセス可能になると、`page.js`または`route.js`によって返される**コンテンツのみ**がクライアントに送信されます。
-これにより、**プロジェクトファイル**を`app`ディレクトリ内のルートセグメントに**安全にコロケーション**することができ、誤ってルートになることはありません。
+これは、`app`ディレクトリ内のルートセグメント内に**プロジェクトファイル**を**安全にコロケーション**することができ、間違えてルーティングされることがないことを意味します。
**Good to know**:
>
-> - `app`内にプロジェクトファイルをコロケーションできますが、必ずしもそうする必要はありません。希望する場合は、[`app`ディレクトリの外に保持する](#store-project-files-outside-of-app)こともできます。
+> - `app`内にプロジェクトファイルを**配置**することができるとはいえ、配置しなければならないというわけではありません。希望する場合は、[それらを`app`ディレクトリの外部に保持することもできます。](#store-project-files-outside-of-app)。
-### プライベートフォルダ {#private-folders}
+### プライベートフォルダー {#private-folders}
-フォルダ名の前にアンダースコアを付けることで、プライベートフォルダを作成することができます: `_folderName`
+プライベートフォルダーは、フォルダー名の前にアンダースコアを付けることで作成できます: `_フォルダ名`
-これはフォルダがプライベートな実装の詳細であることを示し、ルーティングシステムによって考慮されるべきではなく、**フォルダとそのサブフォルダ全体が**ルーティングから除外されることを意味します。
+これにより、フォルダーがプライベート実装の詳細であることを示し、ルーティングシステムによって考慮されないべきであることを示します。このことでフォルダーとそのサブフォルダーすべてをルーティングから**外すことを選択**します。
-`app`ディレクトリ内のファイルは[デフォルトで安全にコロケーションされるため](#colocation)、コロケーションのためにプライベートフォルダは必要ありません。しかし、次のような場合に有用です:
+`app`ディレクトリ内のファイルは[デフォルトで安全にコロケーションすることができる](/docs/app/building-your-application/routing#route-segments)ため、コロケーションのためにプライベートフォルダーは必要ありません。ただし、以下の目的で便利です。
-- UIロジックとルーティングロジックを分離する
-- プロジェクトやNext.jsエコシステム全体で内部ファイルを一貫して整理する
-- コードエディタでファイルを整理しグループ化する
-- 将来のNext.jsのファイル規約との命名の衝突を避ける
+- UIロジックをルーティングロジックから分離する
+- プロジェクト全体やNext.jsエコシステム内で内部ファイルを一貫して整理する
+- コードエディタ内でファイルをソートおよびグループ化する
+- 将来のNext.jsファイルの命名規約との潜在的な命名の衝突を避ける
> **Good to know**:
>
-> - フレームワークの規約ではありませんが、プライベートフォルダの外にあるファイルも同じアンダースコアのパターンを使うことで「プライベート」とマークすることを検討するかもしれません。
-> - フォルダ名の前に `%5F`(アンダースコアのURLエンコード形式)を付けることで、アンダースコアで始まるURLセグメントを作成できます:
+> - フレームワークの規約ではありませんが、プライベートフォルダー以外のファイルも同じアンダースコアパターンを使用して「プライベート」としてマークすることを検討するかもしれません
+> - アンダースコアで始まるURLセグメントを作成するには、フォルダー名の前に`%5F`(アンダースコアのURLエンコード形)を付けてください: `%5Fフォルダ名`
+> - プライベートフォルダーを使用しない場合は、予期しない命名の衝突を防ぐためにNext.jsの[特殊ファイルの規約](/docs/app/getting-started/project-structure#routing-files)を知っておくと便利です。
-- `%5FfolderName`
- > - プライベートフォルダを使用しない場合、Unexpectedな命名の衝突を防ぐためにNext.jsの[特別なファイルの規約](/docs/app/getting-started/project-structure#routing-files)を知っておくと便利です。
+### Route Groups {#route-groups}
-### ルートグループ {#route-groups}
+Route Groupsは、フォルダーを括弧で囲むことで作成されます: `(フォルダ名)`
-ルートグループは、フォルダを丸括弧で囲むことで作成できます:`(folderName)`
-
-これはフォルダが整理目的であり、ルートのURLパスには**含まれない**ことを示します。
+これにより、フォルダーが組織目的のためであり、ルートのURLパスには**含まれないべきである**ことを示しています。
-ルートグループは次のような場合に有用です:
+Route Groupsは次のような場合に便利です。
-- [サイトのセクション、目的、チームごとにルートをグループ化します](/docs/app/building-your-application/routing/route-groups#organize-routes-without-affecting-the-url-path)
-- 同じルートセグメントレベルでネストされたレイアウトを可能にする:
- - [同じセグメント内で複数のネストされたレイアウトを作成する(複数のroot レイアウトを含む)](/docs/app/building-your-application/routing/route-groups#creating-multiple-root-layouts)
+- [ルートをグループに分けて整理すること](/docs/app/building-your-application/routing/route-groups#organize-routes-without-affecting-the-url-path) 例:サイトセクションごと、目的ごと、チームごとに
+- 同じルートセグメントレベルで入れ子になったレイアウトを有効にする:
+ - [同じセグメント内で複数のroot レイアウトを含む複数の入れ子のレイアウトを作成する](/docs/app/building-your-application/routing/route-groups#creating-multiple-root-layouts)
- [共通セグメント内のルートのサブセットにレイアウトを追加する](/docs/app/building-your-application/routing/route-groups#opting-specific-segments-into-a-layout)
### `src`ディレクトリ {#src-directory}
-Next.jsは、アプリケーションコード(`app`を含む)をオプションの[`src`ディレクトリ](/docs/app/building-your-application/configuring/src-directory)内に保存することをサポートしています。これにより、プロジェクトの構成ファイルが主にプロジェクトのルートにあるのに対して、アプリケーションコードを分離します。
+Next.jsは、アプリケーションコードをオプションの[`src`ディレクトリ](/docs/app/building-your-application/configuring/src-directory)内に保存することをサポートしています。これは、プロジェクトのrootにある設定ファイルからアプリケーションコードを分離します。
**Good to know**: 以下の例では、`components`や`lib`フォルダを一般的なプレースホルダとして使用しており、この命名には特別なフレームワークの意味はありません。プロジェクトによっては`ui`、`utils`、`hooks`、`styles`などのフォルダを使用することがあります。
+> **Good to know**: 以下の例では、`components`や`lib`フォルダーをジェネラライズされたプレースホルダーとして使用しています。これらの名前には特別なフレームワークの意義はなく、あなたのプロジェクトでは`ui`、`utils`、`hooks`、`styles`など他のフォルダーを使用するかもしれません。
-#### `app`の外にプロジェクトファイルを格納する {#store-project-files-outside-of-app}
+#### プロジェクトファイルを`app`の外に保存する {#store-project-files-outside-of-app}
-この戦略では、すべてのアプリケーションコードを**プロジェクトのルート**内の共有フォルダに保存し、`app`ディレクトリを純粋にルーティング目的のために保ちます。
+この戦略では、すべてのアプリケーションコードを**プロジェクトのroot**にある共有フォルダーに保存し、`app`ディレクトリを純粋にルーティング目的に利用します。
-#### `app`内部の最上位フォルダ内にプロジェクトファイルを格納する {#store-project-files-in-top-level-folders-inside-of-app}
+#### プロジェクトファイルを`app`内のトップレベルフォルダーに保存する {#store-project-files-in-top-level-folders-inside-of-app}
-この戦略では、アプリケーションコードを`app`ディレクトリの**ルート**内の共有フォルダに保存します。
+この戦略では、すべてのアプリケーションコードを**`app`ディレクトリのroot**にある共有フォルダーに保存します。
-#### 機能またはルートごとにプロジェクトファイルを分割する {#split-project-files-by-feature-or-route}
+#### プロジェクトファイルを機能やルートごとに分割する {#split-project-files-by-feature-or-route}
-この戦略では、グローバルに共有されるアプリケーションコードを`app`ディレクトリのルートに保存し、より具体的なアプリケーションコードをルートセグメントごとに**分割**して使用します。
+この戦略では、グローバルに共有されるアプリケーションコードをrootの`app`ディレクトリに保存し、特定のアプリケーションコードを使用するルートセグメントに**分割**します。
+
+
+
+
+```tsx title="app/page.tsx" switcher
+export default function Page() {
+ return Hello Next.js!
+}
+```
+
+
+
+
+```jsx title="app/page.js" switcher
+export default function Page() {
+ return Hello Next.js!
+}
+```
+
+
+
+
+## レイアウトの作成 {#creating-a-layout}
+
+レイアウトは、複数のページ間で**共有される**UIです。ナビゲーション時に、レイアウトは状態を保持し、インタラクティブであり、再レンダリングされません。
+
+[`layout`ファイル](/docs/app/api-reference/file-conventions/layout)からReactコンポーネントをデフォルトエクスポートすることでレイアウトを定義できます。コンポーネントは、ページまたは別の[レイアウト](#nesting-layouts)である`children`プロップを受け入れる必要があります。
+
+たとえば、インデックスページを子として受け入れるレイアウトを作成するには、`app`ディレクトリに`layout`ファイルを追加します:
+
+
+
+
+
+
+```tsx title="app/layout.tsx" switcher
+export default function DashboardLayout({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ return (
+
+
+ {/* レイアウトUI */}
+ {/* ページまたはネストされたレイアウトをレンダリングしたい場所にchildrenを配置 */}
+ {children}
+
+
+ )
+}
+```
+
+
+
+
+```jsx title="app/layout.js" switcher
+export default function DashboardLayout({ children }) {
+ return (
+
+
+ {/* レイアウトUI */}
+ {/* ページまたはネストされたレイアウトをレンダリングしたい場所にchildrenを配置 */}
+ {children}
+
+
+ )
+}
+```
+
+
+
+
+上記のレイアウトは、`app`ディレクトリのルートに定義されているため、[root レイアウト](/docs/app/api-reference/file-conventions/layout#root-layouts)と呼ばれます。root レイアウトは**必須**であり、`html`および`body`タグを含める必要があります。
+
+## ネストされたルートの作成 {#creating-a-nested-route}
+
+ネストされたルートは、複数のURLセグメントで構成されるルートです。たとえば、`/blog/[slug]`ルートは、3つのセグメントで構成されています:
+
+- `/` (Root Segment)
+- `blog` (Segment)
+- `[slug]` (Leaf Segment)
+
+Next.jsでは:
+
+- **フォルダー**は、URLセグメントにマップするルートセグメントを定義するために使用されます。
+- **ファイル**(`page`や`layout`など)は、セグメントに表示されるUIを作成するために使用されます。
+
+ネストされたルートを作成するには、フォルダーを相互にネストできます。たとえば、`/blog`のルートを追加するには、`app`ディレクトリに`blog`というフォルダーを作成します。その後、`/blog`を公開アクセス可能にするために、`page`ファイルを追加します:
+
+
+
+
+
+
+```tsx title="app/blog/page.tsx" switcher
+import { getPosts } from '@/lib/posts'
+import { Post } from '@/ui/post'
+
+export default async function Page() {
+ const posts = await getPosts()
+
+ return (
+
+ {posts.map((post) => (
+
+ ))}
+
+ )
+}
+```
+
+
+
+
+
+
+```jsx title="app/blog/[slug]/page.js" switcher
+import { getPosts } from '@/lib/posts'
+import { Post } from '@/ui/post'
+
+export default async function Page() {
+ const posts = await getPosts()
+
+ return (
+
+ {posts.map((post) => (
+
+ ))}
+
+ )
+}
+```
+
+
+
+
+フォルダーを引き続きネストして、ネストされたルートを作成できます。たとえば、特定のブログ記事のルートを作成するには、`blog`内に新しい`[slug]`フォルダーを作成し、`page`ファイルを追加します:
+
+
+
+
+
+
+```tsx title="app/blog/[slug]/page.tsx" switcher
+function generateStaticParams() {}
+
+export default function Page() {
+ return Hello, Blog Post Page!
+}
+```
+
+
+
+
+```jsx title="app/blog/[slug]/page.js" switcher
+function generateStaticParams() {}
+
+export default function Page() {
+ return Hello, Blog Post Page!
+}
+```
+
+
+
+
+> **Good to know**: フォルダー名を角括弧で囲む(例:`[slug]`)ことで、データから複数のページを生成するための特殊な[dynamic route segment](/docs/app/building-your-application/routing/dynamic-routes)を作成できます。これは、ブログ記事、商品ページなどに便利です。
+
+## レイアウトのネスト {#nesting-layouts}
+
+デフォルトでは、フォルダー階層のレイアウトもネストされており、`children`プロップを介して子レイアウトをラップします。特定のルートセグメント(フォルダー)内に`layout`を追加することで、レイアウトをネストできます。
+
+たとえば、`/blog`ルートのレイアウトを作成するには、`blog`フォルダー内に新しい`layout`ファイルを追加します。
+
+
+
+
+
+
+```tsx title="app/blog/layout.tsx" switcher
+export default function BlogLayout({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ return
+}
+```
+
+
+
+
+```jsx title="app/blog/layout.js" switcher
+export default function BlogLayout({ children }) {
+ return
+}
+```
+
+
+
+
+上記の2つのレイアウトを組み合わせた場合、root レイアウト(`app/layout.js`)はblog レイアウト(`app/blog/layout.js`)をラップし、それはブログ(`app/blog/page.js`)およびブログ投稿ページ(`app/blog/[slug]/page.js`)をラップします。
+
+## ページ間のリンク {#linking-between-pages}
+
+[``コンポーネント](/docs/app/api-reference/components/link)を使用してルート間をナビゲートできます。``はプレフェッチ機能とクライアントサイドナビゲーションを提供するためにHTMLの``タグを拡張した、Next.jsのビルトインコンポーネントです。
+
+たとえば、ブログ記事のリストを生成するために、`next/link`から``をインポートし、コンポーネントに`href`プロップを渡します:
+
+
+
+
+```tsx title="app/ui/post.tsx" highlight={1,10} switcher
+import Link from 'next/link'
+
+export default async function Post({ post }) {
+ const posts = await getPosts()
+
+ return (
+
+ {posts.map((post) => (
+ -
+ {post.title}
+
+ ))}
+
+ )
+}
+```
+
+
+
+
+```jsx title="app/ui/post.js" highlight={1,10} switcher
+import Link from 'next/link'
+
+export default async function Post({ post }) {
+ const posts = await getPosts()
+
+ return (
+
+ {posts.map((post) => (
+ -
+ {post.title}
+
+ ))}
+
+ )
+}
+```
+
+
+
+
+``は、Next.jsアプリケーション内のルート間でナビゲートするための主要で推奨される方法です。しかし、より高度なナビゲーションを行うために[`useRouter`フック](/docs/app/api-reference/functions/use-router)を使うこともできます。
diff --git a/docs/01-app/01-getting-started/04-images-and-fonts.mdx b/docs/01-app/01-getting-started/04-images-and-fonts.mdx
new file mode 100644
index 00000000..5ece0d1a
--- /dev/null
+++ b/docs/01-app/01-getting-started/04-images-and-fonts.mdx
@@ -0,0 +1,433 @@
+---
+title: '画像とフォントを最適化する方法'
+nav_title: 'Images and Fonts'
+description: '画像とフォントを最適化する方法を学びましょう。'
+related:
+ title: 'API Reference'
+ description: 'このページで言及されている機能について詳しく知るには、API Reference をお読みください。'
+ links:
+ - app/api-reference/components/font
+ - app/api-reference/components/image
+---
+
+Next.jsには、自動的な画像とフォントの最適化機能が備わっており、パフォーマンスとユーザーエクスペリエンスが向上します。このページでは、それらの使用方法について説明します。
+
+## 静的アセットの取り扱い {#handling-static-assets}
+
+画像やフォントなどの静的ファイルは、ルートディレクトリの`public`というフォルダに保存できます。`public`内のファイルは、ベースURL(`/`)を開始としてコードで参照できます。
+
+
+
+## 画像の最適化 {#optmizing-images}
+
+Next.jsの[``](/docs/app/building-your-application/optimizing/images)コンポーネントは、HTMLの``要素を拡張して以下を提供します:
+
+- **サイズの最適化:** WebPやAVIFなどの現代的な画像フォーマットを使用して、各デバイスに適したサイズの画像を自動的に提供
+- **視覚的な安定性:** 画像がロードされる際に[レイアウトシフト](https://web.dev/articles/cls)を自動的に防止
+- **ページの高速読み込み:** 標準のブラウザの怠惰な読み込みを使用して画像がビューポートに入ったときのみロードし、任意のぼかしフィルアッププレースホルダーと共に
+- **アセットの柔軟性:** リモートサーバに保存された画像さえもオンデマンドでサイズ変更
+
+``を使用し始めるには、`next/image`からインポートし、コンポーネント内でレンダリングします。
+
+
+
+
+```tsx title="app/page.tsx" switcher
+import Image from 'next/image'
+
+export default function Page() {
+ return
+}
+```
+
+
+
+
+```jsx title="app/page.js" switcher
+import Image from 'next/image'
+
+export default function Page() {
+ return
+}
+```
+
+
+
+
+`src`プロパティは[ローカル](#local-images)または[リモート](#remote-images)画像のどちらかにすることができます。
+
+### ローカル画像 {#local-images}
+
+ローカル画像を使用するには、`.jpg`、`.png`、または`.webp`画像ファイルを[`public`フォルダ](#handling-static-assets)から`import`します。
+
+
+
+
+```tsx title="app/page.tsx" switcher
+import Image from 'next/image'
+import profilePic from './me.png'
+
+export default function Page() {
+ return (
+
+ )
+}
+```
+
+
+
+
+```jsx title="app/page.js" switcher
+import Image from 'next/image'
+import profilePic from './me.png'
+
+export default function Page() {
+ return (
+
+ )
+}
+```
+
+
+
+
+Next.jsは、インポートしたファイルに基づいて画像の固有の[`width`](/docs/app/api-reference/components/image#width)と[`height`](/docs/app/api-reference/components/image#height)を自動的に決定します。これらの値は画像の比率を決定し、画像がロードされる間の[Cumulative Layout Shift](https://web.dev/articles/cls)を防ぐために使用されます。
+
+### リモート画像 {#remote-images}
+
+リモート画像を使用するには、`src`プロパティにURL文字列を指定します。
+
+
+
+
+```tsx title="app/page.ts" switcher
+import Image from 'next/image'
+
+export default function Page() {
+ return (
+
+ )
+}
+```
+
+
+
+
+```jsx title="app/page.js" switcher
+import Image from 'next/image'
+
+export default function Page() {
+ return (
+
+ )
+}
+```
+
+
+
+
+Next.jsはビルドプロセス中にリモートファイルにアクセスできないため、[`width`](/docs/app/api-reference/components/image#width)、[`height`](/docs/app/api-reference/components/image#height)およびオプションで[`blurDataURL`](/docs/app/api-reference/components/image#blurdataurl)を手動で指定する必要があります。`width`と`height`の属性は、画像の正しいアスペクト比を推測し、画像の読み込みに起因するレイアウトの変化を避けるために使用されます。
+
+次に、リモートサーバからの画像を安全に許可するために、[`next.config.js`](/docs/app/api-reference/config/next-config-js)にサポートされるURLパターンのリストを定義する必要があります。悪意のある使用を防ぐためにできるだけ具体的にしてください。たとえば、次の設定は特定のAWS S3バケットからの画像のみを許可します:
+
+
+
+
+```ts title="next.config.ts" switcher
+import { NextConfig } from 'next'
+
+const config: NextConfig = {
+ images: {
+ remotePatterns: [
+ {
+ protocol: 'https',
+ hostname: 's3.amazonaws.com',
+ port: '',
+ pathname: '/my-bucket/**',
+ search: '',
+ },
+ ],
+ },
+}
+
+export default config
+```
+
+
+
+
+```js title="next.config.js" switcher
+module.exports = {
+ images: {
+ remotePatterns: [
+ {
+ protocol: 'https',
+ hostname: 's3.amazonaws.com',
+ port: '',
+ pathname: '/my-bucket/**',
+ search: '',
+ },
+ ],
+ },
+}
+```
+
+
+
+
+## フォントの最適化 {#optimizing-fonts}
+
+[`next/font`](/docs/app/api-reference/components/font)モジュールは、プライバシーとパフォーマンスを向上させるために、フォントを自動的に最適化し、外部ネットワークリクエストを排除します。
+
+これは、*任意の*フォントファイルに対して**組み込みの自動セルフホスティング**を含んでいます。これにより、レイアウトシフトなしにウェブフォントを最適にロードすることができます。
+
+`next/font`を使用し始めるには、[`next/font/local`](#local-fonts)または[`next/font/google`](#google-fonts)からインポートし、適切なオプションを使用して関数として呼び出し、フォントを適用したい要素の`className`を設定します。例:
+
+
+
+
+```tsx title="app/layout.tsx" highlight={1,3-5,9} switcher
+import { Geist } from 'next/font/google'
+
+const geist = Geist({
+ subsets: ['latin'],
+})
+
+export default function Layout({ children }: { children: React.ReactNode }) {
+ return (
+
+ {children}
+
+ )
+}
+```
+
+
+
+
+```jsx title="app/layout.js" highlight={1,3-5,9} switcher
+import { Geist } from 'next/font/google'
+
+const geist = Geist({
+ subsets: ['latin'],
+})
+
+export default function Layout({ children }) {
+ return (
+
+ {children}
+
+ )
+}
+```
+
+
+
+
+### Google フォント {#google-fonts}
+
+任意のGoogleフォントを自動的にセルフホストできます。フォントはデプロイに含まれ、デプロイと同じドメインから提供されるため、ユーザーがサイトを訪れるときにブラウザからGoogleへのリクエストは送信されません。
+
+Googleフォントの使用を開始するには、`next/font/google`から選択したフォントをインポートします:
+
+
+
+
+```tsx title="app/layout.tsx" switcher
+import { Geist } from 'next/font/google'
+
+const geist = Geist({
+ subsets: ['latin'],
+})
+
+export default function RootLayout({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ return (
+
+ {children}
+
+ )
+}
+```
+
+
+
+
+```jsx title="app/layout.js" switcher
+import { Geist } from 'next/font/google'
+
+const geist = Geist({
+ subsets: ['latin'],
+})
+
+export default function RootLayout({ children }) {
+ return (
+
+ {children}
+
+ )
+}
+```
+
+
+
+
+最良のパフォーマンスと柔軟性のために、[可変フォント](https://fonts.google.com/variablefonts)を使用することをお勧めします。しかし、可変フォントを使用できない場合は、**ウェイトを指定する必要があります**:
+
+
+
+
+```tsx title="app/layout.tsx" switcher
+import { Roboto } from 'next/font/google'
+
+const roboto = Roboto({
+ weight: '400',
+ subsets: ['latin'],
+})
+
+export default function RootLayout({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ return (
+
+ {children}
+
+ )
+}
+```
+
+
+
+
+```jsx title="app/layout.js" highlight={1,3-5,9} switcher
+import { Roboto } from 'next/font/google'
+
+const roboto = Roboto({
+ weight: '400',
+ subsets: ['latin'],
+})
+
+export default function RootLayout({ children }) {
+ return (
+
+ {children}
+
+ )
+}
+```
+
+
+
+
+### ローカルフォント {#local-fonts}
+
+ローカルフォントを使用するには、`next/font/local`からフォントをインポートし、[`public`フォルダ](#handling-static-assets)内のローカルフォントファイルの`src`を指定します。
+
+
+
+
+```tsx title="app/layout.tsx" switcher
+import localFont from 'next/font/local'
+
+const myFont = localFont({
+ src: './my-font.woff2',
+})
+
+export default function RootLayout({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ return (
+
+ {children}
+
+ )
+}
+```
+
+
+
+
+```jsx title="app/layout.js" switcher
+import localFont from 'next/font/local'
+
+const myFont = localFont({
+ src: './my-font.woff2',
+})
+
+export default function RootLayout({ children }) {
+ return (
+
+ {children}
+
+ )
+}
+```
+
+
+
+
+単一のフォントファミリーに対して複数のファイルを使用したい場合、`src`は配列にすることができます:
+
+```js
+const roboto = localFont({
+ src: [
+ {
+ path: './Roboto-Regular.woff2',
+ weight: '400',
+ style: 'normal',
+ },
+ {
+ path: './Roboto-Italic.woff2',
+ weight: '400',
+ style: 'italic',
+ },
+ {
+ path: './Roboto-Bold.woff2',
+ weight: '700',
+ style: 'normal',
+ },
+ {
+ path: './Roboto-BoldItalic.woff2',
+ weight: '700',
+ style: 'italic',
+ },
+ ],
+})
+```
diff --git a/docs/01-app/01-getting-started/05-css-and-styling.mdx b/docs/01-app/01-getting-started/05-css-and-styling.mdx
new file mode 100644
index 00000000..4b21c33e
--- /dev/null
+++ b/docs/01-app/01-getting-started/05-css-and-styling.mdx
@@ -0,0 +1,640 @@
+---
+title: 'アプリケーションでCSSを使用する方法'
+nav_title: 'CSSとスタイリング'
+description: 'CSS Modules、グローバルCSS、Tailwind CSSなど、アプリケーションにCSSを追加するさまざまな方法について学びます'
+related:
+ title: 'APIリファレンス'
+ description: 'このページで紹介されている機能について詳しくは、APIリファレンスを参照してください'
+ links:
+ - app/api-reference/config/next-config-js/sassOptions
+ - architecture/nextjs-compiler
+---
+
+Next.jsは、アプリケーションで次の方法を使ってCSSを使用できます:
+
+- [CSS Modules](#css-modules)
+- [グローバルCSS](#global-css)
+- [Tailwind CSS](#tailwind-css)
+- [Sass](#sass)
+- [CSS-in-JS](#css-in-js)
+- [外部スタイルシート](#external-stylesheets)
+
+このページでは、これらの各アプローチの使用方法を案内します。
+
+## CSS Modules {#css-modules}
+
+CSS Modulesは、一意のクラス名を生成することでCSSをローカルスコープにします。これにより、異なるファイルで同じクラスを使用しても衝突を心配する必要がありません。
+
+CSS Modulesの使用を開始するには、`.module.css`拡張子の新しいファイルを作成し、`app`ディレクトリ内の任意のコンポーネントにインポートしてください:
+
+```css title="app/blog/styles.module.css"
+.blog {
+ padding: 24px;
+}
+```
+
+
+
+
+```tsx title="app/blog/page.tsx" switcher
+import styles from './styles.module.css'
+
+export default function Page({ children }: { children: React.ReactNode }) {
+ return {children}
+}
+```
+
+
+
+
+```jsx title="app/blog/page.js" switcher
+import styles from './styles.module.css'
+
+export default function Page({ children }) {
+ return {children}
+}
+```
+
+
+
+
+## グローバルCSS {#global-css}
+
+グローバルCSSを使用して、アプリケーション全体にスタイルを適用することができます。
+
+グローバルスタイルを使用するには、新しいCSSファイルを作成します。例えば、`app/global.css`:
+
+```css title="app/global.css"
+body {
+ padding: 20px 20px 60px;
+ max-width: 680px;
+ margin: 0 auto;
+}
+```
+
+rootレイアウト(`app/layout.js`)でこのファイルをインポートし、アプリケーション内の**すべてのルート**にスタイルを適用します:
+
+
+
+
+```tsx title="app/layout.tsx" switcher
+// これらのスタイルは、アプリケーション内のすべてのルートに適用されます
+import './global.css'
+
+export default function RootLayout({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ return (
+
+ {children}
+
+ )
+}
+```
+
+
+
+
+```jsx title="app/layout.js" switcher
+// これらのスタイルは、アプリケーション内のすべてのルートに適用されます
+import './global.css'
+
+export default function RootLayout({ children }) {
+ return (
+
+ {children}
+
+ )
+}
+```
+
+
+
+
+> **Good to know:** グローバルスタイルは、`app`ディレクトリ内の任意のレイアウト、ページ、またはコンポーネントにインポートできます。しかし、Next.jsはスタイルシートを統合するためにReactのビルトインサポートを使用しています。このビルトインサポートは、ルート間を移動する際にスタイルシートを削除しません。したがって、*本当に*グローバルなCSSにはグローバルスタイルを、スコープされたCSSには[CSS Modules](#css-modules)を使用することをお勧めします。
+
+## Tailwind CSS {#tailwind-css}
+
+[Tailwind CSS](https://tailwindcss.com/)は、Next.jsとシームレスに統合されるユーティリティファーストのCSSフレームワークです。
+
+### Tailwindのインストール {#installing-tailwind}
+
+Tailwindを使用し始めるには、Tailwind CSSのパッケージをインストールし、`init`コマンドを実行して`tailwind.config.js`と`postcss.config.js`のファイルを生成します:
+
+```bash title="Terminal"
+npm install -D tailwindcss postcss autoprefixer
+npx tailwindcss init -p
+```
+
+### Tailwindの設定 {#configuring-tailwind}
+
+Tailwindの設定ファイル内で、Tailwindのクラス名を使用するファイルのパスを追加します:
+
+
+
+
+```ts title="tailwind.config.ts" highlight={5-7} switcher
+import type { Config } from 'tailwindcss'
+
+const config: Config = {
+ content: [
+ './app/**/*.{js,ts,jsx,tsx,mdx}',
+ // `src`ディレクトリを使用している場合:
+ './src/**/*.{js,ts,jsx,tsx,mdx}',
+ ],
+ theme: {
+ extend: {},
+ },
+ plugins: [],
+}
+export default config
+```
+
+
+
+
+```js title="tailwind.config.js" highlight={4-6} switcher
+/** @type {import('tailwindcss').Config} */
+module.exports = {
+ content: [
+ './app/**/*.{js,ts,jsx,tsx,mdx}',
+ // `src`ディレクトリを使用している場合:
+ './src/**/*.{js,ts,jsx,tsx,mdx}',
+ ],
+ theme: {
+ extend: {},
+ },
+ plugins: [],
+}
+```
+
+
+
+
+### Tailwindの使用 {#using-tailwind}
+
+[Tailwindのディレクティブ](https://tailwindcss.com/docs/functions-and-directives#directives)を[グローバルスタイルシート](#global-css)に追加します:
+
+```css title="app/globals.css"
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+```
+
+次に、スタイルを[ルートレイアウト](/docs/app/api-reference/file-conventions/layout#root-layouts)でインポートします:
+
+
+
+
+```tsx title="app/layout.tsx" switcher
+import type { Metadata } from 'next'
+
+// これらのスタイルは、アプリケーションのすべてのルートに適用されます
+import './globals.css'
+
+export const metadata: Metadata = {
+ title: 'Create Next App',
+ description: 'Generated by create next app',
+}
+
+export default function RootLayout({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ return (
+
+ {children}
+
+ )
+}
+```
+
+
+
+
+```jsx title="app/layout.js" switcher
+// これらのスタイルは、アプリケーションのすべてのルートに適用されます
+import './globals.css'
+
+export const metadata = {
+ title: 'Create Next App',
+ description: 'Generated by create next app',
+}
+
+export default function RootLayout({ children }) {
+ return (
+
+ {children}
+
+ )
+}
+```
+
+
+
+
+最後に、アプリケーションでTailwindのユーティリティクラスを書き始めることができます。
+
+
+
+
+```tsx title="app/page.tsx" switcher
+export default function Page() {
+ return Hello, Next.js!
+}
+```
+
+
+
+
+```jsx title="app/page.js" switcher
+export default function Page() {
+ return Hello, Next.js!
+}
+```
+
+
+
+
+## Sass {#sass}
+
+Next.jsは、[`.scss`](https://sass-lang.com/documentation/syntax/#scss)と[`.sass`](https://sass-lang.com/documentation/syntax#the-indented-syntax)の両方の拡張子と構文を使用して[Sass](https://sass-lang.com/)と統合されます。
+
+また、[CSS Modules](#css-modules)と`.module.scss`または`.module.sass`の拡張子を使って、コンポーネントレベルでのSassを使用することもできます。
+
+### Sassのインストール {#installing-sass}
+
+Sassを使用し始めるには、`sass`パッケージをインストールします:
+
+```bash title="Terminal"
+npm install --save-dev sass
+```
+
+### Sassオプションのカスタマイズ {#customizing-sass-options}
+
+Sassオプションを設定したい場合は、`next.config.js`で[`sassOptions`](/docs/app/api-reference/config/next-config-js/sassOptions)オプションを使用します:
+
+
+
+
+```ts title="next.config.ts" switcher
+import type { NextConfig } from 'next'
+
+const nextConfig: NextConfig = {
+ sassOptions: {
+ additionalData: `$var: red;`,
+ },
+}
+
+export default nextConfig
+```
+
+
+
+
+```js title="next.config.js" switcher
+/** @type {import('next').NextConfig} */
+
+const nextConfig = {
+ sassOptions: {
+ additionalData: `$var: red;`,
+ },
+}
+
+module.exports = nextConfig
+```
+
+
+
+
+## CSS-in-JS {#css-in-js}
+
+> **警告:** 実行時JavaScriptを必要とするCSS-in-JSライブラリは、現時点ではReactのServer Componentsでサポートされていません。Server ComponentsやStreamingのような新しいReact機能とCSS-in-JSを使用するには、ライブラリアの作者が最新のReactバージョンをサポートする必要があります。
+
+以下のライブラリは、`app`ディレクトリの**Client Components**でサポートされています(アルファベット順):
+
+- [`ant-design`](https://ant.design/docs/react/use-with-next#using-app-router)
+- [`chakra-ui`](https://chakra-ui.com/getting-started/nextjs-app-guide)
+- [`@fluentui/react-components`](https://react.fluentui.dev/?path=/docs/concepts-developer-server-side-rendering-next-js-appdir-setup--page)
+- [`kuma-ui`](https://kuma-ui.com)
+- [`@mui/material`](https://mui.com/material-ui/guides/next-js-app-router/)
+- [`@mui/joy`](https://mui.com/joy-ui/integrations/next-js-app-router/)
+- [`pandacss`](https://panda-css.com)
+- [`styled-jsx`](#styled-jsx)
+- [`styled-components`](#styled-components)
+- [`stylex`](https://stylexjs.com)
+- [`tamagui`](https://tamagui.dev/docs/guides/next-js#server-components)
+- [`tss-react`](https://tss-react.dev/)
+- [`vanilla-extract`](https://vanilla-extract.style)
+
+以下のライブラリは現在サポート中です:
+
+- [`emotion`](https://github.com/emotion-js/emotion/issues/2928)
+
+Server Componentsをスタイル付けしたい場合は、[CSS Modules](#css-modules)や、[Tailwind CSS](#tailwind-css)のようなCSSファイルを出力するソリューションを使用することをお勧めします。
+
+### CSS-in-JSの設定 {#configuring-css-in-js}
+
+CSS-in-JSを設定するために必要なこと:
+
+1. レンダリング中にすべてのCSSルールを収集する**スタイルレジストリ**を作成します。
+2. `useServerInsertedHTML`フックを使って、それらのルールを使用する可能性のあるコンテンツの前にルールを挿入します。
+3. 最初のサーバーサイドレンダリング中にアプリをスタイルレジストリでラップするClient Componentを作成します。
+
+#### `styled-jsx` {#styled-jsx}
+
+アプリケーション用に`styled-jsx`を設定するには、新しいレジストリを作成します:
+
+
+
+
+```tsx title="app/registry.tsx" switcher
+'use client'
+
+import React, { useState } from 'react'
+import { useServerInsertedHTML } from 'next/navigation'
+import { StyleRegistry, createStyleRegistry } from 'styled-jsx'
+
+export default function StyledJsxRegistry({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ // レイジー初期状態でスタイルシートを一度だけ作成
+ // x-ref: https://reactjs.org/docs/hooks-reference.html#lazy-initial-state
+ const [jsxStyleRegistry] = useState(() => createStyleRegistry())
+
+ useServerInsertedHTML(() => {
+ const styles = jsxStyleRegistry.styles()
+ jsxStyleRegistry.flush()
+ return <>{styles}>
+ })
+
+ return {children}
+}
+```
+
+
+
+
+```jsx title="app/registry.js" switcher
+'use client'
+
+import React, { useState } from 'react'
+import { useServerInsertedHTML } from 'next/navigation'
+import { StyleRegistry, createStyleRegistry } from 'styled-jsx'
+
+export default function StyledJsxRegistry({ children }) {
+ // レイジー初期状態でスタイルシートを一度だけ作成
+ // x-ref: https://reactjs.org/docs/hooks-reference.html#lazy-initial-state
+ const [jsxStyleRegistry] = useState(() => createStyleRegistry())
+
+ useServerInsertedHTML(() => {
+ const styles = jsxStyleRegistry.styles()
+ jsxStyleRegistry.flush()
+ return <>{styles}>
+ })
+
+ return {children}
+}
+```
+
+
+
+
+次に、[ルートレイアウト](/docs/app/api-reference/file-conventions/layout#root-layouts)をレジストリでラップします:
+
+
+
+
+```tsx title="app/layout.tsx" switcher
+import StyledJsxRegistry from './registry'
+
+export default function RootLayout({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ return (
+
+
+ {children}
+
+
+ )
+}
+```
+
+
+
+
+```jsx title="app/layout.js" switcher
+import StyledJsxRegistry from './registry'
+
+export default function RootLayout({ children }) {
+ return (
+
+
+ {children}
+
+
+ )
+}
+```
+
+
+
+
+#### `styled-components` {#styled-components}
+
+`styled-components`を使用するには、`next.config.js`で有効にします:
+
+
+
+
+```ts title="next.config.ts" switcher
+import type { NextConfig } from 'next'
+
+const nextConfig: NextConfig = {
+ compiler: {
+ styledComponents: true,
+ },
+}
+
+export default nextConfig
+```
+
+
+
+
+```js title="next.config.js" switcher
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+ compiler: {
+ styledComponents: true,
+ },
+}
+```
+
+
+
+
+次に、`styled-components` APIを使用して、レンダリング中に生成されたすべてのCSSスタイルルールを収集するグローバルなレジストリコンポーネントと、それらのルールを返す関数を作成します。そして、`useServerInsertedHTML`フックを使って、そのレジストリで収集されたスタイルをrootレイアウトの`` HTMLタグに注入します。
+
+
+
+
+```tsx title="lib/registry.tsx" switcher
+'use client'
+
+import React, { useState } from 'react'
+import { useServerInsertedHTML } from 'next/navigation'
+import { ServerStyleSheet, StyleSheetManager } from 'styled-components'
+
+export default function StyledComponentsRegistry({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ // レイジー初期状態でスタイルシートを一度だけ作成
+ // x-ref: https://reactjs.org/docs/hooks-reference.html#lazy-initial-state
+ const [styledComponentsStyleSheet] = useState(() => new ServerStyleSheet())
+
+ useServerInsertedHTML(() => {
+ const styles = styledComponentsStyleSheet.getStyleElement()
+ styledComponentsStyleSheet.instance.clearTag()
+ return <>{styles}>
+ })
+
+ if (typeof window !== 'undefined') return <>{children}>
+
+ return (
+
+ {children}
+
+ )
+}
+```
+
+
+
+
+```jsx title="lib/registry.js" switcher
+'use client'
+
+import React, { useState } from 'react'
+import { useServerInsertedHTML } from 'next/navigation'
+import { ServerStyleSheet, StyleSheetManager } from 'styled-components'
+
+export default function StyledComponentsRegistry({ children }) {
+ // レイジー初期状態でスタイルシートを一度だけ作成
+ // x-ref: https://reactjs.org/docs/hooks-reference.html#lazy-initial-state
+ const [styledComponentsStyleSheet] = useState(() => new ServerStyleSheet())
+
+ useServerInsertedHTML(() => {
+ const styles = styledComponentsStyleSheet.getStyleElement()
+ styledComponentsStyleSheet.instance.clearTag()
+ return <>{styles}>
+ })
+
+ if (typeof window !== 'undefined') return <>{children}>
+
+ return (
+
+ {children}
+
+ )
+}
+```
+
+
+
+
+rootレイアウトの`children`をスタイルレジストリコンポーネントでラップします:
+
+
+
+
+```tsx title="app/layout.tsx" switcher
+import StyledComponentsRegistry from './lib/registry'
+
+export default function RootLayout({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ return (
+
+
+ {children}
+
+
+ )
+}
+```
+
+
+
+
+```jsx title="app/layout.js" switcher
+import StyledComponentsRegistry from './lib/registry'
+
+export default function RootLayout({ children }) {
+ return (
+
+
+ {children}
+
+
+ )
+}
+```
+
+
+
+
+## 外部スタイルシート {#external-stylesheets}
+
+外部パッケージによって公開されているスタイルシートは、`app`ディレクトリ内のどこにでも、またはコロケートされたコンポーネント内にインポートすることができます:
+
+
+
+
+```tsx title="app/layout.tsx" switcher
+import 'bootstrap/dist/css/bootstrap.css'
+
+export default function RootLayout({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ return (
+
+ {children}
+
+ )
+}
+```
+
+
+
+
+```jsx title="app/layout.js" switcher
+import 'bootstrap/dist/css/bootstrap.css'
+
+export default function RootLayout({ children }) {
+ return (
+
+ {children}
+
+ )
+}
+```
+
+
+
+
+外部スタイルシートは、npmパッケージから直接インポートするか、コードベースにコロケートしてダウンロードする必要があります。``を使用することはできません。
diff --git a/docs/01-app/01-getting-started/06-data-fetching-and-streaming.mdx b/docs/01-app/01-getting-started/06-data-fetching-and-streaming.mdx
new file mode 100644
index 00000000..a885be11
--- /dev/null
+++ b/docs/01-app/01-getting-started/06-data-fetching-and-streaming.mdx
@@ -0,0 +1,413 @@
+---
+title: 'データをフェッチしてストリームする方法'
+nav_title: 'データのフェッチとストリーミング'
+description: 'アプリケーションでデータ取得とコンテンツストリーミングを開始します。'
+related:
+ title: 'APIリファレンス'
+ description: 'このページで紹介されている機能について、APIリファレンスを読んでさらに詳しく学びましょう。'
+ links:
+ - 'app/api-reference/functions/fetch'
+ - 'app/api-reference/file-conventions/loading'
+---
+
+このページでは、[server component](#server-components)および[client component](#client-components)でのデータフェッチ方法を解説します。また、データに依存するコンテンツをどのように[ストリーム](#streaming)するかについても説明します。
+
+## データのフェッチ {#fetching-data}
+
+### Server Components {#server-components}
+
+Server Componentsでデータをフェッチするには次の方法があります:
+
+1. [`fetch` API](#with-the-fetch-api)を使用する
+2. [ORMやデータベース](#with-an-orm-or-database)を使用する
+
+#### `fetch` APIを使用する場合 {#with-the-fetch-api}
+
+`fetch` APIを使用してデータをフェッチするには、コンポーネントを非同期関数に変え、`fetch`呼び出しをawaitします。例えば:
+
+
+
+
+```tsx title="app/blog/page.tsx" switcher
+export default async function Page() {
+ const data = await fetch('https://api.vercel.app/blog')
+ const posts = await data.json()
+ return (
+
+ {posts.map((post) => (
+ - {post.title}
+ ))}
+
+ )
+}
+```
+
+
+
+
+```jsx title="app/blog/page.js" switcher
+export default async function Page() {
+ const data = await fetch('https://api.vercel.app/blog')
+ const posts = await data.json()
+ return (
+
+ {posts.map((post) => (
+ - {post.title}
+ ))}
+
+ )
+}
+```
+
+
+
+
+#### ORMやデータベースを使用する場合 {#with-an-orm-or-database}
+
+ORMやデータベースを使用してデータを取得するには、コンポーネントを非同期関数に変えて、その呼び出しをawaitします:
+
+
+
+
+```tsx title="app/blog/page.tsx" switcher
+import { db, posts } from '@/lib/db'
+
+export default async function Page() {
+ const allPosts = await db.select().from(posts)
+ return (
+
+ {allPosts.map((post) => (
+ - {post.title}
+ ))}
+
+ )
+}
+```
+
+
+
+
+```jsx title="app/blog/page.js" switcher
+import { db, posts } from '@/lib/db'
+
+export default async function Page() {
+ const allPosts = await db.select().from(posts)
+ return (
+
+ {allPosts.map((post) => (
+ - {post.title}
+ ))}
+
+ )
+}
+```
+
+
+
+
+### Client Components {#client-components}
+
+Client Componentsでデータをフェッチする方法は2つあります:
+
+1. Reactの[`use`フック](https://react.dev/reference/react/use)を使用する
+2. [SWR](https://swr.vercel.app/)や[React Query](https://tanstack.com/query/latest)のようなコミュニティライブラリを使用する
+
+#### `use` フックを使用する場合 {#with-the-use-hook}
+
+Reactの[`use`フック](https://react.dev/reference/react/use)を使用して、サーバーからクライアントにデータを[ストリーム](#streaming)できます。まず、Server Componentsでデータをフェッチし、そのプロミスをClient Componentsにプロップとして渡します:
+
+
+
+
+```tsx title="app/blog/page.tsx" switcher
+import Posts from '@/app/ui/posts
+import { Suspense } from 'react'
+
+export default function Page() {
+ // データ取得関数をawaitしないでください
+ const posts = getPosts()
+
+ return (
+ Loading...}>
+
+
+ )
+}
+```
+
+
+
+
+```jsx title="app/blog/page.js" switcher
+import Posts from '@/app/ui/posts
+import { Suspense } from 'react'
+
+export default function Page() {
+ // データ取得関数をawaitしないでください
+ const posts = getPosts()
+
+ return (
+ Loading...}>
+
+
+ )
+}
+```
+
+
+
+
+次に、Client Componentsで`use`フックを使用してプロミスを読み込みます:
+
+
+
+
+```tsx title="app/ui/posts.tsx" switcher
+'use client'
+import { use } from 'react'
+
+export default function Posts({ posts }) {
+ const posts = use(posts)
+
+ return (
+
+ {posts.map((post) => (
+ - {post.title}
+ ))}
+
+ )
+}
+```
+
+
+
+
+```jsx title="app/ui/posts.js" switcher
+'use client'
+import { use } from 'react'
+
+export default function Posts({ posts }) {
+ const posts = use(posts)
+
+ return (
+
+ {posts.map((post) => (
+ - {post.title}
+ ))}
+
+ )
+}
+```
+
+
+
+
+上記の例では、``コンポーネントを[``境界](https://react.dev/reference/react/Suspense)でラップする必要があります。これは、プロミスが解決されるまでフォールバックが表示されることを意味します。[ストリーミング](#streaming)についてさらに学びましょう。
+
+#### コミュニティライブラリ {#community-libraries}
+
+[SWR](https://swr.vercel.app/)や[React Query](https://tanstack.com/query/latest)のようなコミュニティライブラリを使用して、Client Components内でデータを取得できます。これらのライブラリは、キャッシュ、ストリーミング、およびその他の機能について独自のセマンティクスを持っています。例えば、SWRを使用した場合:
+
+
+
+
+```tsx title="app/blog/page.tsx" switcher
+'use client'
+import useSWR from 'swr'
+
+const fetcher = (url) => fetch(url).then((r) => r.json())
+
+export default function BlogPage() {
+ const { data, error, isLoading } = useSWR(
+ 'https://api.vercel.app/blog',
+ fetcher
+ )
+
+ if (isLoading) return Loading...
+ if (error) return Error: {error.message}
+
+ return (
+
+ {data.map((post: { id: string; title: string }) => (
+ - {post.title}
+ ))}
+
+ )
+}
+```
+
+
+
+
+```jsx title="app/blog/page.js" switcher
+'use client'
+import useSWR from 'swr'
+
+const fetcher = (url) => fetch(url).then((r) => r.json())
+
+export default function BlogPage() {
+ const { data, error, isLoading } = useSWR(
+ 'https://api.vercel.app/blog',
+ fetcher
+ )
+
+ if (isLoading) return Loading...
+ if (error) return Error: {error.message}
+
+ return (
+
+ {data.map((post) => (
+ - {post.title}
+ ))}
+
+ )
+}
+```
+
+
+
+
+## ストリーミング {#streaming}
+
+> **警告:** サーバーコンポーネントで`async/await`を使用する際には、アプリケーションの[`dynamicIO`設定オプション](/docs/app/api-reference/config/next-config-js/dynamicIO)が有効になっていることが前提です。このフラグはNext.js 15のcanaryで導入されました。
+
+Server Componentsで`async/await`を使用すると、Next.jsは**動的レンダリング**に切り替わります。これは、データがユーザーのリクエストごとにサーバーでフェッチされ、レンダリングされることを意味します。遅いデータリクエストがある場合、ルート全体がレンダリングをブロックされます。
+
+初期ロード時間とユーザー体験を改善するために、ストリーミングを使用してページのHTMLを小さなチャンクに分割し、そのチャンクをサーバーからクライアントへ徐々に送信できます。
+
+
+
+アプリケーションでストリーミングを実装する方法は2つあります:
+
+1. [`loading.js`ファイル](#with-loading-js)を使用する
+2. Reactの[``コンポーネント](#with-suspense)を使用する
+
+### `loading.js`を使用する {#with-loading-js}
+
+ページと同じフォルダーに`loading.js`ファイルを作成して、データ取得中に**ページ全体**をストリームします。例えば、`app/blog/page.js`をストリームするには、`app/blog`フォルダー内にファイルを追加します。
+
+
+
+
+
+
+```tsx title="app/blog/loading.tsx" switcher
+export default function Loading() {
+ // ここで読み込みUIを定義します
+ return Loading...
+}
+```
+
+
+
+
+```jsx title="app/blog/loading.js" switcher
+export default function Loading() {
+ // ここで読み込みUIを定義します
+ return Loading...
+}
+```
+
+
+
+
+ナビゲーション時に、ページがレンダリングされるまでユーザーにはすぐにレイアウトと[読み込み状態](#creating-meaningful-loading-states)が表示されます。新しいコンテンツはレンダリング完了後に自動的にスワップされます。
+
+
+
+舞台裏では、`loading.js`は`layout.js`内にネストされ、`page.js`ファイルとその下の子を自動的に``境界でラップします。
+
+
+
+このアプローチはルートセグメント(レイアウトとページ)に対してうまく機能しますが、より細かいストリーミングには``を使用できます。
+
+### ``を使用する {#with-suspense}
+
+``を使用すると、ページのどの部分をストリームするかをより細かく制御できます。例えば、``境界外のページコンテンツを即座に表示し、境界内のブログ投稿リストをストリームすることができます。
+
+
+
+
+```tsx title="app/blog/page.tsx" switcher
+import { Suspense } from 'react'
+import BlogList from '@/components/BlogList'
+import BlogListSkeleton from '@/components/BlogListSkeleton'
+
+export default function BlogPage() {
+ return (
+
+ {/* このコンテンツは即座にクライアントに送信されます */}
+
+ ブログへようこそ
+ 最新の投稿を以下でお読みください。
+
+
+ {/* 境界でラップされたコンテンツはストリームされます */}
+ }>
+
+
+
+
+ )
+}
+```
+
+
+
+
+```jsx title="app/blog/page.js" switcher
+import { Suspense } from 'react'
+import BlogList from '@/components/BlogList'
+import BlogListSkeleton from '@/components/BlogListSkeleton'
+
+export default function BlogPage() {
+ return (
+
+ {/* このコンテンツは即座にクライアントに送信されます */}
+
+ ブログへようこそ
+ 最新の投稿を以下でお読みください。
+
+
+ {/* 境界でラップされたコンテンツはストリームされます */}
+ }>
+
+
+
+
+ )
+}
+```
+
+
+
+
+### 意味のある読み込み状態を作成する {#creating-meaningful-loading-states}
+
+インスタントロード状態は、ナビゲーション後にユーザーに即座に表示されるフォールバックUIです。最高のユーザー体験のために、意味があり、アプリが応答しているとユーザーに理解させるような読み込み状態を設計することをお勧めします。例えば、スケルトンやスピナー、または将来の画面のカバーフォトやタイトルなどの小さいが意味のある部分を使用できます。
+
+開発中は、[React Devtools](https://react.dev/learn/react-developer-tools)を使用してコンポーネントの読み込み状態をプレビューおよびインスペクトすることができます。
diff --git a/docs/01-app/01-getting-started/index.mdx b/docs/01-app/01-getting-started/index.mdx
index aefaba98..e03727d6 100644
--- a/docs/01-app/01-getting-started/index.mdx
+++ b/docs/01-app/01-getting-started/index.mdx
@@ -1,9 +1,4 @@
---
-title: 'Getting Started - App Router'
-sidebar_label: 'Getting Started'
-description: 'Next.jsのApp Routerを使ってフルスタックWebアプリケーションを作成する方法を学びましょう。'
+title: '開始する'
+description: 'Next.js App RouterでフルスタックのWebアプリケーションを作成する方法を学びます。'
---
-
-{/* NOTE: この は手動で追加しています。自動翻訳等で更新され消えてしまった場合、必要に応じて再度追加しなおしてください */}
-
-
diff --git a/docs/01-app/02-building-your-application/01-routing/04-linking-and-navigating.mdx b/docs/01-app/02-building-your-application/01-routing/04-linking-and-navigating.mdx
index 795afc39..e2b043ed 100644
--- a/docs/01-app/02-building-your-application/01-routing/04-linking-and-navigating.mdx
+++ b/docs/01-app/02-building-your-application/01-routing/04-linking-and-navigating.mdx
@@ -1,26 +1,26 @@
---
title: 'リンクとナビゲーション'
-description: 'Next.jsにおけるナビゲーションの仕組みと、LinkコンポーネントとuseRouterフックの使用方法を学びます'
+description: 'Next.jsでのナビゲーションの仕組みや、Linkコンポーネントと`useRouter`フックの使い方を学びましょう。'
related:
links:
- 'app/building-your-application/caching'
- 'app/api-reference/config/typescript'
---
-Next.jsでは、ルート間をナビゲートする方法は4つあります:
+Next.jsでルート間をナビゲートする方法は4つあります:
-- [`` コンポーネント](#link-component)を使用する
-- [`useRouter` フック](#userouter-hook)を使用する([Client Components](/docs/app/building-your-application/rendering/client-components))
-- [`redirect` 関数](#redirect-function)を使用する([Server Components](/docs/app/building-your-application/rendering/server-components))
-- ネイティブな[History API](#using-the-native-history-api)を使用する
+- [`` コンポーネントを使用する](#link-component)
+- [`useRouter` フックを使用する](#userouter-hook)([Client Components](/docs/app/building-your-application/rendering/client-components))
+- [`redirect` 関数を使用する](#redirect-function)([Server Components](/docs/app/building-your-application/rendering/server-components))
+- ネイティブの[History APIを使用する](#using-the-native-history-api)
-このページでは、それぞれのオプションの使用方法について説明し、ナビゲーションの仕組みを詳しく見ていきます。
+このページではこれらのオプションを使用する方法と、ナビゲーションがどのように機能するのかを詳しく説明します。
## `` コンポーネント {#link-component}
-``は、HTMLの``タグを拡張し、[プリフェッチ](#2-prefetching)とクライアントサイドでのルート間ナビゲーションを提供する組み込みのコンポーネントです。Next.jsでルート間をナビゲートする主な推奨方法です。
+``は、HTMLの``タグを拡張して、[プリフェッチ](#2-prefetching)とルート間のクライアントサイドナビゲーションを提供する組み込みのコンポーネントです。Next.jsにおけるルート間をナビゲートするための主要で推奨される方法です。
-`next/link`からインポートし、`href`プロップをコンポーネントに渡すことで使用できます:
+`next/link`からインポートし、コンポーネントに`href`プロップを渡して使用できます:
@@ -47,11 +47,11 @@ export default function Page() {
-``に渡す他のオプションの`props`もあります。詳細は[APIリファレンス](/docs/app/api-reference/components/link)をご覧ください。
+その他のオプションのプロップを``に渡すことができます。詳細は[APIリファレンス](/docs/app/api-reference/components/link)をご覧ください。
## `useRouter()` フック {#userouter-hook}
-`useRouter`フックを使うと、[Client Components](/docs/app/building-your-application/rendering/client-components)からプログラム的にルートを変更できます。
+`useRouter` フックを使用すると、[Client Components](/docs/app/building-your-application/rendering/client-components)からプログラムでルートを変更できます。
```jsx title="app/page.js"
'use client'
@@ -69,13 +69,13 @@ export default function Page() {
}
```
-`useRouter`メソッドの完全なリストについては、[APIリファレンス](/docs/app/api-reference/functions/use-router)を参照してください。
+`useRouter`メソッドの全リストについては、[APIリファレンス](/docs/app/api-reference/functions/use-router)を参照してください。
-> **推奨事項:** 特定の要件がない限り、ルート間をナビゲートするためには``コンポーネントを使用してください。
+> **推奨**:特定の要件がない限り、ルート間のナビゲーションには``コンポーネントを使用することをお勧めします。
## `redirect` 関数 {#redirect-function}
-[Server Components](/docs/app/building-your-application/rendering/server-components)の場合、代わりに`redirect`関数を使用してください。
+[Server Components](/docs/app/building-your-application/rendering/server-components)の場合、代わりに`redirect`関数を使用します。
@@ -89,12 +89,21 @@ async function fetchTeam(id: string) {
return res.json()
}
-export default async function Profile({ params }: { params: { id: string } }) {
- const team = await fetchTeam(params.id)
- if (!team) {
+export default async function Profile({
+ params,
+}: {
+ params: Promise<{ id: string }>
+}) {
+ const id = (await params).id
+ if (!id) {
redirect('/login')
}
+ const team = await fetchTeam(id)
+ if (!team) {
+ redirect('/join')
+ }
+
// ...
}
```
@@ -112,11 +121,16 @@ async function fetchTeam(id) {
}
export default async function Profile({ params }) {
- const team = await fetchTeam(params.id)
- if (!team) {
+ const id = (await params).id
+ if (!id) {
redirect('/login')
}
+ const team = await fetchTeam(id)
+ if (!team) {
+ redirect('/join')
+ }
+
// ...
}
```
@@ -124,25 +138,25 @@ export default async function Profile({ params }) {
-> **知っておいてよい点**:
+> **知っておくと良い情報**:
>
-> - `redirect`はデフォルトで307(Temporary Redirect)ステータスコードを返します。サーバーアクションで使用した場合、303(See Other)を返します。これは、POSTリクエストの結果として成功ページにリダイレクトする際によく使用されます。
-> - `redirect`は内部的にエラーを投げるので、`try/catch`ブロックの外で呼び出されるべきです。
-> - `redirect`はクライアントコンポーネントでのレンダリングプロセス中に呼び出せますが、イベントハンドラ内では使用できません。代わりに[`useRouter`フック](#userouter-hook)を使用できます。
-> - `redirect`は絶対URLも受け入れ、外部リンクにリダイレクトするために使用できます。
-> - レンダープロセスの前にリダイレクトしたい場合は、[`next.config.js`](/docs/app/building-your-application/routing/redirecting#redirects-in-nextconfigjs)や[ミドルウェア](/docs/app/building-your-application/routing/redirecting#nextresponseredirect-in-middleware)を使用してください。
+> - `redirect`はデフォルトで307(Temporary Redirect)のステータスコードを返します。Server Actionで使用する場合は303(See Other)を返し、これは通常POSTリクエストの結果として成功ページにリダイレクトするために使用されます。
+> - `redirect`は内部的にエラーをスローするので、`try/catch`ブロックの外で呼び出す必要があります。
+> - `redirect`はClient Componentsのレンダリングプロセス中にも呼び出せますが、イベントハンドラでは呼び出せません。その場合は[`useRouter` フック](#userouter-hook)を使用できます。
+> - `redirect`は絶対URLも受け入れることができ、外部リンクへのリダイレクトに使用することができます。
+> - レンダープロセスの前にリダイレクトを行いたい場合は、[`next.config.js`](/docs/app/building-your-application/routing/redirecting#redirects-in-nextconfigjs)または[Middleware](/docs/app/building-your-application/routing/redirecting#nextresponseredirect-in-middleware)を使用します。
-より詳しい情報は、[`redirect` APIリファレンス](/docs/app/api-reference/functions/redirect)を参照してください。
+詳細は[`redirect`のAPIリファレンス](/docs/app/api-reference/functions/redirect)をご覧ください。
-## ネイティブなHistory APIを使用する {#using-the-native-history-api}
+## ネイティブのHistory APIを使用する {#using-the-native-history-api}
-Next.jsでは、ネイティブの[`window.history.pushState`](https://developer.mozilla.org/en-US/docs/Web/API/History/pushState)と[`window.history.replaceState`](https://developer.mozilla.org/en-US/docs/Web/API/History/replaceState)メソッドを使用して、ページをリロードせずにブラウザの履歴スタックを更新することができます。
+Next.jsでは、ネイティブの[`window.history.pushState`](https://developer.mozilla.org/en-US/docs/Web/API/History/pushState)と[`window.history.replaceState`](https://developer.mozilla.org/en-US/docs/Web/API/History/replaceState)メソッドを使用してページをリロードせずにブラウザの履歴スタックを更新することができます。
-`pushState`と`replaceState`の呼び出しはNext.js Routerと統合され、[`usePathname`](/docs/app/api-reference/functions/use-pathname)と[`useSearchParams`](/docs/app/api-reference/functions/use-search-params)と同期できます。
+`pushState`と`replaceState`の呼び出しは、Next.jsのRouterに統合されており、[`usePathname`](/docs/app/api-reference/functions/use-pathname)や[`useSearchParams`](/docs/app/api-reference/functions/use-search-params)と同期することができます。
### `window.history.pushState` {#window-history-pushstate}
-ブラウザの履歴スタックに新しいエントリを追加するために使用します。ユーザーは前の状態に戻ることができます。例えば、製品リストをソートするには:
+新しいエントリをブラウザの履歴スタックに追加するために使用します。ユーザーは前の状態に戻ることができます。たとえば、製品のリストを並べ替える場合:
@@ -201,7 +215,7 @@ export default function SortProducts() {
### `window.history.replaceState` {#window-history-replacestate}
-ブラウザの履歴スタックの現在のエントリを置き換えるために使用します。ユーザーは前の状態に戻ることができません。例えば、アプリケーションのロケールを切り替えるには:
+現在のエントリを履歴スタック上で置き換えるために使用します。ユーザーは前の状態に戻ることができません。たとえば、アプリケーションのロケールを切り替える場合:
@@ -215,7 +229,7 @@ export function LocaleSwitcher() {
const pathname = usePathname()
function switchLocale(locale: string) {
- // e.g. '/en/about' or '/fr/contact'
+ // 例: '/en/about' や '/fr/contact'
const newPath = `/${locale}${pathname}`
window.history.replaceState(null, '', newPath)
}
@@ -260,67 +274,67 @@ export function LocaleSwitcher() {
## ルーティングとナビゲーションの仕組み {#how-routing-and-navigation-works}
-App Routerは、ルーティングとナビゲーションにハイブリッドアプローチを採用しています。サーバー上では、アプリケーションコードがルートセグメントによって自動的に[コード分割](#1-code-splitting)され、クライアント側では、Next.jsがルートセグメントを[プリフェッチ](#2-prefetching)し[キャッシュ](#3-caching)します。つまり、ユーザーが新しいルートに移動しても、ブラウザはページをリロードせず、変更されたルートセグメントだけが再レンダリングされます。これにより、ナビゲーション体験とパフォーマンスが向上します。
+App Routerはルーティングとナビゲーションにハイブリッドなアプローチを採用しています。サーバー上で、アプリケーションコードはルートセグメントによって自動的に[コード分割](#1-code-splitting)されます。そしてクライアント上で、Next.jsはルートセグメントを[プリフェッチ](#2-prefetching)して[キャッシュ](#3-caching)します。これにより、ユーザーが新しいルートにナビゲートするとき、ブラウザがページをリロードすることなく、変更されたルートセグメントのみが再レンダリングされ、ナビゲーションの体験とパフォーマンスが向上します。
### 1. コード分割 {#1-code-splitting}
-コード分割により、アプリケーションコードを小さなバンドルに分割し、ブラウザでダウンロードおよび実行できるようになります。これにより、データ転送量と各リクエストの実行時間が短縮され、パフォーマンスが向上します。
+コード分割により、アプリケーションコードを小さなバンドルに分割し、ブラウザがダウンロードして実行することができます。これにより、データ転送量とリクエストごとの実行時間が削減され、パフォーマンスが向上します。
-[Server Components](/docs/app/building-your-application/rendering/server-components)により、アプリケーションコードはルートセグメントによって自動的にコード分割されます。これにより、ナビゲーション時には現在のルートに必要なコードのみが読み込まれます。
+[Server Components](/docs/app/building-your-application/rendering/server-components)により、アプリケーションコードがルートセグメントごとに自動的にコード分割されます。これにより、ナビゲーション時に必要なコードのみがロードされます。
### 2. プリフェッチ {#2-prefetching}
-プリフェッチは、ユーザーが訪問する前にバックグラウンドでルートを事前にロードする方法です。
+プリフェッチは、ユーザーが訪れる前にバックグラウンドでルートをプリロードする方法です。
-Next.jsではルートがプリフェッチされる方法は2つあります:
+Next.jsにはプリフェッチの方法が2つあります:
-- **`` コンポーネント**:ユーザーのビューポートに表示されると、ルートは自動的にプリフェッチされます。プリフェッチは、ページが最初にロードされるときや、スクロールによってビューに入るときに行われます。
-- **`router.prefetch()`**:`useRouter`フックを使用して、プログラム的にルートをプリフェッチできます。
+- **``コンポーネント**:ユーザーのビューポートに表示されると、ルートが自動的にプリフェッチされます。プリフェッチは、ページが最初にロードされるときや、スクロールによってビューに入るときに行われます。
+- **`router.prefetch()`**:`useRouter`フックを使用してプログラムでルートをプリフェッチできます。
-``のデフォルトのプリフェッチ動作(つまり、`prefetch`プロップが未指定または`null`に設定されている場合)は、[`loading.js`](/docs/app/api-reference/file-conventions/loading)の使用に応じて異なります。共有レイアウトのみがプリフェッチされ、「コンポーネントのツリー」がレンダリングされる最初の`loading.js`ファイルまでキャッシュされます。これにより、動的ルート全体をフェッチするコストが削減され、即時の[ローディング状態](/docs/app/building-your-application/routing/loading-ui-and-streaming#instant-loading-states)がユーザーにより良い視覚的フィードバックを提供します。
+``のデフォルトのプリフェッチ動作(つまり、`prefetch`プロップが指定されていないか、`null`に設定されている場合)は、[`loading.js`](/docs/app/api-reference/file-conventions/loading)の使用状況に応じて異なります。レンダリングされた"tree"のコンポーネントで最初の`loading.js`ファイルまでの共通レイアウトのみがプリフェッチされ、`30秒`間キャッシュされます。これにより、完全な動的ルートをフェッチするコストが削減され、より良い視覚フィードバックをユーザーに提供するための[即時読み込み状態](/docs/app/building-your-application/routing/loading-ui-and-streaming#instant-loading-states)を表示できます。
-プリフェッチを無効にするには、`prefetch`プロップを`false`に設定します。あるいは、`prefetch`プロップを`true`に設定して、ローディングの境界を超えて完全なページデータをプリフェッチすることができます。
+プリフェッチを無効にするには、`prefetch`プロップを`false`に設定します。あるいは、ロード境界を超えた完全なページデータのプリフェッチを行うには、`prefetch`プロップを`true`に設定します。
-詳細は[`` APIリファレンス](/docs/app/api-reference/components/link)を参照してください。
+詳細は[``APIリファレンス](/docs/app/api-reference/components/link)をご覧ください。
-> **知っておいてよい点**:
+> **知っておくと良い情報**:
>
-> - プリフェッチは開発環境では有効ではなく、本番環境でのみ有効です。
+> - プリフェッチは開発時には有効ではなく、本番環境でのみ有効です。
### 3. キャッシュ {#3-caching}
-Next.jsには**インメモリーのクライアントサイドキャッシュ**があり、[Router Cache](/docs/app/building-your-application/caching#client-side-router-cache)と呼ばれます。ユーザーがアプリをナビゲートすると、[プリフェッチされた](#2-prefetching)ルートセグメントと訪問したルートのReactサーバーコンポーネントペイロードがキャッシュに保存されます。
+Next.jsは、[Router Cache](/docs/app/building-your-application/caching#client-side-router-cache)と呼ばれるクライアント側のインメモリキャッシュを持っています。ユーザーがアプリ内をナビゲートする際、[プリフェッチ](#2-prefetching)されたルートセグメントと訪問済みのルートのReact Server Component Payloadがキャッシュに保存されます。
-つまり、ナビゲーション時には、可能な限りキャッシュが再利用され、新たなサーバーへのリクエストを行う代わりに、キャッシュが使用されます。これにより、リクエスト数とデータ転送量が削減され、パフォーマンスが向上します。
+これにより、ナビゲーション時に可能な限りキャッシュが再利用され、サーバーへの新しいリクエストが行われなくなり、パフォーマンスが向上し、リクエスト数とデータ転送量が削減されます。
-[Router Cache](/docs/app/building-your-application/caching#client-side-router-cache)の仕組みと構成方法についての詳細をご覧ください。
+[Router Cache](/docs/app/building-your-application/caching#client-side-router-cache)の仕組みや設定方法の詳細をご覧ください。
-### 4. 部分的なレンダリング {#4-partial-rendering}
+### 4. 部分レンダリング {#4-partial-rendering}
-部分的なレンダリングとは、クライアント上のナビゲーションで変更されるルートセグメントのみが再レンダリングされ、共有セグメントは保持されることを意味します。
+部分レンダリングとは、ナビゲーション時に変更されたルートセグメントのみがクライアント上で再レンダリングされ、共有されているセグメントは保持されることを意味します。
-たとえば、2つの兄弟ルート`/dashboard/settings`と`/dashboard/analytics`間を移動する際には、`settings`ページがアンマウントされ、`analytics`ページが新しい状態でマウントされ、共有の`dashboard`レイアウトが保存されます。この動作は、同じ動的セグメント上の2つのルート間でも発生します。たとえば、`/blog/[slug]/page`および`/blog/first`から`/blog/second`へのナビゲーション時です。
+例えば、2つの兄弟ルート`/dashboard/settings`と`/dashboard/analytics`間でナビゲートすると、`settings`ページがアンマウントされ、`analytics`ページが新しい状態でマウントされ、共有された`dashboard`レイアウトが保持されます。この動作は、同じ動的セグメント上の2つのルート間でも見られます。例えば、`/blog/[slug]/page`と`/blog/first`から`/blog/second`へのナビゲーションです。
-部分的なレンダリングがない場合、各ナビゲーションはクライアントですべてのページを再レンダリングさせます。変更されるセグメントのみをレンダリングすることで、データ転送量と実行時間が削減され、パフォーマンスが向上します。
+部分レンダリングがなければ、それぞれのナビゲーションでクライアント上で完全なページが再レンダリングされることになります。変更されたセグメントのみをレンダリングすることで、データ転送量と実行時間が削減され、パフォーマンスが向上します。
### 5. ソフトナビゲーション {#5-soft-navigation}
-ブラウザはページ間のナビゲーションで「ハードナビゲーション」を行います。Next.jsのApp Routerは、ページ間での「ソフトナビゲーション」を可能にし、変更されたルートセグメントのみが再レンダリングされるようにします(部分的なレンダリング)。これにより、クライアントのReact stateがナビゲーション中に保存されます。
+ブラウザはページ間のナビゲーションで「ハードナビゲーション」を行います。Next.jsのApp Routerはページ間の「ソフトナビゲーション」を可能にし、変更されたルートセグメントのみが再レンダリングされる(部分レンダリング)ようにします。これにより、クライアントのReactの状態がナビゲーション中に保持されます。
-### 6. 前後のナビゲーション {#6-back-and-forward-navigation}
+### 6. 戻る・進むナビゲーション {#6-back-and-forward-navigation}
-デフォルトでは、Next.jsは前後のナビゲーションでスクロール位置を維持し、[Router Cache](/docs/app/building-your-application/caching#client-side-router-cache)のルートセグメントを再利用します。
+デフォルトでは、Next.jsは戻る・進むナビゲーションのためにスクロール位置を保持し、[Router Cache](/docs/app/building-your-application/caching#client-side-router-cache)でルートセグメントを再利用します。
### 7. `pages/`と`app/`間のルーティング {#7-routing-between-pages-and-app}
-`pages/`から`app/`へのインクリメンタル移行時に、Next.jsルーターは両者間のハードナビゲーションを自動的に処理します。`pages/`から`app/`への移行を検出するために、アプリルートの確率的チェックを活用したクライアントルーターフィルターがありますが、これは稀に偽陽性を引き起こす可能性があります。通常、こうした事例は非常に稀ですが、偽陽性の確率は0.01%に設定されています。この確率は、`next.config.js`の`experimental.clientRouterFilterAllowedRate`オプションを通じてカスタマイズできます。偽陽性率を下げると、クライアントバンドル内の生成されたフィルターのサイズが増加することに注意してください。
+`pages/`から`app/`への段階的な移行中に、Next.jsのルーターは自動的に両者間のハードナビゲーションを処理します。`pages/`から`app/`への移行を検出するために、クライアントルーターのフィルターはアプリルートの確率的チェックを活用しており、時折誤検出が発生することがあります。デフォルトでは、このような発生は非常に稀であるべきで、誤検出の確率は0.01%に設定しています。この確率は`next.config.js`の`experimental.clientRouterFilterAllowedRate`オプションでカスタマイズできます。誤検出率を下げると、クライアントバンドルで生成されるフィルターのサイズが増加することに注意してください。
-完全にこの処理を無効にして、`pages/`と`app/`間のルーティングを手動で管理したい場合は、`next.config.js`で`experimental.clientRouterFilter`を`false`に設定できます。この機能が無効化されると、appルートと重なるページの動的ルートがデフォルトでは正しくナビゲートされません。
+また、`pages/`と`app/`間のルーティングを手動で管理したい場合は、`next.config.js`で`experimental.clientRouterFilter`を`false`に設定して、この処理を完全に無効にすることも可能です。この機能が無効化された場合、appルートと重複するpagesの動的ルートはデフォルトで適切にナビゲートされません。
diff --git a/docs/01-app/02-building-your-application/01-routing/05-error-handling.mdx b/docs/01-app/02-building-your-application/01-routing/05-error-handling.mdx
index 15ef478b..252d7af7 100644
--- a/docs/01-app/02-building-your-application/01-routing/05-error-handling.mdx
+++ b/docs/01-app/02-building-your-application/01-routing/05-error-handling.mdx
@@ -1,28 +1,28 @@
---
title: 'エラーハンドリング'
-description: '予期されたエラーの表示方法と未キャッチ例外のハンドリングについて学びます。'
+description: '予想されるエラーを表示し、捕捉されない例外を処理する方法を学びます。'
related:
links:
- app/api-reference/file-conventions/error
---
-エラーは2つのカテゴリに分けることができます:**予期されたエラー** と **未キャッチ例外**:
+エラーは2つのカテゴリに分けられます:**予想されるエラー**と**捕捉されない例外**です;
-- **予期されたエラーを戻り値としてモデル化する**:Server Actionsで予期されたエラーには`try`/`catch`を使用しないでください。これらのエラーを管理し、クライアントに返すには`useFormState`を使います。
-- **予期しないエラーにはエラーボーダリを使用する**:予期しないエラーを処理し、フォールバックUIを提供するには、`error.tsx`および`global-error.tsx`ファイルを使用してエラーボーダリを実装します。
+- **予想されるエラーは戻り値としてモデリングする**:Server Actions では予想されるエラーに `try`/`catch` を使用することは避けます。これらのエラーを管理し、クライアントに返すために [`useActionState`](https://react.dev/reference/react/useActionState) を使用します。
+- **予期しないエラーにはエラーボーダリーを使用する**:予期しないエラーを処理し、フォールバック UI を提供するために、`error.tsx` および `global-error.tsx` ファイルを使用してエラーボーダリーを実装します。
-## 予期されたエラーの処理 {#handling-expected-errors}
+## 予想されるエラーの処理 {#handling-expected-errors}
-予期されたエラーとは、[サーバー側フォームバリデーション](/docs/app/building-your-application/data-fetching/server-actions-and-mutations#server-side-form-validation)やリクエストの失敗など、アプリケーションの通常の操作中に発生する可能性があるエラーです。これらのエラーは明示的に処理し、クライアントに返すべきです。
+予想されるエラーは、通常のアプリケーション操作中に発生する可能性のあるエラーです。たとえば、[サーバーサイドのフォームバリデーション](/docs/app/building-your-application/data-fetching/server-actions-and-mutations#server-side-form-validation) や失敗したリクエストなどです。これらのエラーは明示的に処理され、クライアントに返されるべきです。
-### Server Actionsからの予期されたエラーを処理する {#handling-expected-errors-from-server-actions}
+### Server Actions からの予想されるエラーの処理 {#handling-expected-errors-from-server-actions}
-`useFormState`フックを使用して、Server Actionsの状態を管理し、エラーを処理します。このアプローチは`try`/`catch`ブロックを避け、予期されたエラーを例外としてスローするのではなく、戻り値としてモデル化します。
+`useActionState` フックを使用して、サーバーアクションの状態を管理します。これにはエラー処理も含まれます。このアプローチでは、予想されるエラーに対し `try`/`catch` ブロックを使用せず、それらを例外としてスローするのではなく、戻り値としてモデリングします。
-
+
-```tsx title="app/actions.ts" switcher
+```ts title="app/actions.ts" switcher
'use server'
import { redirect } from 'next/navigation'
@@ -32,7 +32,7 @@ export async function createUser(prevState: any, formData: FormData) {
const json = await res.json()
if (!res.ok) {
- return { message: '正しいメールアドレスを入力してください' }
+ return { message: '有効なメールアドレスを入力してください' }
}
redirect('/dashboard')
@@ -40,9 +40,9 @@ export async function createUser(prevState: any, formData: FormData) {
```
-
+
-```jsx title="app/actions.js" switcher
+```js title="app/actions.js" switcher
'use server'
import { redirect } from 'next/navigation'
@@ -52,7 +52,7 @@ export async function createUser(prevState, formData) {
const json = await res.json()
if (!res.ok) {
- return { message: '正しいメールアドレスを入力してください' }
+ return { message: '有効なメールアドレスを入力してください' }
}
redirect('/dashboard')
@@ -62,7 +62,7 @@ export async function createUser(prevState, formData) {
-その後、`useFormState`フックにアクションを渡し、返される`state`を使用してエラーメッセージを表示できます。
+次に、アクションを `useActionState` フックに渡し、返された `state` を使用してエラーメッセージを表示します。
@@ -70,7 +70,7 @@ export async function createUser(prevState, formData) {
```tsx title="app/ui/signup.tsx" highlight={11,18-20} switcher
'use client'
-import { useFormState } from 'react-dom'
+import { useActionState } from 'react'
import { createUser } from '@/app/actions'
const initialState = {
@@ -78,7 +78,7 @@ const initialState = {
}
export function Signup() {
- const [state, formAction] = useFormState(createUser, initialState)
+ const [state, formAction, pending] = useActionState(createUser, initialState)
return (
)
}
@@ -98,7 +98,7 @@ export function Signup() {
```jsx title="app/ui/signup.js" highlight={11,18-20} switcher
'use client'
-import { useFormState } from 'react-dom'
+import { useActionState } from 'react'
import { createUser } from '@/app/actions'
const initialState = {
@@ -106,7 +106,7 @@ const initialState = {
}
export function Signup() {
- const [state, formAction] = useFormState(createUser, initialState)
+ const [state, formAction, pending] = useActionState(createUser, initialState)
return (
)
}
@@ -123,13 +123,11 @@ export function Signup() {
-> **Good to know**: これらの例は、Next.js App Routerと一緒にバンドルされているReactの`useFormState`フックを使用しています。React 19を使用している場合は、`useActionState`を代わりに使用してください。詳細については[Reactドキュメント](https://react.dev/reference/react/useActionState)を参照してください。
-
返された状態を使用して、クライアントコンポーネントからトーストメッセージを表示することもできます。
-### Server Componentsからの予期されたエラーを処理する {#handling-expected-errors-from-server-components}
+### サーバーコンポーネントからの予想されるエラーの処理 {#handling-expected-errors-from-server-components}
-Server Component内でデータを取得する際には、応答を利用してエラーメッセージを条件付けてレンダリングするか、[`redirect`](/docs/app/building-your-application/routing/redirecting#redirect-function)を使用してください。
+Server Component 内でデータをフェッチする際には、レスポンスを利用してエラーメッセージを条件付きでレンダリングするか、[`redirect`](/docs/app/building-your-application/routing/redirecting#redirect-function) することができます。
@@ -166,25 +164,25 @@ export default async function Page() {
-## 未キャッチ例外 {#uncaught-exceptions}
+## 捕捉されない例外 {#uncaught-exceptions}
-未キャッチ例外は、アプリケーションの通常のフロー中に発生するはずのないバグや問題を示す予期しないエラーです。これらはエラーをスローすることで処理され、エラーボーダリによってキャッチされます。
+捕捉されない例外は、アプリケーションの通常の流れの中で発生することが予期されないバグや問題を示すエラーです。これらはエラーとしてスローされ、エラーボーダリーによって捕捉されるべきです。
-- **共通:** root レイアウト下の未キャッチエラーを`error.js`で処理します。
-- **オプション:** ネストされた`error.js`ファイル(例:`app/dashboard/error.js`)で詳細な未キャッチエラーを処理します。
-- **まれ:** root レイアウトで未キャッチエラーを`global-error.js`で処理します。
+- **一般的な処理**: root レイアウト以下で、`error.js` で捕捉されなかったエラーを処理します。
+- **オプショナル**: ネストされた `error.js` ファイルで細かく捕捉されなかったエラーを処理します(例:`app/dashboard/error.js`)。
+- **非一般的な処理**: root レイアウト内で捕捉されなかったエラーを `global-error.js` で処理します。
-### エラーボーダリを使用する {#using-error-boundaries}
+### エラーボーダリーの使用 {#using-error-boundaries}
-Next.jsはエラーボーダリを使用して未キャッチ例外を処理します。エラーボーダリはそれらの子コンポーネント内のエラーをキャッチし、クラッシュしたコンポーネントツリーの代わりにフォールバックUIを表示します。
+Next.js はエラーボーダリーを使用して捕捉されない例外を処理します。エラーボーダリーは、その子コンポーネント内のエラーをキャッチし、クラッシュしたコンポーネントツリーの代わりにフォールバック UI を表示します。
-ルートセグメント内に`error.tsx`ファイルを追加し、Reactコンポーネントをエクスポートすることでエラーボーダリを作成します:
+ルートセグメント内に `error.tsx` ファイルを追加し、React コンポーネントをエクスポートしてエラーボーダリーを作成します:
```tsx title="app/dashboard/error.tsx" switcher
-'use client' // エラーボーダリはClient Componentsである必要があります
+'use client' // エラーボーダリーはクライアントコンポーネントである必要があります
import { useEffect } from 'react'
@@ -196,20 +194,20 @@ export default function Error({
reset: () => void
}) {
useEffect(() => {
- // エラーをエラーレポートサービスにログします
+ // エラーをエラーレポーティングサービスにログします
console.error(error)
}, [error])
return (
-
何かがうまくいきませんでした!
+ 問題が発生しました!
)
@@ -220,26 +218,26 @@ export default function Error({
```jsx title="app/dashboard/error.js" switcher
-'use client' // エラーボーダリはClient Componentsである必要があります
+'use client' // エラーボーダリーはクライアントコンポーネントである必要があります
import { useEffect } from 'react'
export default function Error({ error, reset }) {
useEffect(() => {
- // エラーをエラーレポートサービスにログします
+ // エラーをエラーレポーティングサービスにログします
console.error(error)
}, [error])
return (
-
何かがうまくいきませんでした!
+ 問題が発生しました!
)
@@ -249,11 +247,11 @@ export default function Error({ error, reset }) {
-エラーを親エラーボーダリまで伝播させたい場合は、`error`コンポーネントのレンダリング時に`throw`することができます。
+親エラーボーダリーにエラーをバブルアップさせたい場合は、`error` コンポーネントをレンダリングする際に `throw` できます。
-### ネストされたルートでのエラー処理 {#handling-errors-in-nested-routes}
+### ネストされたルート内のエラー処理 {#handling-errors-in-nested-routes}
-エラーは最も近い親エラーボーダリに伝播します。これにより、[ルート階層](/docs/app/building-your-application/routing#component-hierarchy)の異なるレベルに`error.tsx`ファイルを配置することで詳細なエラーハンドリングが可能になります。
+エラーは最も近い親エラーボーダリーまでバブルアップします。これにより、[ルート階層](/docs/app/building-your-application/routing#component-hierarchy)の異なるレベルに `error.tsx` ファイルを配置することで、細かいエラーハンドリングが可能になります。
`および``タグを定義する必要があります。
+非一般的ですが、root アプリディレクトリにある `app/global-error.js` を使用して、root レイアウトでエラーを処理できます。これは、[国際化](/docs/app/building-your-application/routing/internationalization) を活用している場合でもです。グローバルエラー UI は独自の `` および `` タグを定義する必要があります。アクティブなとき、root レイアウトまたはテンプレートを置き換えるためです。
```tsx title="app/global-error.tsx" switcher
-'use client' // エラーボーダリはClient Componentsである必要があります
+'use client' // エラーボーダリーはクライアントコンポーネントである必要があります
export default function GlobalError({
error,
@@ -281,11 +279,11 @@ export default function GlobalError({
reset: () => void
}) {
return (
- // global-errorにはhtmlとbodyタグが含まれていなければなりません
+ // global-error はhtmlとbodyタグを含む必要があります
- 何かがうまくいきませんでした!
-
+ 問題が発生しました!
+
)
@@ -296,15 +294,15 @@ export default function GlobalError({
```jsx title="app/global-error.js" switcher
-'use client' // エラーボーダリはClient Componentsである必要があります
+'use client' // エラーボーダリーはクライアントコンポーネントである必要があります
export default function GlobalError({ error, reset }) {
return (
- // global-errorにはhtmlとbodyタグが含まれていなければなりません
+ // global-error はhtmlとbodyタグを含む必要があります
- 何かがうまくいきませんでした!
-
+ 問題が発生しました!
+
)
diff --git a/docs/01-app/02-building-your-application/01-routing/07-redirecting.mdx b/docs/01-app/02-building-your-application/01-routing/07-redirecting.mdx
index 8fe84611..b855a940 100644
--- a/docs/01-app/02-building-your-application/01-routing/07-redirecting.mdx
+++ b/docs/01-app/02-building-your-application/01-routing/07-redirecting.mdx
@@ -1,6 +1,6 @@
---
-title: 'リダイレクト'
-description: 'Next.jsでリダイレクトを処理するさまざまな方法を学びます。'
+title: 'リダイレクション'
+description: 'Next.js でリダイレクトを処理するさまざまな方法を学びましょう。'
related:
links:
- 'app/api-reference/functions/redirect'
@@ -9,27 +9,27 @@ related:
- 'app/api-reference/config/next-config-js/redirects'
---
-Next.jsでリダイレクトを処理する方法はいくつかあります。このページでは、利用可能な各オプション、ユースケース、および大量のリダイレクトを管理する方法について説明します。
+Next.js でリダイレクトを処理する方法はいくつかあります。このページでは、それぞれのオプション、使用ケース、および大量のリダイレクトを管理する方法を説明します。
-| API | 目的 | 使用場所 | ステータスコード |
-| -------------------------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------- | ----------------------------------- |
-| [`redirect`](#redirect-function) | ミューテーションまたはイベント後にユーザーをリダイレクトする | Server Components、Server Actions、Route Handlers | 307(仮)または303(Server Action) |
-| [`permanentRedirect`](#permanentredirect-function) | ミューテーションまたはイベント後にユーザーをリダイレクトする | Server Components、Server Actions、Route Handlers | 308(永続) |
-| [`useRouter`](#userouter-hook) | クライアントサイドのナビゲーションを実行する | Client Componentsのイベントハンドラーで | 該当なし |
-| [`next.config.js`内の`redirects`](#redirects-in-nextconfigjs) | パスに基づいて受信リクエストをリダイレクトする | `next.config.js`ファイル | 307(仮)または308(永続) |
-| [`NextResponse.redirect`](#nextresponseredirect-in-middleware) | 条件に基づいて受信リクエストをリダイレクトする | ミドルウェア | 任意 |
+| API | 目的 | 実行場所 | ステータスコード |
+| -------------------------------------------------------------- | -------------------------------------------------------- | ----------------------------------------------- | --------------------------------------- |
+| [`redirect`](#redirect-function) | ミューテーションやイベント後にユーザーをリダイレクトする | server component、server actions、route handler | 307 (一時的) または 303 (server action) |
+| [`permanentRedirect`](#permanentredirect-function) | ミューテーションやイベント後にユーザーをリダイレクトする | server component、server actions、route handler | 308 (永続的) |
+| [`useRouter`](#userouter-hook) | クライアントサイドのナビゲーションを実行 | client component のイベントハンドラー | N/A |
+| [`redirects` in `next.config.js`](#redirects-in-nextconfigjs) | パスに基づいて受信リクエストをリダイレクトする | `next.config.js` ファイル | 307 (一時的) または 308 (永続的) |
+| [`NextResponse.redirect`](#nextresponseredirect-in-middleware) | 条件に基づいて受信リクエストをリダイレクトする | ミドルウェア | 任意 |
-| API | 目的 | 使用場所 | ステータスコード |
-| -------------------------------------------------------------- | ---------------------------------------------- | ------------------------ | -------------------------- |
-| [`useRouter`](#userouter-hook) | クライアントサイドのナビゲーションを実行する | コンポーネント | 該当なし |
-| [`next.config.js`内の`redirects`](#redirects-in-nextconfigjs) | パスに基づいて受信リクエストをリダイレクトする | `next.config.js`ファイル | 307(仮)または308(永続) |
-| [`NextResponse.redirect`](#nextresponseredirect-in-middleware) | 条件に基づいて受信リクエストをリダイレクトする | ミドルウェア | 任意 |
+| API | 目的 | 実行場所 | ステータスコード |
+| -------------------------------------------------------------- | ---------------------------------------------- | ------------------------- | -------------------------------- |
+| [`useRouter`](#userouter-hook) | クライアントサイドのナビゲーションを実行 | コンポーネント | N/A |
+| [`redirects` in `next.config.js`](#redirects-in-nextconfigjs) | パスに基づいて受信リクエストをリダイレクトする | `next.config.js` ファイル | 307 (一時的) または 308 (永続的) |
+| [`NextResponse.redirect`](#nextresponseredirect-in-middleware) | 条件に基づいて受信リクエストをリダイレクトする | ミドルウェア | 任意 |
@@ -37,14 +37,14 @@ Next.jsでリダイレクトを処理する方法はいくつかあります。
## `redirect` 関数 {#redirect-function}
-`redirect` 関数を使用すると、ユーザーを別のURLにリダイレクトすることができます。`redirect`を[Server Components](/docs/app/building-your-application/rendering/server-components)、[Route Handlers](/docs/app/building-your-application/routing/route-handlers)、および[Server Actions](/docs/app/building-your-application/data-fetching/server-actions-and-mutations)で呼び出すことができます。
+`redirect` 関数を使用すると、ユーザーを別の URL にリダイレクトすることができます。`redirect` を使用する箇所は [Server Components](/docs/app/building-your-application/rendering/server-components)、[Route Handlers](/docs/app/building-your-application/routing/route-handlers)、および [Server Actions](/docs/app/building-your-application/data-fetching/server-actions-and-mutations)です。
-`redirect`は、ミューテーションまたはイベントの後によく使用されます。たとえば、投稿を作成する場合です:
+`redirect` は通常、ミューテーションやイベントの後に使用されます。たとえば、投稿を作成する場合:
-
+
-```tsx title="app/actions.tsx" switcher
+```ts title="app/actions.ts" switcher
'use server'
import { redirect } from 'next/navigation'
@@ -63,9 +63,9 @@ export async function createPost(id: string) {
```
-
+
-```jsx title="app/actions.js" switcher
+```js title="app/actions.js" switcher
'use server'
import { redirect } from 'next/navigation'
@@ -86,26 +86,26 @@ export async function createPost(id) {
-> **参考情報**:
+> **Good to know**:
>
-> - `redirect`はデフォルトで307(Temporary Redirect)ステータスコードを返します。Server Actionで使用されるとき、通常はPOSTリクエストの結果として成功ページにリダイレクトするために使用される303(See Other)を返します。
-> - `redirect`は内部でエラーをスローするため、`try/catch`ブロックの外で呼び出す必要があります。
-> - `redirect`はクライアントコンポーネントのレンダリングプロセス中に呼び出すことができますが、イベントハンドラーでは呼び出せません。[`useRouter`フック](#userouter-hook)を代わりに使用できます。
-> - `redirect`は絶対URLも受け入れ、外部リンクにリダイレクトするために使用できます。
-> - レンダープロセスの前にリダイレクトしたい場合は、[`next.config.js`](#redirects-in-nextconfigjs)または[Middleware](#nextresponseredirect-in-middleware)を使用してください。
+> - `redirect` はデフォルトで 307 (一時的リダイレクト) ステータスコードを返します。 Server Action で使用される場合、303 (See Other) を返します。これは POST リクエストの結果として成功ページにリダイレクトするときに一般的に使用されます。
+> - `redirect` は内部でエラーをスローするため、`try/catch` ブロックの外部で呼び出す必要があります。
+> - `redirect` はクライアントコンポーネントのレンダリングプロセス中に呼び出すことができますが、イベントハンドラー内では呼び出すことはできません。代わりに [`useRouter` hook](#userouter-hook) を使用できます。
+> - `redirect` は絶対URLを受け取り、外部リンクにリダイレクトするために使用することもできます。
+> - レンダリングプロセスの前にリダイレクトしたい場合は、[`next.config.js`](#redirects-in-nextconfigjs) または [ミドルウェア](#nextresponseredirect-in-middleware) を使用してください。
-[`redirect` APIリファレンス](/docs/app/api-reference/functions/redirect)を参照して、さらに情報をご覧ください。
+[`redirect` API リファレンス](/docs/app/api-reference/functions/redirect) を参照してください。
## `permanentRedirect` 関数 {#permanentredirect-function}
-`permanentRedirect` 関数は、ユーザーを別のURLに**永久に**リダイレクトすることができます。`permanentRedirect`を[Server Components](/docs/app/building-your-application/rendering/server-components)、[Route Handlers](/docs/app/building-your-application/routing/route-handlers)、および[Server Actions](/docs/app/building-your-application/data-fetching/server-actions-and-mutations)で呼び出すことができます。
+`permanentRedirect` 関数を使用すると、ユーザーを他の URL に **永続的に** リダイレクトすることができます。`permanentRedirect` を使用する箇所は [Server Components](/docs/app/building-your-application/rendering/server-components)、[Route Handlers](/docs/app/building-your-application/routing/route-handlers)、および [Server Actions](/docs/app/building-your-application/data-fetching/server-actions-and-mutations)です。
-`permanentRedirect`は、エンティティの正規URLが変更されるミューテーションまたはイベントの後によく使用されます。たとえば、ユーザーがユーザー名を変更した後にプロフィールURLを更新する場合です:
+`permanentRedirect` は、エンティティの正式な URL が変更されるイベントの後によく使われます。たとえば、ユーザー名を変更した後にユーザープロファイル URL を更新する場合などです:
-
+
-```tsx title="app/actions.ts" switcher
+```ts title="app/actions.ts" switcher
'use server'
import { permanentRedirect } from 'next/navigation'
@@ -118,15 +118,15 @@ export async function updateUsername(username: string, formData: FormData) {
// エラーを処理する
}
- revalidateTag('username') // ユーザー名のすべての参照を更新する
- permanentRedirect(`/profile/${username}`) // 新しいユーザープロフィールに移動する
+ revalidateTag('username') // ユーザー名へのすべての参照を更新する
+ permanentRedirect(`/profile/${username}`) // 新しいユーザープロファイルに移動する
}
```
-
+
-```jsx title="app/actions.js" switcher
+```js title="app/actions.js" switcher
'use server'
import { permanentRedirect } from 'next/navigation'
@@ -139,21 +139,21 @@ export async function updateUsername(username, formData) {
// エラーを処理する
}
- revalidateTag('username') // ユーザー名のすべての参照を更新する
- permanentRedirect(`/profile/${username}`) // 新しいユーザープロフィールに移動する
+ revalidateTag('username') // ユーザー名へのすべての参照を更新する
+ permanentRedirect(`/profile/${username}`) // 新しいユーザープロファイルに移動する
}
```
-> **参考情報**:
+> **Good to know**:
>
-> - `permanentRedirect`はデフォルトで308(恒久的リダイレクト)ステータスコードを返します;
-> - `permanentRedirect`は絶対URLも受け入れ、外部リンクにリダイレクトするために使用できます;
-> - レンダープロセスの前にリダイレクトしたい場合は、[`next.config.js`](#redirects-in-nextconfigjs)または[Middleware](#nextresponseredirect-in-middleware)を使用してください;
+> - `permanentRedirect` はデフォルトで 308 (永続的リダイレクト) ステータスコードを返します。
+> - `permanentRedirect` も絶対URLを受け入れ、外部リンクにリダイレクトするために使用することができます。
+> - レンダリングプロセスの前にリダイレクトしたい場合は、[`next.config.js`](#redirects-in-nextconfigjs) または [ミドルウェア](#nextresponseredirect-in-middleware) を使用してください。
-[`permanentRedirect` APIリファレンス](/docs/app/api-reference/functions/permanentRedirect)を参照して、さらに情報をご覧ください。
+[`permanentRedirect` API リファレンス](/docs/app/api-reference/functions/permanentRedirect) を参照してください。
@@ -161,7 +161,7 @@ export async function updateUsername(username, formData) {
-クライアントコンポーネントのイベントハンドラー内でリダイレクトが必要な場合、`useRouter`フックの`push`メソッドを使用できます。例えば:
+クライアントコンポーネントのイベントハンドラー内でリダイレクトする必要がある場合は、`useRouter` フックの `push` メソッドを使用できます。以下はその例です:
@@ -176,7 +176,7 @@ export default function Page() {
return (
)
}
@@ -195,7 +195,7 @@ export default function Page() {
return (
)
}
@@ -208,7 +208,7 @@ export default function Page() {
-コンポーネント内でリダイレクトする必要がある場合、`useRouter`フックの`push`メソッドを使用できます。例えば:
+コンポーネント内でリダイレクトする必要がある場合は、`useRouter` フックの `push` メソッドを使用できます。以下はその例です:
@@ -221,7 +221,7 @@ export default function Page() {
return (
)
}
@@ -238,7 +238,7 @@ export default function Page() {
return (
)
}
@@ -249,29 +249,29 @@ export default function Page() {
-> **参考情報**:
+> **Good to know**:
>
-> - プログラムでユーザーをナビゲートする必要がない場合は、[``](/docs/app/api-reference/components/link)コンポーネントを使用するべきです。
+> - プログラムによってユーザーをナビゲートする必要がない場合は、[``](/docs/app/api-reference/components/link) コンポーネントを使用するべきです。
-[`useRouter` APIリファレンス](/docs/app/api-reference/functions/use-router)を参照して、さらに情報をご覧ください。
+[`useRouter` API リファレンス](/docs/app/api-reference/functions/use-router) を参照してください。
-[`useRouter` APIリファレンス](https://nextjs.org/docs/canary/pages/api-reference/functions/use-router)を参照して、さらに情報をご覧ください。
+[`useRouter` API リファレンス](https://nextjs.org/docs/canary/pages/api-reference/functions/use-router) を参照してください。
-## `next.config.js`内の`redirects` {#redirects-in-next-config-js}
+## `next.config.js` での`redirects` {#redirects-in-next-config-js}
-`next.config.js`ファイル内の`redirects`オプションを使用すると、受信リクエストのパスを別の宛先パスにリダイレクトできます。これは、ページのURL構造を変更した場合や、事前に既知のリダイレクトのリストがある場合に便利です。
+`next.config.js` ファイルの `redirects` オプションを使用すると、受信リクエストのパスを異なる宛先のパスにリダイレクトできます。これは、ページの URL 構造を変更したときや、事前に既知のリダイレクトのリストがある場合に便利です。
-`redirects`は、[パス](/docs/app/api-reference/config/next-config-js/redirects#path-matching)、[ヘッダー、cookie、クエリのマッチング](/docs/app/api-reference/config/next-config-js/redirects#header-cookie-and-query-matching)をサポートし、受信リクエストに基づいてユーザーをリダイレクトする柔軟性を提供します。
+`redirects` は [path](/docs/app/api-reference/config/next-config-js/redirects#path-matching)、[header、cookie、およびクエリの一致](/docs/app/api-reference/config/next-config-js/redirects#header-cookie-and-query-matching)をサポートし、受信リクエストに基づいてユーザーを柔軟にリダイレクトできます。
-`redirects`を使用するには、`next.config.js`ファイルにオプションを追加します:
+`next.config.js` ファイルに `redirects` オプションを追加して使用します:
```js title="next.config.js"
module.exports = {
@@ -283,7 +283,7 @@ module.exports = {
destination: '/',
permanent: true,
},
- // ワイルドカードパスマッチング
+ // ワイルドカードパスのマッチング
{
source: '/blog/:slug',
destination: '/news/:slug',
@@ -294,36 +294,36 @@ module.exports = {
}
```
-[`redirects` APIリファレンス](/docs/app/api-reference/config/next-config-js/redirects)を参照して、さらに情報をご覧ください。
+[`redirects` API リファレンス](/docs/app/api-reference/config/next-config-js/redirects) を参照してください。
-> **参考情報**:
+> **Good to know**:
>
-> - `redirects`は、`permanent`オプションを使用して307(Temporary Redirect)または308(Permanent Redirect)ステータスコードを返すことができます;
-> - プラットフォームによっては、`redirects`に制限がある場合があります。たとえば、Vercelでは1,024件のリダイレクトの制限があります。大量のリダイレクト(1000件以上)を管理するには、[Middleware](/docs/app/building-your-application/routing/middleware)を使用したカスタムソリューションを作成することを検討してください。規模に応じたリダイレクト管理については、[managing redirects at scale](#managing-redirects-at-scale-advanced)を参照してください;
-> - `redirects`はミドルウェアの**前に**実行されます;
+> - `redirects` は `permanent` オプションを使用して 307 (一時的リダイレクト) または 308 (永続的リダイレクト) ステータスコードを返すことができます。
+> - `redirects` にはプラットフォームによって制限がある場合があります。たとえば、Vercel では、リダイレクトの制限が 1,024 です。多数のリダイレクト (1000+) を管理するには、[ミドルウェア](/docs/app/building-your-application/routing/middleware) を使用してカスタムソリューションを作成することを検討してください。詳細は [大規模なリダイレクトの管理](#managing-redirects-at-scale-advanced) を参照してください。
+> - `redirects` はミドルウェアの **前** に実行されます。
-## `NextResponse.redirect` in Middleware {#nextresponse-redirect-in-middleware}
+## ミドルウェアでの `NextResponse.redirect` {#nextresponse-redirect-in-middleware}
-ミドルウェアを使用すると、リクエストが完了する前にコードを実行できます。そして、受信リクエストに基づいて`NextResponse.redirect`を使用して別のURLにリダイレクトします。これは、条件(例:認証、セッション管理など)に基づいてユーザーをリダイレクトする場合や、大量のリダイレクトがあります:
+ミドルウェアを使用すると、リクエストが完了する前にコードを実行できます。その後、受信リクエストに基づいて、`NextResponse.redirect` を使用して異なる URL にリダイレクトします。これは、条件に基づいてユーザーをリダイレクトしたい場合(例:認証、セッション管理など)や、大量のリダイレクトを持つ場合に便利です。
-たとえば、ユーザーが認証されていない場合に`/login`ページにリダイレクトするには:
+たとえば、ユーザーが認証されていない場合に `/login` ページにリダイレクトするには:
-
+
-```tsx title="middleware.ts" switcher
+```ts title="middleware.ts" switcher
import { NextResponse, NextRequest } from 'next/server'
import { authenticate } from 'auth-provider'
export function middleware(request: NextRequest) {
const isAuthenticated = authenticate(request)
- // ユーザーが認証されている場合は、通常通り続行します
+ // ユーザーが認証された場合は通常どおり続行します
if (isAuthenticated) {
return NextResponse.next()
}
- // 認証されていない場合は、ログインページにリダイレクトします
+ // 認証されていない場合はログインページにリダイレクトします
return NextResponse.redirect(new URL('/login', request.url))
}
@@ -342,12 +342,12 @@ import { authenticate } from 'auth-provider'
export function middleware(request) {
const isAuthenticated = authenticate(request)
- // ユーザーが認証されている場合は、通常通り続行します
+ // ユーザーが認証された場合は通常どおり続行します
if (isAuthenticated) {
return NextResponse.next()
}
- // 認証されていない場合は、ログインページにリダイレクトします
+ // 認証されていない場合はログインページにリダイレクトします
return NextResponse.redirect(new URL('/login', request.url))
}
@@ -359,28 +359,28 @@ export const config = {
-> **参考情報**:
+> **Good to know**:
>
-> - ミドルウェアは、`next.config.js`の`redirects`**後に**実行され、レンダリングの**前に**実行されます;
+> - ミドルウェアは、`next.config.js` の `redirects` の **後**、レンダリングの **前** に実行されます。
-[Middleware](/docs/app/building-your-application/routing/middleware)のドキュメントを参照して、さらに情報をご覧ください。
+[ミドルウェア](/docs/app/building-your-application/routing/middleware) のドキュメントを参照してください。
-## 規模に応じたリダイレクト管理(高度) {#managing-redirects-at-scale-advanced}
+## 大規模なリダイレクト管理(高度) {#managing-redirects-at-scale-advanced}
-大量のリダイレクト(1000件以上)を管理するために、ミドルウェアを使用してカスタムソリューションを作成することを検討してください。これにより、アプリケーションを再デプロイすることなく、プログラムでリダイレクトを処理できます。
+多数のリダイレクト (1000+) を管理するために、ミドルウェアを使用してカスタムソリューションを作成することを検討するかもしれません。これにより、アプリケーションを再デプロイすることなくプログラムでリダイレクトを処理できます。
これを行うには、以下を考慮する必要があります:
1. リダイレクトマップの作成と保存
2. データ検索パフォーマンスの最適化
-> **Next.jsの例**:以下の推奨事項の実装については、[Middleware with Bloom filter](https://redirects-bloom-filter.vercel.app/)の例を参照してください。
+> **Next.js 例**: 以下の推奨事項の実装については、[Middleware with Bloom filter](https://redirects-bloom-filter.vercel.app/) の例をご覧ください。
### 1. リダイレクトマップの作成と保存 {#1-creating-and-storing-a-redirect-map}
-リダイレクトマップは、データベース(通常はキー・バリュー・ストア)またはJSONファイルに保存できるリダイレクトのリストです。
+リダイレクトマップは、キーと値のストアや JSON ファイルに保存できるリダイレクトのリストです。
-次のデータ構造を考慮してください:
+以下のデータ構造を考えてみましょう:
```json
{
@@ -395,12 +395,12 @@ export const config = {
}
```
-[Middleware](/docs/app/building-your-application/routing/middleware)で、Vercelの[Edge Config](https://vercel.com/docs/storage/edge-config/get-started?utm_source=next-site&utm_medium=docs&utm_campaign=next-website)や[Redis](https://vercel.com/docs/storage/vercel-kv?utm_source=next-site&utm_medium=docs&utm_campaign=next-website)などのデータベースから読み取り、受信リクエストに基づいてユーザーをリダイレクトすることができます:
+[ミドルウェア](/docs/app/building-your-application/routing/middleware) で、Vercel の [Edge Config](https://vercel.com/docs/storage/edge-config/get-started?utm_source=next-site&utm_medium=docs&utm_campaign=next-website) や [Redis](https://vercel.com/docs/storage/vercel-kv?utm_source=next-site&utm_medium=docs&utm_campaign=next-website) などのデータベースから読み取り、受信リクエストに基づいてユーザーをリダイレクトします:
-
+
-```tsx title="middleware.ts" switcher
+```ts title="middleware.ts" switcher
import { NextResponse, NextRequest } from 'next/server'
import { get } from '@vercel/edge-config'
@@ -419,7 +419,7 @@ export async function middleware(request: NextRequest) {
return NextResponse.redirect(redirectEntry.destination, statusCode)
}
- // リダイレクトが見つからなかった場合、そのまま継続します
+ // リダイレクトが見つからない場合、リダイレクトせずに続行します
return NextResponse.next()
}
```
@@ -441,7 +441,7 @@ export async function middleware(request) {
return NextResponse.redirect(redirectEntry.destination, statusCode)
}
- // リダイレクトが見つからなかった場合、そのまま継続します
+ // リダイレクトが見つからない場合、リダイレクトせずに続行します
return NextResponse.next()
}
```
@@ -449,21 +449,21 @@ export async function middleware(request) {
-### 2. データ検索パフォーマンスの最適化 {#2-optimizing-data-lookup-performance}
+### 2. データの検索パフォーマンスの最適化 {#2-optimizing-data-lookup-performance}
-大規模データセットをすべての受信リクエストのために読み取ることは遅く、費用がかかります。データ検索パフォーマンスを最適化する方法は2つあります:
+すべての受信リクエストに対して大規模なデータセットを読み取ることは、遅くて高価になる可能性があります。以下の 2 つの方法でデータの検索パフォーマンスを最適化できます:
-- [Vercel Edge Config](https://vercel.com/docs/storage/edge-config/get-started?utm_source=next-site&utm_medium=docs&utm_campaign=next-website)や[Redis](https://vercel.com/docs/storage/vercel-kv?utm_source=next-site&utm_medium=docs&utm_campaign=next-website)などの、高速読み取りに最適化されたデータベースを使用します;
-- [ブルームフィルター](https://en.wikipedia.org/wiki/Bloom_filter)のようなデータ検索戦略を使用して、リダイレクトが存在するかどうかを効率的にチェックし、より大きなリダイレクトファイルやデータベースを読み取る**前に**行います;
+- [Vercel Edge Config](https://vercel.com/docs/storage/edge-config/get-started?utm_source=next-site&utm_medium=docs&utm_campaign=next-website) や [Redis](https://vercel.com/docs/storage/vercel-kv?utm_source=next-site&utm_medium=docs&utm_campaign=next-website) などの高速読み取り用に最適化されたデータベースを使用します。
+- [ブルームフィルター](https://en.wikipedia.org/wiki/Bloom_filter) のようなデータ検索戦略を使用して、より大きなリダイレクトファイルまたはデータベースを読み取る **前に** リダイレクトが存在するかどうかを効率的にチェックします。
-前述の例では、生成されたブルームフィルターファイルをミドルウェアにインポートし、受信リクエストのパス名がブルームフィルターに存在するかどうかを確認します。
+前の例を考慮すると、生成されたブルームフィルターファイルをミドルウェアにインポートし、受信リクエストのパス名がブルームフィルターに存在するかを確認できます。
-存在する場合は、要求を[API Routes](https://nextjs.org/docs/canary/pages/building-your-application/routing/api-routes) [Route Handler](/docs/app/building-your-application/routing/route-handlers)に転送し、要求が実際に存在するかをチェックし、ユーザーを適切なURLにリダイレクトします。これにより、ミドルウェアに大量のリダイレクトファイルをインポートすることを避けることができ、すべての受信リクエストが遅くなるのを防ぎます。
+存在する場合は、そのリクエストを [Route Handler](/docs/app/building-your-application/routing/route-handlers) [API Routes](https://nextjs.org/docs/canary/pages/building-your-application/routing/api-routes) に転送し、実際のファイルを確認して適切な URL にユーザーをリダイレクトします。これにより、大きなリダイレクトファイルをミドルウェアにインポートする必要がなくなり、すべての受信リクエストの速度を低下させることが防げます。
-
+
-```tsx title="middleware.ts" switcher
+```ts title="middleware.ts" switcher
import { NextResponse, NextRequest } from 'next/server'
import { ScalableBloomFilter } from 'bloom-filters'
import GeneratedBloomFilter from './redirects/bloom-filter.json'
@@ -473,23 +473,23 @@ type RedirectEntry = {
permanent: boolean
}
-// 生成されたJSONファイルからブルームフィルターを初期化する
+// 生成された JSON ファイルからブルームフィルターを初期化する
const bloomFilter = ScalableBloomFilter.fromJSON(GeneratedBloomFilter as any)
export async function middleware(request: NextRequest) {
// 受信リクエストのパスを取得する
const pathname = request.nextUrl.pathname
- // パスがブルームフィルターにあるかチェックする
+ // パスがブルームフィルターにあるかどうかをチェックする
if (bloomFilter.has(pathname)) {
- // パス名をRoute Handlerに転送する
+ // パス名を Route Handler に転送する
const api = new URL(
`/api/redirects?pathname=${encodeURIComponent(request.nextUrl.pathname)}`,
request.nextUrl.origin
)
try {
- // Route Handlerからリダイレクトデータを取得する
+ // Route Handler からリダイレクトデータを取得する
const redirectData = await fetch(api)
if (redirectData.ok) {
@@ -509,7 +509,7 @@ export async function middleware(request: NextRequest) {
}
}
- // リダイレクトが見つからなかった場合、そのままリクエストを続行します
+ // リダイレクトが見つからない場合、リダイレクトせずにリクエストを続行します
return NextResponse.next()
}
```
@@ -522,23 +522,23 @@ import { NextResponse } from 'next/server'
import { ScalableBloomFilter } from 'bloom-filters'
import GeneratedBloomFilter from './redirects/bloom-filter.json'
-// 生成されたJSONファイルからブルームフィルターを初期化する
+// 生成された JSON ファイルからブルームフィルターを初期化する
const bloomFilter = ScalableBloomFilter.fromJSON(GeneratedBloomFilter)
export async function middleware(request) {
// 受信リクエストのパスを取得する
const pathname = request.nextUrl.pathname
- // パスがブルームフィルターにあるかチェックする
+ // パスがブルームフィルターにあるかどうかをチェックする
if (bloomFilter.has(pathname)) {
- // パス名をRoute Handlerに転送する
+ // パス名を Route Handler に転送する
const api = new URL(
`/api/redirects?pathname=${encodeURIComponent(request.nextUrl.pathname)}`,
request.nextUrl.origin
)
try {
- // Route Handlerからリダイレクトデータを取得する
+ // Route Handler からリダイレクトデータを取得する
const redirectData = await fetch(api)
if (redirectData.ok) {
@@ -557,7 +557,7 @@ export async function middleware(request) {
}
}
- // リダイレクトが見つからなかった場合、そのままリクエストを続行します
+ // リダイレクトが見つからない場合、リダイレクトせずにリクエストを続行します
return NextResponse.next()
}
```
@@ -567,12 +567,12 @@ export async function middleware(request) {
-その後、Route Handlerでは:
+次に、Route Handler で:
-
+
-```tsx title="app/redirects/route.ts" switcher
+```ts title="app/api/redirects/route.ts" switcher
import { NextRequest, NextResponse } from 'next/server'
import redirects from '@/app/redirects/redirects.json'
@@ -584,15 +584,15 @@ type RedirectEntry = {
export function GET(request: NextRequest) {
const pathname = request.nextUrl.searchParams.get('pathname')
if (!pathname) {
- return new Response('不正なリクエスト', { status: 400 })
+ return new Response('Bad Request', { status: 400 })
}
- // redirects.jsonファイルからリダイレクトエントリを取得する
+ // redirects.json ファイルからリダイレクトエントリを取得する
const redirect = (redirects as Record)[pathname]
- // ブルームフィルターの誤検知に対応する
+ // ブルームフィルターの誤検出を考慮する
if (!redirect) {
- return new Response('リダイレクトなし', { status: 400 })
+ return new Response('No redirect', { status: 400 })
}
// リダイレクトエントリを返す
@@ -603,22 +603,22 @@ export function GET(request: NextRequest) {
-```js title="app/redirects/route.js" switcher
+```js title="app/api/redirects/route.js" switcher
import { NextResponse } from 'next/server'
import redirects from '@/app/redirects/redirects.json'
export function GET(request) {
const pathname = request.nextUrl.searchParams.get('pathname')
if (!pathname) {
- return new Response('不正なリクエスト', { status: 400 })
+ return new Response('Bad Request', { status: 400 })
}
- // redirects.jsonファイルからリダイレクトエントリを取得する
+ // redirects.json ファイルからリダイレクトエントリを取得する
const redirect = redirects[pathname]
- // ブルームフィルターの誤検知に対応する
+ // ブルームフィルターの誤検出を考慮する
if (!redirect) {
- return new Response('リダイレクトなし', { status: 400 })
+ return new Response('No redirect', { status: 400 })
}
// リダイレクトエントリを返す
@@ -633,12 +633,12 @@ export function GET(request) {
-その後、API Routeでは:
+次に、API ルートで:
-
+
-```tsx title="pages/api/redirects.ts" switcher
+```ts title="pages/api/redirects.ts" switcher
import type { NextApiRequest, NextApiResponse } from 'next'
import redirects from '@/app/redirects/redirects.json'
@@ -650,15 +650,15 @@ type RedirectEntry = {
export default function handler(req: NextApiRequest, res: NextApiResponse) {
const pathname = req.query.pathname
if (!pathname) {
- return res.status(400).json({ message: '不正なリクエスト' })
+ return res.status(400).json({ message: 'Bad Request' })
}
- // redirects.jsonファイルからリダイレクトエントリを取得する
+ // redirects.json ファイルからリダイレクトエントリを取得する
const redirect = (redirects as Record)[pathname]
- // ブルームフィルターの誤検知に対応する
+ // ブルームフィルターの誤検出を考慮する
if (!redirect) {
- return res.status(400).json({ message: 'リダイレクトなし' })
+ return res.status(400).json({ message: 'No redirect' })
}
// リダイレクトエントリを返す
@@ -675,15 +675,15 @@ import redirects from '@/app/redirects/redirects.json'
export default function handler(req, res) {
const pathname = req.query.pathname
if (!pathname) {
- return res.status(400).json({ message: '不正なリクエスト' })
+ return res.status(400).json({ message: 'Bad Request' })
}
- // redirects.jsonファイルからリダイレクトエントリを取得する
+ // redirects.json ファイルからリダイレクトエントリを取得する
const redirect = redirects[pathname]
- // ブルームフィルターの誤検知に対応する
+ // ブルームフィルターの誤検出を考慮する
if (!redirect) {
- return res.status(400).json({ message: 'リダイレクトなし' })
+ return res.status(400).json({ message: 'No redirect' })
}
// リダイレクトエントリを返す
@@ -696,7 +696,7 @@ export default function handler(req, res) {
-> **参考情報**:
+> **Good to know:**
>
-> - ブルームフィルターを生成するために、[`bloom-filters`](https://www.npmjs.com/package/bloom-filters)のようなライブラリを使用できます;
-> - 悪意のあるリクエストを防止するために、Route Handlerに対して行われるリクエストを検証する必要があります;
+> - ブルームフィルターを生成するには、[`bloom-filters`](https://www.npmjs.com/package/bloom-filters) のようなライブラリを使用できます。
+> - 悪意のあるリクエストを防ぐために、Route Handler へのリクエストを検証すべきです。
diff --git a/docs/01-app/02-building-your-application/01-routing/15-internationalization.mdx b/docs/01-app/02-building-your-application/01-routing/15-internationalization.mdx
index 1d78b7d3..ba1f5bd6 100644
--- a/docs/01-app/02-building-your-application/01-routing/15-internationalization.mdx
+++ b/docs/01-app/02-building-your-application/01-routing/15-internationalization.mdx
@@ -1,22 +1,22 @@
---
-title: '国際化'
-description: '国際化されたルーティングと地域化されたコンテンツで複数言語のサポートを追加します'
+title: 'Internationalization'
+description: '国際化されたルーティングとローカライズされたコンテンツで複数の言語をサポートします。'
---
-Next.jsは、コンテンツのルーティングとレンダリングを構成して、複数の言語をサポートすることを可能にします。異なるロケールにサイトを適応させることには、翻訳されたコンテンツ(地域化)と国際化されたルートが含まれます。
+Next.jsを使用すると、複数の言語をサポートするようにコンテンツのルーティングとレンダリングを設定できます。サイトをさまざまなロケールに適応させるためには、翻訳されたコンテンツ(ローカライゼーション)と国際化されたルートが含まれます。
## 用語 {#terminology}
-- **Locale:** 一連の言語および形式設定の優先事項の識別子。通常、ユーザーの好みの言語とおそらく地理的な地域が含まれます。
- - `en-US`: アメリカで話される英語
- - `nl-NL`: オランダで話されるオランダ語
- - `nl`: 特定の地域が指定されていないオランダ語
+- **ロケール:** 言語とフォーマットの設定を識別するための識別子。通常、ユーザーの希望する言語と、場合によっては地理的地域を含みます。
+ - `en-US`: アメリカ合衆国で使用される英語
+ - `nl-NL`: オランダで使用されるオランダ語
+ - `nl`: 特定の地域を指定しないオランダ語
-## ルーティングの概要 {#routing-overview}
+## ルーティング概要 {#routing-overview}
-ブラウザでのユーザーの言語優先順位を使用して、どのロケールを使用するかを選択することをお勧めします。好みの言語を変更すると、アプリケーションに到着する`Accept-Language`ヘッダーが変更されます。
+ブラウザでユーザーの言語設定を使用して、使用するロケールを選択することをお勧めします。希望の言語を変更すると、アプリケーションへの受信`Accept-Language`ヘッダーが変更されます。
-例えば、以下のライブラリを使用して、受信する`Request`を見て、`Headers`、サポート予定のロケール、およびデフォルトのロケールに基づいて、どのロケールを選択するかを決定することができます。
+たとえば、次のライブラリを使用して、受信した`Request`を調べ、`Headers`、サポート予定のロケール、およびデフォルトのロケールに基づいてどのロケールを選択するかを判断できます。
```js title="middleware.js"
import { match } from '@formatjs/intl-localematcher'
@@ -30,18 +30,18 @@ let defaultLocale = 'en-US'
match(languages, locales, defaultLocale) // -> 'en-US'
```
-ルーティングはサブパス (`/fr/products`) またはドメイン (`my-site.fr/products`) を使用して国際化できます。この情報を使用して、[Middleware](/docs/app/building-your-application/routing/middleware)内でロケールに基づいてユーザーをリダイレクトすることができます。
+サブパス(`/fr/products`)またはドメイン(`my-site.fr/products`)を使って、ルーティングを国際化できます。この情報を使用して、[Middleware](/docs/app/building-your-application/routing/middleware)内でロケールに基づいてユーザーをリダイレクトできます。
```js title="middleware.js"
import { NextResponse } from "next/server";
let locales = ['en-US', 'nl-NL', 'nl']
-// 上記と同様にまたはライブラリを用いて、好みのロケールを取得する
+// 上記と同様に、またはライブラリを使用して、希望のロケールを取得します
function getLocale(request) { ... }
export function middleware(request) {
- // パス名にサポートされているロケールがあるかどうかを確認
+ // パス名にサポートされているロケールが含まれているか確認します
const { pathname } = request.nextUrl
const pathnameHasLocale = locales.some(
(locale) => pathname.startsWith(`/${locale}/`) || pathname === `/${locale}`
@@ -49,41 +49,41 @@ export function middleware(request) {
if (pathnameHasLocale) return
- // ロケールがない場合はリダイレクト
+ // ロケールがない場合はリダイレクトします
const locale = getLocale(request)
request.nextUrl.pathname = `/${locale}${pathname}`
- // 例: 受信リクエストが/productsの場合
- // 新しいURLは/en-US/productsになります
+ // 例:受信リクエストが /products の場合
+ // 新しいURLは /en-US/products になります
return NextResponse.redirect(request.nextUrl)
}
export const config = {
matcher: [
- // すべての内部パス (_next) をスキップ
+ // すべての内部パス (_next) をスキップします
'/((?!_next).*)',
- // 任意: root (/) URL でのみ実行
+ // オプション: ルート (/) URL のみに実行します
// '/'
],
}
```
-最後に、`app/`内のすべての特別なファイルが`app/[lang]`の下にネストされていることを確認してください。これにより、Next.js routerはルート内の異なるロケールを動的に処理し、`lang`パラメータをすべてのレイアウトとページに転送できるようになります。例えば:
+最後に、`app/`内のすべての特別なファイルが`app/[lang]`の下にネストされていることを確認します。これにより、Next.js routerがルート内の異なるロケールを動的に処理し、`lang`パラメータをすべてのレイアウトとページに転送できるようになります。たとえば:
```jsx title="app/[lang]/page.js"
-// 現在のロケールにアクセスできるようになります
-// 例: /en-US/products -> `lang`は"en-US"
+// 現在のロケールにアクセスできます
+// 例:/en-US/products -> `lang`が"en-US"です
export default async function Page({ params: { lang } }) {
return ...
}
```
-root レイアウトも新しいフォルダー(例: `app/[lang]/layout.js`)にネストできます。
+root レイアウトも新しいフォルダー内にネストできます(例:`app/[lang]/layout.js`)。
-## 地域化 {#localization}
+## ローカライゼーション {#localization}
-ユーザーの好みのロケールに基づいて表示されるコンテンツを変更する、つまり地域化はNext.jsに特有のものではありません。以下で説明するパターンは、任意のWebアプリケーションでも同様に機能します。
+ユーザーの希望するロケールに基づいて表示されるコンテンツを変更する、つまりローカライゼーションは、Next.jsに特有のものではありません。以下に説明するパターンは、任意のWebアプリケーションで同様に動作します。
-アプリケーション内で英語とオランダ語のコンテンツの両方をサポートしたいと仮定しましょう。いくつかのキーから地域化された文字列へのマッピングを提供するオブジェクトである2つの異なる「辞書」を管理するかもしれません。例えば:
+アプリケーション内で英語とオランダ語の両方のコンテンツをサポートしたいと仮定します。異なる2つの「辞書」を維持することができます。辞書は、あるキーからローカライズされた文字列へのマッピングを提供するオブジェクトです。たとえば:
```json title="dictionaries/en.json"
{
@@ -101,7 +101,7 @@ root レイアウトも新しいフォルダー(例: `app/[lang]/layout.js`)
}
```
-次に、要求されたロケールの翻訳をロードするための`getDictionary`関数を作成できます:
+次に、リクエストされたロケールの翻訳をロードするための`getDictionary`関数を作成できます:
```jsx title="app/[lang]/dictionaries.js"
import 'server-only'
@@ -114,22 +114,22 @@ const dictionaries = {
export const getDictionary = async (locale) => dictionaries[locale]()
```
-現在選択されている言語に基づいて、レイアウトやページ内で辞書を取得できます。
+現在選択されている言語を考慮して、レイアウトやページの中で辞書を取得できます。
```jsx title="app/[lang]/page.js"
import { getDictionary } from './dictionaries'
export default async function Page({ params: { lang } }) {
const dict = await getDictionary(lang) // en
- return // カートに追加
+ return // Add to Cart
}
```
-`app/`ディレクトリ内のすべてのレイアウトとページがデフォルトで[Server Components](/docs/app/building-your-application/rendering/server-components)であるため、翻訳ファイルのサイズがクライアント側JavaScriptバンドルサイズに影響を与えることを心配する必要はありません。このコードは**サーバー上でのみ実行され**、結果として得られるHTMLのみがブラウザーに送信されます。
+`app/` ディレクトリ内のすべてのレイアウトとページはデフォルトで[Server Components](/docs/app/building-your-application/rendering/server-components)ですので、翻訳ファイルのサイズがクライアントサイドのJavaScriptバンドルサイズに影響を与えることを心配する必要はありません。このコードは**サーバーでのみ実行**され、その結果として生成されたHTMLのみがブラウザに送信されます。
## 静的生成 {#static-generation}
-特定のロケールセットに対して静的ルートを生成するには、`generateStaticParams`をページやレイアウトで使用します。例えば、root レイアウトでこれをグローバルに行うことができます:
+特定のロケールセットに対して静的ルートを生成するには、ページやレイアウトに`generateStaticParams`を使用できます。たとえば、root レイアウトでグローバルに行うことができます:
```jsx title="app/[lang]/layout.js"
export async function generateStaticParams() {
@@ -147,7 +147,7 @@ export default function Root({ children, params }) {
## リソース {#resources}
-- [Minimal i18n routing and translations](https://github.com/vercel/next.js/tree/canary/examples/app-dir-i18n-routing)
+- [Minimal i18n routing and translations](https://github.com/vercel/next.js/tree/canary/examples/i18n-routing)
- [`next-intl`](https://next-intl-docs.vercel.app/docs/next-13)
- [`next-international`](https://github.com/QuiiBz/next-international)
- [`next-i18n-router`](https://github.com/i18nexus/next-i18n-router)
diff --git a/docs/01-app/02-building-your-application/02-data-fetching/01-fetching.mdx b/docs/01-app/02-building-your-application/02-data-fetching/01-fetching.mdx
index 357b81e4..63ed1d44 100644
--- a/docs/01-app/02-building-your-application/02-data-fetching/01-fetching.mdx
+++ b/docs/01-app/02-building-your-application/02-data-fetching/01-fetching.mdx
@@ -1,11 +1,11 @@
---
-title: 'データ取得とキャッシュ'
-nav_title: 'データ取得とキャッシュ'
-description: 'Next.jsでサーバーまたはクライアントでデータを取得するためのベストプラクティスを学びましょう。'
+title: 'データフェッチングとキャッシング'
+nav_title: 'データフェッチングとキャッシング'
+description: 'Next.jsでのサーバーまたはクライアントでのデータ取得のベストプラクティスを学びます。'
---
- 例
+ Examples
- [Next.js Commerce](https://vercel.com/templates/next.js/nextjs-commerce)
- [On-Demand ISR](https://on-demand-isr.vercel.app)
@@ -13,17 +13,17 @@ description: 'Next.jsでサーバーまたはクライアントでデータを
-このガイドでは、Next.jsにおけるデータ取得とキャッシュの基本を実用的な例とベストプラクティスを示しながら説明します。
+このガイドでは、Next.jsにおけるデータフェッチングとキャッシングの基本を具体的な例とベストプラクティスを通じて説明します。
-Next.jsにおけるデータ取得の最小限の例を以下に示します:
+以下はNext.jsでのデータ取得の最小限の例です。
```tsx title="app/page.tsx" switcher
export default async function Page() {
- let data = await fetch('https://api.vercel.app/blog')
- let posts = await data.json()
+ const data = await fetch('https://api.vercel.app/blog')
+ const posts = await data.json()
return (
{posts.map((post) => (
@@ -39,8 +39,8 @@ export default async function Page() {
```jsx title="app/page.js" switcher
export default async function Page() {
- let data = await fetch('https://api.vercel.app/blog')
- let posts = await data.json()
+ const data = await fetch('https://api.vercel.app/blog')
+ const posts = await data.json()
return (
{posts.map((post) => (
@@ -54,9 +54,9 @@ export default async function Page() {
-この例は、非同期のReact Server Componentで`fetch` APIを使用してサーバー側でデータを取得する基本的な方法を示しています。
+この例では、非同期のReact server componentにおける`fetch` APIを使用した基本的なサーバーサイドでのデータ取得を示しています。
-## 参考 {#reference}
+## 参照 {#reference}
- [`fetch`](/docs/app/api-reference/functions/fetch)
- React [`cache`](https://react.dev/reference/react/cache)
@@ -64,17 +64,17 @@ export default async function Page() {
## 例 {#examples}
-### サーバーで`fetch` APIを使用したデータ取得 {#fetching-data-on-the-server-with-the-fetch-api}
+### `fetch` APIを使用したサーバーでのデータ取得 {#fetching-data-on-the-server-with-the-fetch-api}
-このコンポーネントはブログ投稿のリストを取得して表示します。`fetch`からのレスポンスはデフォルトではキャッシュされません。
+このコンポーネントはブログ記事のリストを取得して表示します。`fetch`からの応答はデフォルトでキャッシュされません。
```tsx title="app/page.tsx" switcher
export default async function Page() {
- let data = await fetch('https://api.vercel.app/blog')
- let posts = await data.json()
+ const data = await fetch('https://api.vercel.app/blog')
+ const posts = await data.json()
return (
{posts.map((post) => (
@@ -90,8 +90,8 @@ export default async function Page() {
```jsx title="app/page.js" switcher
export default async function Page() {
- let data = await fetch('https://api.vercel.app/blog')
- let posts = await data.json()
+ const data = await fetch('https://api.vercel.app/blog')
+ const posts = await data.json()
return (
{posts.map((post) => (
@@ -105,19 +105,19 @@ export default async function Page() {
-このルートの他の場所で[Dynamic APIs](/docs/app/building-your-application/rendering/server-components#dynamic-rendering)を使用していない場合、`next build`中にこのページは静的ページとして事前レンダリングされます。その後、データは[Incremental Static Regeneration](/docs/app/building-your-application/data-fetching/incremental-static-regeneration)を使用して更新できます。
+このルート内で他の[ダイナミックAPI](/docs/app/building-your-application/rendering/server-components#dynamic-rendering)を使用していない場合、`next build`中に静的ページとしてプリレンダリングされます。その後、データは[Incremental Static Regeneration](/docs/app/building-your-application/data-fetching/incremental-static-regeneration)を使用して更新できます。
-ページの事前レンダリングを防ぐには、以下をファイルに追加します:
+プリレンダリングを防ぐには、ファイルに以下を追加できます。
```js
export const dynamic = 'force-dynamic'
```
-ただし、多くの場合、`cookies`、`headers`、またはページpropsからの`searchParams`を読み取る関数を使用します。これによりページは自動的に動的にレンダリングされます。この場合、`force-dynamic`を明示的に使用する必要はありません。
+ただし、通常は、`cookies`や`headers`、ページのpropsからの`searchParams`を読み取る関数を使用することが多く、その場合はページが自動的に動的にレンダリングされます。この場合、`force-dynamic`を明示的に使用する必要はありません。
-### ORMまたはデータベースを使用してサーバーでデータ取得 {#fetching-data-on-the-server-with-an-orm-or-database}
+### ORMやデータベースを使用したサーバーでのデータ取得 {#fetching-data-on-the-server-with-an-orm-or-database}
-このコンポーネントはブログ投稿のリストを取得して表示します。データベースからのレスポンスはデフォルトではキャッシュされていませんが、[追加の設定](#caching-data-with-an-orm-or-database)によってキャッシュすることができます。
+このコンポーネントはブログ記事のリストを取得して表示します。データベースからの応答はデフォルトでキャッシュされませんが、[追加の設定](#caching-data-with-an-orm-or-database)によりキャッシュできます。
@@ -126,7 +126,7 @@ export const dynamic = 'force-dynamic'
import { db, posts } from '@/lib/db'
export default async function Page() {
- let allPosts = await db.select().from(posts)
+ const allPosts = await db.select().from(posts)
return (
{allPosts.map((post) => (
@@ -144,7 +144,7 @@ export default async function Page() {
import { db, posts } from '@/lib/db'
export default async function Page() {
- let allPosts = await db.select().from(posts)
+ const allPosts = await db.select().from(posts)
return (
{allPosts.map((post) => (
@@ -158,21 +158,21 @@ export default async function Page() {
-このルートの他の場所で[Dynamic APIs](/docs/app/building-your-application/rendering/server-components#dynamic-rendering)を使用していない場合、`next build`中にこのページは静的ページとして事前レンダリングされます。その後、データは[Incremental Static Regeneration](/docs/app/building-your-application/data-fetching/incremental-static-regeneration)を使用して更新できます。
+このルート内で他の[ダイナミックAPI](/docs/app/building-your-application/rendering/server-components#dynamic-rendering)を使用していない場合、`next build`中に静的ページとしてプリレンダリングされます。その後、データは[Incremental Static Regeneration](/docs/app/building-your-application/data-fetching/incremental-static-regeneration)を使用して更新できます。
-ページの事前レンダリングを防ぐには、以下をファイルに追加します:
+プリレンダリングを防ぐには、ファイルに以下を追加できます。
```js
export const dynamic = 'force-dynamic'
```
-ただし、多くの場合、`cookies`、`headers`、またはページpropsからの`searchParams`を読み取る関数を使用します。これによりページは自動的に動的にレンダリングされます。この場合、`force-dynamic`を明示的に使用する必要はありません。
+ただし、通常は、`cookies`や`headers`、ページのpropsからの`searchParams`を読み取る関数を使用することが多く、その場合はページが自動的に動的にレンダリングされます。この場合、`force-dynamic`を明示的に使用する必要はありません。
-### クライアントでデータを取得する {#fetching-data-on-the-client}
+### クライアントでのデータ取得 {#fetching-data-on-the-client}
-最初にサーバーサイドでデータを取得することをお勧めします。
+まずはサーバーサイドでのデータ取得を試みることをお勧めします。
-ただし、クライアントサイドのデータ取得が理にかなう場合もあります。その際には、`useEffect`で手動で`fetch`を呼び出す(推奨されません)か、クライアント取得のためにコミュニティの人気のあるReactライブラリ(例:[SWR](https://swr.vercel.app/)や[React Query](https://tanstack.com/query/latest))を利用することができます。
+しかし、クライアント側でのデータ取得が適しているケースもあります。こういったシナリオでは、`useEffect`内で手動で`fetch`を呼び出す(非推奨)、またはクライアントフェッチングのためにコミュニティの人気のReactライブラリ([SWR](https://swr.vercel.app/) や [React Query](https://tanstack.com/query/latest)など)を利用することができます。
@@ -187,8 +187,8 @@ export function Posts() {
useEffect(() => {
async function fetchPosts() {
- let res = await fetch('https://api.vercel.app/blog')
- let data = await res.json()
+ const res = await fetch('https://api.vercel.app/blog')
+ const data = await res.json()
setPosts(data)
}
fetchPosts()
@@ -219,8 +219,8 @@ export function Posts() {
useEffect(() => {
async function fetchPosts() {
- let res = await fetch('https://api.vercel.app/blog')
- let data = await res.json()
+ const res = await fetch('https://api.vercel.app/blog')
+ const data = await res.json()
setPosts(data)
}
fetchPosts()
@@ -241,9 +241,9 @@ export function Posts() {
-### ORMまたはデータベースによるデータキャッシュ {#caching-data-with-an-orm-or-database}
+### ORMやデータベースを使用したデータのキャッシング {#caching-data-with-an-orm-or-database}
-`unstable_cache` APIを使用してレスポンスをキャッシュし、`next build`実行時にページを事前レンダリングすることができます。
+ページを`next build`を実行した際にプリレンダリングできるように応答をキャッシュするために`unstable_cache` APIを使用できます。
@@ -304,22 +304,22 @@ export default async function Page() {
-この例では、データベースクエリの結果を1時間(3600秒)キャッシュしています。また、キャッシュタグ`posts`を追加しており、後で[Incremental Static Regeneration](/docs/app/building-your-application/data-fetching/incremental-static-regeneration)でインバリデートすることができます。
+この例では、データベースクエリーの結果を1時間(3600秒)キャッシュします。また、キャッシュタグ`posts`を追加し、それを[Incremental Static Regeneration](/docs/app/building-your-application/data-fetching/incremental-static-regeneration)で無効化できます。
-### 複数の関数でデータを再利用する {#reusing-data-across-multiple-functions}
+### 複数の関数間でデータを再利用する {#reusing-data-across-multiple-functions}
-Next.jsは、`generateMetadata`や`generateStaticParams`といったAPIを使用します。これらのAPIでは、`page`で取得したデータを使う必要があります。
+Next.jsは、`generateMetadata`や`generateStaticParams`といったAPIを使用して、`page`で取得した同じデータを利用する必要があります。
-もし`fetch`を使用している場合、リクエストに`cache: 'force-cache'`を追加するとリクエストが[メモ化](/docs/app/building-your-application/caching#request-memoization)されます。これにより、同じオプションで同じURLを安全に呼び出すことができ、リクエストは1回のみ行われます。
+もし`fetch`を使用している場合、リクエストは`cache: 'force-cache'`を追加することで[メモ化](/docs/app/building-your-application/caching#request-memoization)できます。これは、同じURLを同じオプションで安全に呼び出せることを意味し、1つのリクエストしか行われません。
-> **Good to know:**
+> **覚えておくと良いこと:**
>
-> - 以前のバージョンのNext.jsでは、`fetch`を使用するとデフォルトの`cache`値は`force-cache`でした。バージョン15では、デフォルトが`cache: no-store`に変更されました。
+> - 以前のバージョンのNext.jsでは、`fetch`を使用するとデフォルトの`cache`値は`force-cache`でした。これはバージョン15で変更され、デフォルトが`cache: no-store`になりました。
-```tsx title="app/page.tsx" switcher
+```tsx title="app/blog/[id]/page.tsx" switcher
import { notFound } from 'next/navigation'
interface Post {
@@ -329,21 +329,21 @@ interface Post {
}
async function getPost(id: string) {
- let res = await fetch(`https://api.vercel.app/blog/${id}`, {
+ const res = await fetch(`https://api.vercel.app/blog/${id}`, {
cache: 'force-cache',
})
- let post: Post = await res.json()
+ const post: Post = await res.json()
if (!post) notFound()
return post
}
export async function generateStaticParams() {
- let posts = await fetch('https://api.vercel.app/blog', {
+ const posts = await fetch('https://api.vercel.app/blog', {
cache: 'force-cache',
}).then((res) => res.json())
return posts.map((post: Post) => ({
- id: post.id,
+ id: String(post.id),
}))
}
@@ -352,7 +352,8 @@ export async function generateMetadata({
}: {
params: Promise<{ id: string }>
}) {
- let post = await getPost(params.id)
+ const { id } = await params
+ const post = await getPost(id)
return {
title: post.title,
@@ -364,7 +365,8 @@ export default async function Page({
}: {
params: Promise<{ id: string }>
}) {
- let post = await getPost(params.id)
+ const { id } = await params
+ const post = await getPost(id)
return (
@@ -378,28 +380,29 @@ export default async function Page({
-```jsx title="app/page.js" switcher
+```jsx title="app/blog/[id]/page.js" switcher
import { notFound } from 'next/navigation'
async function getPost(id) {
- let res = await fetch(`https://api.vercel.app/blog/${id}`)
- let post = await res.json()
+ const res = await fetch(`https://api.vercel.app/blog/${id}`)
+ const post = await res.json()
if (!post) notFound()
return post
}
export async function generateStaticParams() {
- let posts = await fetch('https://api.vercel.app/blog').then((res) =>
+ const posts = await fetch('https://api.vercel.app/blog').then((res) =>
res.json()
)
return posts.map((post) => ({
- id: post.id,
+ id: String(post.id),
}))
}
export async function generateMetadata({ params }) {
- let post = await getPost(params.id)
+ const { id } = await params
+ const post = await getPost(id)
return {
title: post.title,
@@ -407,7 +410,8 @@ export async function generateMetadata({ params }) {
}
export default async function Page({ params }) {
- let post = await getPost(params.id)
+ const { id } = await params
+ const post = await getPost(id)
return (
@@ -421,11 +425,11 @@ export default async function Page({ params }) {
-もし`fetch`を使用していない場合、ORMやデータベースを直接使用する代わりに、Reactの`cache`関数でデータ取得をラップできます。これにより重複が排除され、クエリは1回のみ行われます。
+`fetch`を使用せず、ORMやデータベースを直接使用している場合、データ取得をReactの`cache`関数で包むことができます。これにより、重複排除され、1つのクエリーだけが行われます。
```jsx
import { cache } from 'react'
-import { db, posts, eq } from '@/lib/db' // Drizzle ORMでの例
+import { db, posts, eq } from '@/lib/db' // Drizzle ORMを例に
import { notFound } from 'next/navigation'
export const getPost = cache(async (id) => {
@@ -440,47 +444,48 @@ export const getPost = cache(async (id) => {
### キャッシュされたデータの再検証 {#revalidating-cached-data}
-[Incremental Static Regeneration](/docs/app/building-your-application/data-fetching/incremental-static-regeneration)を使用したキャッシュされたデータの再検証について詳しく学びましょう。
+[Incremental Static Regeneration](/docs/app/building-your-application/data-fetching/incremental-static-regeneration)を使用してキャッシュされたデータを再検証する方法について学びます。
## パターン {#patterns}
-### 並列および逐次データ取得 {#parallel-and-sequential-data-fetching}
+### 並行および順次フェッチング {#parallel-and-sequential-data-fetching}
-コンポーネント内でデータを取得する際には、並列および逐次の2つのデータ取得パターンを意識する必要があります。
+コンポーネント内でデータをフェッチする際、2つのフェッチングパターン:並行および順次フェッチングを知っておく必要があります。
-- **逐次**: コンポーネントtree内でリクエストが互いに依存している。この結果、読み込み時間が長くなることがあります
-- **並列**: route内のリクエストが積極的に開始され、データは同時に読み込まれます。これにより、データの読み込みにかかる全体の時間が短縮されます
+- **順次**: コンポーネントtree内のリクエストが互いに依存し合う。これによりロード時間が長くなることがあります
+- **並行**: ルート内のリクエストは先に開始され、データを同時にロードします。これによりデータロードにかかる総時間が短縮されます
-#### 逐次データ取得 {#sequential-data-fetching}
+#### 順次フェッチング {#sequential-data-fetching}
-ネストされたコンポーネントがあり、各コンポーネントが独自にデータを取得する場合、これらのデータリクエストが[メモ化](/docs/app/building-your-application/caching#request-memoization)されていない場合、データ取得は逐次的に行われます。
+ネストされたコンポーネントがあり、それぞれのコンポーネントが自身のデータをフェッチする場合、これらのデータリクエストが[メモ化](/docs/app/building-your-application/caching#request-memoization)されていないと、データフェッチングは順次に行われます。
-このパターンが望ましい場合もあります。たとえば、`Playlists`コンポーネントは`Artist`コンポーネントがデータ取得を完了してからデータを取得し始めます。`Playlists`は`artistID` propに依存しているためです:
+このパターンが望まれる場合があります。なぜなら1つのフェッチが他のフェッチの結果に依存するからです。例えば、`Playlists`コンポーネントは`Artist`コンポーネントのデータフェッチが完了しないとフェッチを開始しません。なぜなら、`Playlists`は`artistID` propに依存しているからです。
```tsx title="app/artist/[username]/page.tsx" switcher
export default async function Page({
- params: { username },
+ params,
}: {
params: Promise<{ username: string }>
}) {
- // アーティスト情報の取得
+ const { username } = await params
+ // アーティスト情報を取得
const artist = await getArtist(username)
return (
<>
{artist.name}
- {/* Playlistsコンポーネントの読み込み中にフォールバックUIを表示 */}
+ {/* Playlistsコンポーネントがロードされる間、フォールバックUIを表示 */}
Loading...}>
{/* アーティストIDをPlaylistsコンポーネントに渡す */}
@@ -490,7 +495,7 @@ export default async function Page({
}
async function Playlists({ artistID }: { artistID: string }) {
- // アーティストIDを使用してプレイリストを取得
+ // アーティストIDを使用してプレイリストをフェッチ
const playlists = await getArtistPlaylists(artistID)
return (
@@ -507,14 +512,15 @@ async function Playlists({ artistID }: { artistID: string }) {
```jsx title="app/artist/[username]/page.js" switcher
-export default async function Page({ params: { username } }) {
- // アーティスト情報の取得
+export default async function Page({ params }) {
+ const { username } = await params
+ // アーティスト情報を取得
const artist = await getArtist(username)
return (
<>
{artist.name}
- {/* Playlistsコンポーネントの読み込み中にフォールバックUIを表示 */}
+ {/* Playlistsコンポーネントがロードされる間、フォールバックUIを表示 */}
Loading...}>
{/* アーティストIDをPlaylistsコンポーネントに渡す */}
@@ -524,7 +530,7 @@ export default async function Page({ params: { username } }) {
}
async function Playlists({ artistID }) {
- // アーティストIDを使用してプレイリストを取得
+ // アーティストIDを使用してプレイリストをフェッチ
const playlists = await getArtistPlaylists(artistID)
return (
@@ -540,19 +546,19 @@ async function Playlists({ artistID }) {
-[`loading.js`](/docs/app/building-your-application/routing/loading-ui-and-streaming)(routeセグメント用)または[React ``](/docs/app/building-your-application/routing/loading-ui-and-streaming#streaming-with-suspense)(ネストされたコンポーネント用)を使用して、即時の読み込み状態を表示することができます。
+[`loading.js`](/docs/app/building-your-application/routing/loading-ui-and-streaming)(ルートセグメント用)または[React ``](/docs/app/building-your-application/routing/loading-ui-and-streaming#streaming-with-suspense)(ネストされたコンポーネント用)を使用して、結果がストリーミングされる間に即座に読み込み状態を表示することができます。
-これにより、データリクエストによってroute全体がブロックされるのを防ぎ、ユーザーは準備ができているページの部分と対話できるようになります。
+これにより、ルート全体がデータリクエストによってブロックされるのを防ぎ、ユーザーは準備ができたページの部分と対話できるようになります。
-#### 並列データ取得 {#parallel-data-fetching}
+#### 並行データフェッチング {#parallel-data-fetching}
-デフォルトで、レイアウトとページセグメントは並列にレンダリングされます。これにより、リクエストは並行して開始されます。
+デフォルトでは、レイアウトとページセグメントは並行でレンダリングされます。つまり、リクエストは並行して開始されます。
-しかし、`async`/`await`の特性上、同じセグメントまたはコンポーネント内で待たれるリクエストはそれ以下のリクエストをブロックします。
+しかし、`async`/`await`の性質上、同じセグメントやコンポーネント内で待機されたリクエストはその下にあるリクエストをブロックします。
-データを並列に取得するには、データを使用するコンポーネントの外側でリクエストを定義して積極的に開始します。これにより、両方のリクエストが並行して開始され時間を節約しますが、両方のプロミスが解決されるまでユーザーはレンダリングされた結果を目にすることはありません。
+データを並行でフェッチするためには、データを使用するコンポーネントの外部でリクエストを事前に定義することでリクエストを先行して開始できます。これにより、リクエストを並行で開始して時間を節約できます。ただし、両方のプロミスが解決されるまでレンダリング結果は表示されません。
-下の例では、`getArtist`と`getAlbums`関数が`Page`コンポーネントの外側に定義され、コンポーネント内で`Promise.all`を使用して開始されます:
+以下の例では、`getArtist`と`getAlbums`関数は`Page`コンポーネントの外で定義され、`Promise.all`を使用してコンポーネント内で開始されます。
@@ -571,14 +577,15 @@ async function getAlbums(username: string) {
}
export default async function Page({
- params: { username },
+ params,
}: {
params: Promise<{ username: string }>
}) {
+ const { username } = await params
const artistData = getArtist(username)
const albumsData = getAlbums(username)
- // 両方のリクエストを並行して開始する
+ // 両方のリクエストを並行で開始
const [artist, albums] = await Promise.all([artistData, albumsData])
return (
@@ -606,11 +613,12 @@ async function getAlbums(username) {
return res.json()
}
-export default async function Page({ params: { username } }) {
+export default async function Page({ params }) {
+ const { username } = await params
const artistData = getArtist(username)
const albumsData = getAlbums(username)
- // 両方のリクエストを並行して開始する
+ // 両方のリクエストを並行で開始
const [artist, albums] = await Promise.all([artistData, albumsData])
return (
@@ -625,13 +633,13 @@ export default async function Page({ params: { username } }) {
-さらに、[Suspense Boundary](/docs/app/building-your-application/routing/loading-ui-and-streaming)を追加することで、レンダリング作業を分割し可能な限り早く部分的な結果を表示することができます。
+また、[Suspense Boundary](/docs/app/building-your-application/routing/loading-ui-and-streaming)を追加して、レンダリング作業を分割し、結果の一部をできるだけ早く表示することもできます。
-### データの事前ロード {#preloading-data}
+### データのプリロード {#preloading-data}
-ウォーターフォールを防ぐもう1つの方法は、ユーティリティ関数を作成し、ブロッキングリクエストの上で積極的に呼び出す*preload*パターンを使用することです。たとえば、`checkIsAvailable()`は` `のレンダリングをブロックするので、`preload()`をその前に呼び出して` `のデータ依存関係を積極的に開始できます。` `がレンダリングされるとき、そのデータはすでに取得されています。
+滝の発生を防ぐもう1つの方法として、ユーティリティ関数を作成してブロッキングリクエストの上で意図的に呼び出すことによって、*プリロード*パターンを使用することです。たとえば、`checkIsAvailable()`が` `のレンダリングをブロックしますが、`preload()`をその前に呼び出すことで` `のデータ依存関係を意図的に開始できます。` `がレンダリングされるときにはそのデータがすでにフェッチされている状態になります。
-なお、`preload`関数は`checkIsAvailable()`の実行をブロックしません。
+注意すべき点は、`preload`関数が`checkIsAvailable()`の実行を妨げないということです。
@@ -640,7 +648,7 @@ export default async function Page({ params: { username } }) {
import { getItem } from '@/utils/get-item'
export const preload = (id: string) => {
- // voidは指定された式を評価して未定義を返します。
+ // voidは与えられた式を評価してundefinedを返します
// https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/void
void getItem(id)
}
@@ -657,7 +665,7 @@ export default async function Item({ id }: { id: string }) {
import { getItem } from '@/utils/get-item'
export const preload = (id) => {
- // voidは指定された式を評価して未定義を返します。
+ // voidは与えられた式を評価してundefinedを返します
// https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/void
void getItem(id)
}
@@ -677,13 +685,14 @@ export default async function Item({ id }) {
import Item, { preload, checkIsAvailable } from '@/components/Item'
export default async function Page({
- params: { id },
+ params,
}: {
params: Promise<{ id: string }>
}) {
+ const { id } = await params
// アイテムデータの読み込みを開始
preload(id)
- // 他の非同期タスクを実行
+ // 別の非同期タスクを実行
const isAvailable = await checkIsAvailable()
return isAvailable ? : null
@@ -696,10 +705,11 @@ export default async function Page({
```jsx title="app/item/[id]/page.js" switcher
import Item, { preload, checkIsAvailable } from '@/components/Item'
-export default async function Page({ params: { id } }) {
+export default async function Page({ params }) {
+ const { id } = await params
// アイテムデータの読み込みを開始
preload(id)
- // 他の非同期タスクを実行
+ // 別の非同期タスクを実行
const isAvailable = await checkIsAvailable()
return isAvailable ? : null
@@ -709,11 +719,11 @@ export default async function Page({ params: { id } }) {
-> **Good to know:** "preload"関数はAPIではなくパターンであるため、任意の名前を持つことができます。
+> **覚えておくと良いこと:** "preload"関数はAPIではなくパターンであるため、任意の名前を持つことができます。
-#### Reactの`cache`と`server-only`を使用したPreloadパターン {#using-react-cache-and-server-only-with-the-preload-pattern}
+#### React `cache`および`server-only`とPreloadパターンの使用 {#using-react-cache-and-server-only-with-the-preload-pattern}
-`cache`関数、preloadパターン、`server-only`パッケージを組み合わせて、アプリ全体で使用可能なデータ取得ユーティリティを作成することができます。
+`cache`関数、`preload`パターンと`server-only`パッケージを組み合わせることで、アプリ全体で利用できるデータ取得ユーティリティを作成できます。
@@ -750,19 +760,19 @@ export const getItem = cache(async (id) => {
-このアプローチを使用すると、データを積極的に取得し、レスポンスをキャッシュし、このデータ取得が[サーバー上でのみ行われることを保証](/docs/app/building-your-application/rendering/composition-patterns#keeping-server-only-code-out-of-the-client-environment)することができます。
+このアプローチを使用すると、データを先行して取得し、応答をキャッシュし、このデータ取得が[サーバーでのみ発生すること](/docs/app/building-your-application/rendering/composition-patterns#keeping-server-only-code-out-of-the-client-environment)を保証します。
-`utils/get-item`エクスポートは、レイアウト、ページ、または他のコンポーネントによって使用され、アイテムのデータ取得のタイミングを制御することができます。
+`utils/get-item`のエクスポートは、Layouts、Pages、その他のコンポーネントで使用でき、いつアイテムのデータを取得するかの制御を提供します。
-> **Good to know:**
+> **覚えておくと良いこと:**
>
-> - サーバー側のデータ取得関数がクライアントで使用されないことを確認するために、[`server-only`パッケージ](/docs/app/building-your-application/rendering/composition-patterns#keeping-server-only-code-out-of-the-client-environment)を使用することを推奨します。
+> - クライアントでサーバーデータ取得関数が使用されないことを確認するために、[`server-only`パッケージ](/docs/app/building-your-application/rendering/composition-patterns#keeping-server-only-code-out-of-the-client-environment)を使用することをお勧めします。
-### クライアントへの機密データの露出を防ぐ {#preventing-sensitive-data-from-being-exposed-to-the-client}
+### クライアントに機密データが露出しないようにする {#preventing-sensitive-data-from-being-exposed-to-the-client}
-オブジェクトインスタンスや機密値全体がクライアントに渡されないようにするために、Reactの汚染API、[`taintObjectReference`](https://react.dev/reference/react/experimental_taintObjectReference)および[`taintUniqueValue`](https://react.dev/reference/react/experimental_taintUniqueValue)を使用することをお勧めします。
+ReactのタイントAPI、[`taintObjectReference`](https://react.dev/reference/react/experimental_taintObjectReference)と[`taintUniqueValue`](https://react.dev/reference/react/experimental_taintUniqueValue)を使用して、オブジェクトインスタンス全体や機密値がクライアントに渡されないようにすることをお勧めします。
-アプリケーションで汚染を有効にするには、Next.js Configの`experimental.taint`オプションを`true`に設定します:
+アプリケーションでのタイントの有効化は、Next.jsのConfigオプション`experimental.taint`を`true`に設定することで行います。
```js title="next.config.js"
module.exports = {
@@ -772,7 +782,7 @@ module.exports = {
}
```
-次に、`experimental_taintObjectReference`または`experimental_taintUniqueValue`関数に渡したいオブジェクトまたは値を渡します:
+その後、`experimental_taintObjectReference`または`experimental_taintUniqueValue`関数にタイントしたいオブジェクトや値を渡します。
@@ -787,11 +797,11 @@ import {
export async function getUserData() {
const data = await queryDataFromDB()
experimental_taintObjectReference(
- 'Do not pass the whole user object to the client',
+ 'ユーザーオブジェクト全体をクライアントに送信しないでください',
data
)
experimental_taintUniqueValue(
- "Do not pass the user's address to the client",
+ 'ユーザーの住所をクライアントに送信しないでください',
data,
data.address
)
@@ -812,11 +822,11 @@ import {
export async function getUserData() {
const data = await queryDataFromDB()
experimental_taintObjectReference(
- 'Do not pass the whole user object to the client',
+ 'ユーザーオブジェクト全体をクライアントに送信しないでください',
data
)
experimental_taintUniqueValue(
- "Do not pass the user's address to the client",
+ 'ユーザーの住所をクライアントに送信しないでください',
data,
data.address
)
@@ -837,8 +847,8 @@ export async function Page() {
const userData = getUserData()
return (
)
}
@@ -854,8 +864,8 @@ export async function Page() {
const userData = await getUserData()
return (
)
}
diff --git a/docs/01-app/02-building-your-application/02-data-fetching/03-server-actions-and-mutations.mdx b/docs/01-app/02-building-your-application/02-data-fetching/03-server-actions-and-mutations.mdx
index a9987446..c6b3e365 100644
--- a/docs/01-app/02-building-your-application/02-data-fetching/03-server-actions-and-mutations.mdx
+++ b/docs/01-app/02-building-your-application/02-data-fetching/03-server-actions-and-mutations.mdx
@@ -1,24 +1,24 @@
---
-title: 'Server Actions とデータ変更'
-nav_title: 'Server Actions とデータ変更'
-description: 'Next.jsを用いたフォーム送信とデータ変更の処理方法を学びましょう。'
+title: 'Server Actions and Mutations'
+nav_title: 'Server Actions and Mutations'
+description: 'Next.js でのフォーム送信とデータ変異の処理方法を学びましょう。'
related:
- description: 'Next.jsにおけるServer Actionsの設定方法を学びましょう'
+ description: 'Next.jsでサーバーアクションの設定方法を学びましょう'
links:
- app/api-reference/config/next-config-js/serverActions
---
-[Server Actions](https://react.dev/reference/rsc/server-actions) は **非同期関数** であり、サーバー上で実行されます。これらはServerおよびClient Componentsの中で、Next.jsアプリケーションでのフォーム送信とデータの変更を管理するために呼び出すことができます。
+[Server Actions](https://react.dev/reference/rsc/server-actions)は、**非同期関数**で、サーバー上で実行されます。これらは、Next.jsアプリケーションでのフォーム送信およびデータ変異を処理するために、ServerとClient Componentで呼び出すことができます。
-> **🎥 視聴:** Server Actions を用いたデータ変更について詳しく学びましょう → [YouTube (10 分)](https://youtu.be/dDpZfOQBMaU?si=cJZHlUu_jFhCzHUg)。
+> **🎥 視聴:** サーバーアクションを使った変異についてもっと知りましょう → [YouTube (10分)](https://youtu.be/dDpZfOQBMaU?si=cJZHlUu_jFhCzHUg)。
## 規約 {#convention}
-Server Action はReactの[`"use server"`](https://react.dev/reference/react/use-server)ディレクティブを用いて定義できます。非同期関数の上部にディレクティブを置いて、関数をServer Actionとしてマークするか、別ファイルの上部にディレクティブを置いて、そのファイルのすべてのエクスポートをServer Actionとしてマークすることができます。
+Server Actionは、Reactの[`"use server"`](https://react.dev/reference/react/use-server)ディレクティブを使用して定義できます。このディレクティブを`async`関数の上に配置してその関数をServer Actionとしてマークするか、または別のファイルの上に配置してそのファイルのすべてのエクスポートをServer Actionsとしてマークすることができます。
### Server Components {#server-components}
-Server Components は、インライン関数レベルまたはモジュールレベルで`"use server"`ディレクティブを使用できます。Server Actionをインラインで使うには、関数本体の上部に`"use server"`を追加してください:
+Server Componentは、インライン関数レベルまたはモジュールレベルの`"use server"`ディレクティブを使用できます。Server Actionをインライン化するには、関数本体の上に`"use server"`を追加してください:
@@ -28,7 +28,7 @@ export default function Page() {
// Server Action
async function create() {
'use server'
- // データを変更する
+ // データを変異させる
}
return '...'
@@ -43,7 +43,7 @@ export default function Page() {
// Server Action
async function create() {
'use server'
- // データを変更する
+ // データを変異させる
}
return '...'
@@ -55,7 +55,7 @@ export default function Page() {
### Client Components {#client-components}
-Client ComponentでServer Actionを呼び出すには、新しいファイルを作成して、その上部に「use server」ディレクティブを追加します。そのファイル内でエクスポートされるすべての関数が、ClientとServer Componentの両方で再利用可能なServer Actionとしてマークされます。
+Client ComponentでServer Actionを呼び出すには、新しいファイルを作成し、その上に`"use server"`ディレクティブを追加してください。ファイル内のすべてのエクスポートされた関数は、ClientとServer Componentの両方で再利用可能なServer Actionsとしてマークされます:
@@ -107,9 +107,9 @@ export function Button() {
-### アクションを props として渡す {#passing-actions-as-props}
+### アクションをpropsとして渡す {#passing-actions-as-props}
-Server Action を Client Component に props として渡すこともできます:
+Server ActionをClient Componentにpropとして渡すことも可能です:
```jsx
@@ -144,29 +144,32 @@ export default function ClientComponent({ updateItemAction }) {
-通常、Next.js TypeScriptプラグインは `client-component.tsx` の `updateItemAction` を警告しますが、これは一般にクライアント側とサーバー側の境界を越えてシリアル化できない関数だからです。しかし、`action` として名前付けされた props または `Action` で終了する props は Server Actions を受け取ることが想定されています。これはあくまでヒューリスティックであり、TypeScriptプラグインは実際に Server Action を受け取っているか、通常の関数を受け取っているかはわかりません。ランタイム型チェックにより、間違って関数をClient Componentに渡さないようにします。
-
-## 行動 {#behavior}
-
-- Server actionは、[`}>
- {/* その他のページコンテンツ */}
+ {/* ページの他のコンテンツ */}
)
}
```
-> **Good to know**: 外部プラットフォームからビデオを埋め込む際には、以下のベストプラクティスを検討してください:
+> **Good to know**: 外部プラットフォームからビデオを埋め込む際には、以下のベストプラクティスを考慮してください:
>
-> - ビデオ埋め込みがレスポンシブであることを確認すること。CSSを使用してiframeやビデオプレーヤーが異なる画面サイズに適応するようにします。
-> - 特にデータプランが制限されているユーザーには、ネットワーク条件に基づいた[ビデオ読み込み戦略](https://yoast.com/site-speed-tips-for-faster-video/)を実装すること
+> - ビデオ埋め込みがレスポンシブであることを確認します。CSSを使用してiframeまたはビデオプレーヤーを異なる画面サイズに適応させます。
+> - ネットワーク条件に基づいて[ビデオの読み込み戦略](https://yoast.com/site-speed-tips-for-faster-video/)を実装し、特にデータプランが限られているユーザーに対応します。
-このアプローチは、ページのブロッキングを防ぐため、ユーザーがビデオコンポーネントがストリーム中でもページと相互作用できるため、より良いユーザー体験をもたらします。
+このアプローチは、ページがブロックされないため、ビデオコンポーネントがストリーミングされる間、ユーザーがページと対話できるため、より良いユーザー体験を提供します。
-より魅力的で情報量のある読み込み体験を提供するために、フォールバックUIとして読み込みスケルトンを使用することを検討してください。単純な読み込みメッセージを表示する代わりに、ビデオプレーヤーを模したスケルトンを表示することができます。
+より魅力的で情報豊富な読み込み体験を提供するために、フォールバックUIとして読み込みスケルトンを使用することを検討してください。シンプルな読み込みメッセージを表示する代わりに、このようにビデオプレーヤーに似たスケルトンを表示することができます:
```jsx title="app/page.jsx"
import { Suspense } from 'react'
@@ -151,34 +146,34 @@ export default function Page() {
}>
- {/* その他のページコンテンツ */}
+ {/* ページの他のコンテンツ */}
)
}
```
-## 自己ホストビデオ {#self-hosted-videos}
+## 自己ホストされたビデオ {#self-hosted-videos}
-自己ホスト型のビデオは以下の理由で好まれる場合があります:
+ビデオの自己ホストを選択する理由はいくつかあります:
-- **完全なコントロールと独立性**:自己ホスト型は、ビデオコンテンツの再生から外観まで、外部プラットフォームの制約から解放され、完全な所有権とコントロールを確保します
-- **特定のニーズに合わせたカスタマイズ**:動的なバックグラウンドビデオなどのユニークな要件に最適で、デザインと機能のニーズに合わせたカスタマイズが可能です
-- **パフォーマンスとスケーラビリティの考慮**:性能が高くスケーラブルなストレージソリューションを選び、増加するトラフィックとコンテンツサイズに効果的に対応できます
-- **コストと統合**:Next.jsフレームワークや広範な技術エコシステムへの簡単な統合の必要性に対して、ストレージと帯域幅のコストをバランスさせます
+- **完全な管理と独立性**: ビデオコンテンツを直接管理でき、再生から外観に至るまで、外部プラットフォームの制約を受けずに完全な所有権と制御が可能です
+- **特定のニーズに合わせたカスタマイズ**: 動的背景ビデオのような特別な要件に理想的で、デザインや機能のニーズに合ったカスタマイズが可能です
+- **パフォーマンスとスケーラビリティの考慮**: 高性能かつスケーラブルなストレージソリューションを選択し、増え続けるトラフィックとコンテンツのサイズに効果的に対応します
+- **コストと統合**: ストレージと帯域幅のコストを抑えつつ、Next.jsフレームワークやテクノロジーエコシステムに簡単に統合できるように心がけます
-### Vercel Blobを使ったビデオホスティング {#using-vercel-blob-for-video-hosting}
+### Vercel Blobを使用したビデオホスティング {#using-vercel-blob-for-video-hosting}
-[Vercel Blob](https://vercel.com/docs/storage/vercel-blob?utm_source=next-site&utm_medium=docs&utm_campaign=next-website)は、効率的なビデオホスティングを提供するスケーラブルなクラウドストレージソリューションで、Next.jsとの相性が良好です。ここでは、Vercel Blobを使ってビデオをホストする方法を紹介します:
+[Vercel Blob](https://vercel.com/docs/storage/vercel-blob?utm_source=next-site&utm_medium=docs&utm_campaign=next-website) は、Next.jsとよく連携するスケーラブルなクラウドストレージソリューションを提供し、ビデオを効率的にホストする方法を提供します。以下は、Vercel Blobを使用してビデオをホストする方法の例です:
-**1. Vercel Blobにビデオをアップロードする**
+**1. Vercel Blobへのビデオのアップロード**
-Vercelダッシュボードで「Storage」タブに移動し、[Vercel Blob](https://vercel.com/docs/storage/vercel-blob?utm_source=next-site&utm_medium=docs&utm_campaign=next-website)ストアを選択します。Blobテーブルの右上にある「Upload」ボタンをクリックします。次に、アップロードしたいビデオファイルを選択します。アップロードが完了すると、Blobテーブルにビデオファイルが表示されます。
+Vercelのダッシュボードで「Storage」タブに移動し、[Vercel Blob](https://vercel.com/docs/storage/vercel-blob?utm_source=next-site&utm_medium=docs&utm_campaign=next-website) ストアを選択します。Blobテーブルの右上にある「Upload」ボタンをクリックし、アップロードしたいビデオファイルを選択します。アップロードが完了すると、ビデオファイルがBlobテーブルに表示されます。
-また、Server Actionsを使用してビデオをアップロードすることもできます。詳細な手順については、[サーバー側アップロード](https://vercel.com/docs/storage/vercel-blob/server-upload)に関するVercelのドキュメントを参照してください。Vercelは[クライアント側アップロード](https://vercel.com/docs/storage/vercel-blob/client-upload)もサポートしています。この方法は特定のユースケースに適しているかもしれません。
+または、サーバーアクションを使用してビデオをアップロードすることもできます。詳細な手順については、[サーバーサイドアップロードに関するVercelのドキュメント](https://vercel.com/docs/storage/vercel-blob/server-upload) を参照してください。Vercelは[クライアントサイドアップロード](https://vercel.com/docs/storage/vercel-blob/client-upload) もサポートしており、この方法は特定のユースケースに適している場合があります。
-**2. Next.jsでビデオを表示する**
+**2. Next.jsでのビデオの表示**
-ビデオがアップロードされ保管されたら、Next.jsアプリケーションで表示できます。以下は、`