Skip to content

Commit 2bcf84e

Browse files
anmotiyanthomasdevryuappjp-knj
authored
i18n(ja): Update basics/astro-components.mdx (#11879)
Co-authored-by: Yan <[email protected]> Co-authored-by: ryu <[email protected]> Co-authored-by: knj <[email protected]>
1 parent e9d66a1 commit 2bcf84e

File tree

3 files changed

+181
-16
lines changed

3 files changed

+181
-16
lines changed

src/content/docs/ja/basics/astro-components.mdx

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,24 @@ title: コンポーネント
33
description: Astroコンポーネント構文の紹介です。
44
i18nReady: true
55
---
6+
import ReadMore from '~/components/ReadMore.astro';
67

78
**Astroコンポーネント**は、あらゆるAstroプロジェクトの基本的な構成要素です。クライアントサイドのランタイムを持たない、HTMLのみのテンプレートコンポーネントです。Astroコンポーネントは、`.astro`という拡張子により判別できます。
89

10+
:::note
11+
もしHTMLを知っているなら、あなたはすでに最初のAstroコンポーネントを書くのに十分な知識を持っています。
12+
13+
<ReadMore>詳しくは[テンプレート式のリファレンス](/ja/reference/astro-syntax/)のドキュメントをご覧ください。</ReadMore>
14+
:::
15+
916
Astroコンポーネントは非常に柔軟です。多くの場合、Astroコンポーネントは、ヘッダーやプロフィールカードのような、ページ上で**再利用可能なUI**を含むことになります。また、Astroコンポーネントには、SEO対策を容易にする共通の`<meta>`タグのコレクションのような、小さなHTMLのスニペットが含まれることもあります。Astroコンポーネントは、ページ全体のレイアウトを含められます。
1017

1118
Astroコンポーネントについて知っておくべきもっとも重要なことは、**クライアント上でレンダリングされない**ということです。コンポーネントはビルド時または[サーバーサイドレンダリング(SSR)](/ja/guides/on-demand-rendering/)によりオンデマンドにレンダリングされます。コンポーネントのフロントマターの内部にJavaScriptコードを含められますが、それらはすべて、ユーザーのブラウザに送られる最終的なページからは取り除かれます。その結果、デフォルトではJavaScriptが含められることはなく、より高速なサイトが実現します。
1219

1320
Astroコンポーネントがクライアントサイドでインタラクティビティを必要とする場合は、[標準のHTML`<script>`タグ](/ja/guides/client-side-scripts/)[UIフレームワークのコンポーネント](/ja/guides/framework-components/#インタラクティブなコンポーネント)を追加できます。
1421

22+
クライアントサイドでパーソナライズされた動的なコンテンツをレンダリングする必要があるコンポーネントの場合、[サーバーディレクティブ](/ja/reference/directives-reference/#サーバーディレクティブ)を追加することでサーバーレンダリングを遅延させることができます。これらの「サーバーアイランド」は、コンテンツが利用可能になった時点でレンダリングされ、ページ全体の読み込みを遅らせることはありません。
23+
1524
## コンポーネント構造
1625

1726
Astroコンポーネントは、**コンポーネントスクリプト****コンポーネントテンプレート**という2つの主要な部分で構成されています。それぞれのパーツは異なる役割を担いますが、この2つを組み合わせることで、使いやすさと、どんなものにも対応できる表現力を兼ね備えたフレームワークを提供しています。
@@ -51,8 +60,10 @@ const data = await fetch('SOME_SECRET_API_URL/users').then(r => r.json());
5160

5261
コードフェンスは、その中に書かれたJavaScriptを「囲い込む」ことを保証するために設計されています。コードがフロントエンドのアプリケーションに漏れたり、ユーザーの手に渡ったりしません。高コストなコードや機密性の高いコード(プライベートなデータベースの呼び出しなど)が、ユーザーのブラウザに届くことを心配せずに、安全にコードを書けます。
5362

54-
:::tip
55-
コンポーネントスクリプトの中には、TypeScriptも書けます!
63+
:::note
64+
AstroコンポーネントスクリプトはTypeScriptで記述されており、エディタツールやエラーチェックのためにJavaScriptに追加の構文を加えることができます。
65+
66+
<ReadMore>Astroの[組み込みTypeScriptサポート](/ja/guides/typescript/)についてさらに読む。</ReadMore>
5667
:::
5768

5869
### コンポーネントテンプレート
@@ -88,6 +99,11 @@ const { title } = Astro.props;
8899
{myFavoritePokemon.map((data) => <li>{data.name}</li>)}
89100
</ul>
90101
102+
<!-- コンポーネントのレンダリングを遅延させ、フォールバックの読み込みコンテンツを提供します: -->
103+
<Avatar server:defer>
104+
<svg slot="fallback" class="generic-avatar" transition:name="avatar">...</svg>
105+
</Avatar>
106+
91107
<!-- テンプレートディレクティブを使って、複数の文字列やオブジェクトからクラス名を作成できます -->
92108
<p class:list={["add", "dynamic", { classNames: true }]} />
93109
```
@@ -202,6 +218,8 @@ import Wrapper from '../components/Wrapper.astro';
202218

203219
このパターンは[Astroレイアウトコンポーネント](/ja/basics/layouts/)の基本です。HTMLコンテンツのページ全体を`<Layout></Layout>`タグで囲んでレイアウトコンポーネントに送り、そこで定義された共通のページ要素の中にレンダリングさせられます。
204220

221+
<ReadMore>[`Astro.slots` ユーティリティ関数](/ja/reference/astro-syntax/#astroslots)を読んで、スロットコンテンツにアクセスしてレンダリングする方法をさらに学びましょう。</ReadMore>
222+
205223
### 名前付きスロット
206224

207225
Astroコンポーネントは、名前付きスロットも使えます。これを利用すると、対応するスロット名を持つHTML要素のみをスロットの場所に渡せます。
@@ -252,7 +270,7 @@ import Wrapper from '../components/Wrapper.astro';
252270

253271
`<div>`でラップせずに複数のHTML要素をコンポーネントの`<slot/>`プレースホルダーに渡すには、[Astroの`<Fragment/>`コンポーネント](/ja/reference/astro-syntax/#フラグメント)`slot=""`属性を使用します。
254272

255-
```astro title="src/components/CustomTable.astro" "<slot name="header"/>" "<slot name="body"/>"
273+
```astro title="src/components/CustomTable.astro" '<slot name="header" />' '<slot name="body" />'
256274
---
257275
// ヘッドとボディのコンテンツ用の名前付きスロットプレースホルダーをもつカスタムテーブルを作成する
258276
---
@@ -264,7 +282,7 @@ import Wrapper from '../components/Wrapper.astro';
264282

265283
`slot=""`属性により`"header"``"body"`のコンテンツを指定して、複数の行と列のHTMLコンテンツを挿入します。個々のHTML要素にもスタイルを適用できます。
266284

267-
```astro title="src/components/StockTable.astro" {5-7, 9-13} '<Fragment slot="header">' '<Fragment slot="body">'
285+
```astro title="src/components/StockTable.astro" {5-7, 9-13} '<Fragment slot="header">' '<Fragment slot="body">' '</Fragment>'
268286
---
269287
import CustomTable from './CustomTable.astro';
270288
---
@@ -373,7 +391,7 @@ Astroは`.html`ファイルをコンポーネントとしてインポートし
373391

374392
HTMLコンポーネントは有効なHTMLしか含むことができず、そのためAstroコンポーネントの主要機能が制限されます。
375393
- フロントマターやサーバーサイドのインポート、動的な記法をサポートしません
376-
- すべての`<script>`タグはバンドルされずに残され、`is:inline`を持つ場合と同じように扱われます。
394+
- すべての`<script>`タグはバンドルされずに残され、[`is:inline`ディレクティブ](/ja/reference/directives-reference/#isinline)を持つ場合と同じように扱われます。
377395
- [`public/`フォルダにあるアセット](/ja/basics/project-structure/#public)のみを参照できます。
378396

379397
:::note
@@ -382,6 +400,4 @@ HTMLコンポーネント内の[`<slot />`要素](/ja/basics/astro-components/#
382400

383401
## 次のステップ
384402

385-
import ReadMore from '~/components/ReadMore.astro';
386-
387403
<ReadMore>Astroプロジェクトでの[UIフレームワークコンポーネント](/ja/guides/framework-components/)の使用方法について学びます。</ReadMore>

src/content/docs/ja/reference/astro-syntax.mdx

Lines changed: 143 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
---
2-
title: Astroの構文
3-
description: .astroコンポーネント構文の紹介。
2+
title: テンプレート式のリファレンス
43
i18nReady: true
54
---
65

7-
**HTMLを知っていれば、最初のAstroコンポーネントを書くには十分です。**
6+
Astroコンポーネントの構文はHTMLのスーパーセットです。この構文はHTMLやJSXを書いたことのある人にとって親しみやすいように設計され、コンポーネントやJavaScriptの式がサポートされています。
87

9-
Astroコンポーネントの構文はHTMLのスーパーセットです。この構文は[HTMLやJSXを書いたことのある人にとって親しみやすいように設計され](#astroとjsxの違い)、コンポーネントやJavaScriptの式がサポートされています。
108

119
## JSXライクな式
1210

@@ -45,7 +43,8 @@ const name = "Astro";
4543
```
4644

4745
:::caution
48-
HTML属性は文字列に変換されるため、関数やオブジェクトをHTML要素に渡すことはできません。たとえば、Astroコンポーネント内のHTML要素にイベントハンドラを割り当てることはできません。
46+
HTML属性は文字列に変換されるため、関数やオブジェクトをHTML要素に渡すことはできません。
47+
たとえば、Astroコンポーネント内のHTML要素にイベントハンドラを割り当てることはできません。
4948

5049
```astro title="dont-do-this.astro"
5150
---
@@ -98,7 +97,7 @@ const visible = true;
9897

9998
### 動的タグ
10099

101-
HTMLタグ名またはインポートされたコンポーネントを変数に設定することで、動的タグも使用できます。
100+
HTMLタグ名を変数に割り当てるか、コンポーネントのインポートを再割り当てすることで、動的タグも使用できます。
102101

103102
```astro title="src/components/DynamicTags.astro" /Element|(?<!My)Component/
104103
---
@@ -120,9 +119,9 @@ const Component = MyComponent;
120119

121120
### フラグメント
122121

123-
Astroでは`<Fragment> </Fragment>`または短縮形の`<> </>`を使用できます
122+
Astroでは `<> </>` 表記を使用でき、組み込みの `<Fragment />` コンポーネントを提供しています。このコンポーネントは、HTML文字列を注入するために [`set:*` ディレクティブ](/ja/reference/directives-reference/#sethtml) を追加する際に、ラッパー要素を避けるのに役立ちます
124123

125-
フラグメントは、次の例のように、[`set:*`ディレクティブ](/ja/reference/directives-reference/#sethtml)を使用する際にラッパー要素を避けるために役立ちます
124+
次の例では、`<Fragment />` コンポーネントを使用して段落テキストをレンダリングします
126125

127126
```astro title="src/components/SetHtml.astro" "Fragment"
128127
---
@@ -170,3 +169,139 @@ Astroでは、標準のHTMLコメントまたはJavaScriptスタイルのコメ
170169
:::caution
171170
HTMLスタイルのコメントはブラウザのDOMに含まれますが、JSのコメントはスキップされます。TODOメッセージやその他の開発専用の説明を残したい場合は、JavaScriptスタイルのコメントを使用することをお勧めします。
172171
:::
172+
173+
174+
## コンポーネントユーティリティ
175+
176+
### `Astro.slots`
177+
178+
`Astro.slots` には、Astroコンポーネントのスロットの子要素を変更するためのユーティリティ関数が含まれています。
179+
180+
#### `Astro.slots.has()`
181+
182+
<p>
183+
184+
**Type:** `(slotName: string) => boolean`
185+
</p>
186+
187+
`Astro.slots.has()` を使用して、特定のスロット名のコンテンツが存在するかどうかを確認できます。これは、スロットのコンテンツをラップしたいが、スロットが使用されている場合にのみラッパー要素をレンダリングしたい場合に便利です。
188+
189+
```astro title="src/pages/index.astro"
190+
---
191+
---
192+
<slot />
193+
194+
{Astro.slots.has('more') && (
195+
<aside>
196+
<h2>More</h2>
197+
<slot name="more" />
198+
</aside>
199+
)}
200+
```
201+
202+
#### `Astro.slots.render()`
203+
204+
<p>
205+
206+
**Type:** `(slotName: string, args?: any[]) => Promise<string>`
207+
</p>
208+
209+
`Astro.slots.render()` を使用して、スロットのコンテンツをHTML文字列として非同期にレンダリングできます。
210+
211+
```astro
212+
---
213+
const html = await Astro.slots.render('default');
214+
---
215+
<Fragment set:html={html} />
216+
```
217+
218+
:::note
219+
これは高度なユースケースです!ほとんどの場合、[`<slot />` 要素](/ja/basics/astro-components/#スロット)を使用してスロットのコンテンツをレンダリングする方が簡単です。
220+
:::
221+
222+
`Astro.slots.render()` は、2番目のオプションの引数として、任意の子関数に転送されるパラメータの配列を受け取ります。これは、カスタムユーティリティコンポーネントに役立ちます。
223+
224+
たとえば、この `<Shout />` コンポーネントは、`message` propを大文字に変換し、デフォルトスロットに渡します。
225+
226+
```astro title="src/components/Shout.astro" "await Astro.slots.render('default', [message])"
227+
---
228+
const message = Astro.props.message.toUpperCase();
229+
let html = '';
230+
if (Astro.slots.has('default')) {
231+
html = await Astro.slots.render('default', [message]);
232+
}
233+
---
234+
<Fragment set:html={html} />
235+
```
236+
237+
`<Shout />` の子として渡されたコールバック関数は、すべて大文字の `message` パラメータを受け取ります。
238+
239+
```astro title="src/pages/index.astro"
240+
---
241+
import Shout from "../components/Shout.astro";
242+
---
243+
<Shout message="slots!">
244+
{(message) => <div>{message}</div>}
245+
</Shout>
246+
247+
<!-- <div>SLOTS!</div> としてレンダリングされます -->
248+
```
249+
250+
コールバック関数は、`slot` 属性を持つHTML要素タグでラップすることで、名前付きスロットに渡すことができます。この要素はコールバックを名前付きスロットに転送するためにのみ使用され、ページにはレンダリングされません。
251+
252+
```astro
253+
<Shout message="slots!">
254+
<fragment slot="message">
255+
{(message) => <div>{message}</div>}
256+
</fragment>
257+
</Shout>
258+
```
259+
260+
ラッパータグには、標準のHTML要素またはコンポーネントとして解釈されない小文字のタグ(例:`<Fragment />` の代わりに `<fragment>`)を使用します。HTMLの `<slot>` 要素はAstroのスロットとして解釈されるため、使用しないでください。
261+
262+
### `Astro.self`
263+
264+
`Astro.self` を使用すると、Astroコンポーネントを再帰的に呼び出すことができます。この動作により、コンポーネントテンプレート内で `<Astro.self>` を使用して、Astroコンポーネントを自身の中からレンダリングできます。これは、大規模なデータストアやネストされたデータ構造を反復処理するのに役立ちます。
265+
266+
```astro
267+
---
268+
// NestedList.astro
269+
const { items } = Astro.props;
270+
---
271+
<ul class="nested-list">
272+
{items.map((item) => (
273+
<li>
274+
<!-- ネストされたデータ構造がある場合は、`<Astro.self>` をレンダリングします -->
275+
<!-- そして、再帰呼び出しでpropを渡すことができます -->
276+
{Array.isArray(item) ? (
277+
<Astro.self items={item} />
278+
) : (
279+
item
280+
)}
281+
</li>
282+
))}
283+
</ul>
284+
```
285+
286+
このコンポーネントは次のように使用できます。
287+
288+
```astro
289+
---
290+
import NestedList from './NestedList.astro';
291+
---
292+
<NestedList items={['A', ['B', 'C'], 'D']} />
293+
```
294+
295+
そして、次のようなHTMLをレンダリングします。
296+
297+
```html
298+
<ul class="nested-list">
299+
<li>A</li>
300+
<li>
301+
<ul class="nested-list">
302+
<li>B</li>
303+
<li>C</li>
304+
</ul>
305+
</li>
306+
<li>D</li>
307+
</ul>

src/content/docs/ja/reference/directives-reference.mdx

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ import api from '../db/api.js';
138138
<ShowHideButton client:idle />
139139
```
140140

141-
### `timeout`
141+
#### `timeout`
142142

143143
<p><Since v="4.15.0" /></p>
144144

@@ -224,6 +224,20 @@ Astro 2.6.0以降、インテグレーションを通じて独自の `client:*`
224224

225225
カスタムクライアントディレクティブの作成方法については、[`addClientDirective` API](/ja/reference/integrations-reference/#addclientdirective-option) のページを参照してください。
226226

227+
## サーバーディレクティブ
228+
229+
これらのディレクティブは、サーバーアイランドコンポーネントのレンダリング方法を制御します。
230+
231+
### `server:defer`
232+
233+
`server:defer` ディレクティブを使うと、そのコンポーネントがサーバーアイランドとなり、ページ全体のレンダリングとは別にオンデマンドでレンダリングされます。
234+
235+
<ReadMore>詳しくは[サーバーアイランド](/ja/guides/server-islands/)をご覧ください。</ReadMore>
236+
237+
```astro
238+
<Avatar server:defer />
239+
```
240+
227241
## スクリプトとスタイルのディレクティブ
228242

229243
これらのディレクティブは、HTMLの `<script>``<style>` タグでのみ使えます。ページ上のクライアントサイドJavaScriptとCSSの扱い方を制御するためのものです。

0 commit comments

Comments
 (0)