Skip to content

Commit fb6ee7e

Browse files
committed
migrate the rest of ja articles
1 parent d8f76c6 commit fb6ee7e

File tree

14 files changed

+4533
-9
lines changed

14 files changed

+4533
-9
lines changed

src/content/docs/docs/guides/examples/auth.mdx

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ sidebar:
44
order: 1
55
---
66

7-
import { FileTree } from '@astrojs/starlight/components';
7+
import { FileTree, Aside } from '@astrojs/starlight/components';
88

99
Broadly, authentication consists of the following steps:
1010

@@ -36,12 +36,14 @@ Here we created two components and exported them both in the index file of the s
3636

3737
If your app has a dialog for login that can be used on any page, consider making that dialog a widget. That way, you can still avoid too much decomposition, but have the freedom to reuse this dialog on any page.
3838

39-
- 📂 widgets
40-
- 📂 login-dialog
41-
- 📂 ui
42-
- 📄 LoginDialog.tsx
43-
- 📄 index.ts
44-
- other widgets…
39+
<FileTree>
40+
- widgets/
41+
- login-dialog/
42+
- ui/
43+
- LoginDialog.tsx
44+
- index.ts
45+
- ...
46+
</FileTree>
4547

4648
The rest of this guide is written for the dedicated page approach, but the same principles apply to the dialog widget.
4749

@@ -130,11 +132,11 @@ Another drawback of this approach is that if your backend returns an object of y
130132

131133
It's common for FSD projects to have an entity for a user and/or an entity for the current user. It can even be the same entity for both.
132134

133-
:::note
135+
<Aside>
134136

135137
The **current user** is also sometimes called "viewer" or "me". This is to distinguish the single authenticated user, with permissions and private information, from a list of all users with publicly accessible information.
136138

137-
:::
139+
</Aside>
138140

139141
To store the token in the User entity, create a reactive store in the `model` segment. That store can contain both the token and the user object.
140142

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
---
2+
title: FAQ
3+
---
4+
5+
import { Aside } from '@astrojs/starlight/components';
6+
7+
<Aside>
8+
9+
質問は、[Discordコミュニティ][discord][GitHub Discussions][github-discussions]、および[Telegramチャット][telegram]で聞くことができます。
10+
11+
</Aside>
12+
13+
### ツールキットやリンターはありますか? \{#is-there-a-toolkit-or-a-linter}
14+
15+
はい!CLI または IDE を通じてプロジェクトのアーキテクチャと [フォルダー ジェネレーター][ext-tools] をチェックするための [Steiger][ext-steiger] というリンターがあります。
16+
17+
### ページのレイアウト/テンプレートはどこに保存すればよいですか? \{#where-to-store-the-layouttemplate-of-pages}
18+
19+
シンプルなレイアウトテンプレートが必要な場合は、`shared/ui`に保存できます。より上層のレイヤーを使用する必要がある場合、いくつかのオプションがあります。
20+
21+
- レイアウトが本当に必要ですか?レイアウトが数行で構成されている場合、各ページにコードを重複させる方が合理的です。
22+
- レイアウトが必要な場合は、個別のウィジェットやページとして保存し、App層のルーター設定にそれらを組み合わせることができます。ネストされたルーティングも一つのオプションです。
23+
24+
### フィーチャーとエンティティの違いは何ですか? \{#what-is-the-difference-between-feature-and-entity}
25+
26+
<i>エンティティ</i>はアプリケーションが扱う現実世界の概念です。<i>フィーチャー</i>はユーザーに実際の価値を提供するインタラクションであり、ユーザーがエンティティで行いたいことです。
27+
28+
詳細および例については、参考書セクションの[スライスについてのページ][reference-entities]を参照してください。
29+
30+
### ページ/フィーチャー/エンティティを相互に埋め込むことはできますか? \{#can-i-embed-pagesfeaturesentities-into-each-other}
31+
32+
はい、しかし、この埋め込みはより上層のレイヤーで行う必要があります。例えば、ウィジェット内で両方のフィーチャーをインポートし、プロップス/子要素として一方のフィーチャーを他方に挿入することができます。
33+
34+
一方のフィーチャーを他方のフィーチャーからインポートすることはできません。これは[**レイヤーのインポートルール**][import-rule-layers]で禁止されています。
35+
36+
### Atomic Designはどうですか? \{#what-about-atomic-design}
37+
38+
現在、アトミックデザインをFeature-Sliced Designと一緒に使用することを義務付けていませんが、禁止もしていません。
39+
40+
アトミックデザインは、モジュールの`ui`セグメントにうまく適用できます。
41+
42+
### FSDに関する有用なリソース/記事などはありますか? \{#are-there-any-useful-resourcesarticlesetc-about-fsd}
43+
44+
はい! https://github.com/feature-sliced/awesome
45+
46+
### なぜFeature-Sliced Designが必要なのですか? \{#why-do-i-need-feature-sliced-design}
47+
48+
FSDは、プロジェクトの主要な価値を提供するコンポーネントの観点から、あなたとあなたのチームが迅速にプロジェクトを把握するのに役立ちます。標準化されたアーキテクチャは、オンボーディングを迅速化し、コード構造に関する議論を解決するのに役立ちます。FSDが作成された理由については、[モチベーション][motivation]のページを参照してください。
49+
50+
### 初心者の開発者にFSDのアーキテクチャ/設計方法論は必要ですか? \{#does-a-novice-developer-need-an-architecturemethodology}
51+
52+
おそらく必要です。
53+
54+
*通常、一人でプロジェクトを設計・開発する場合、すべてが順調に進みます。しかし、開発に中断が生じたり、新しい開発者がチームに加わると問題が発生します。*
55+
56+
### 認証コンテキストをどのように扱えばよいですか? \{#how-do-i-work-with-the-authorization-context}
57+
58+
[こちら](/docs/guides/examples/auth)で回答しています。
59+
60+
[ext-steiger]: https://github.com/feature-sliced/steiger
61+
[ext-tools]: https://github.com/feature-sliced/awesome?tab=readme-ov-file#tools
62+
[import-rule-layers]: /docs/reference/layers#import-rule-on-layers
63+
[reference-entities]: /docs/reference/layers#entities
64+
[motivation]: /docs/about/motivation
65+
[telegram]: https://t.me/feature_sliced
66+
[discord]: https://discord.gg/S8MzWTUsmp
67+
[github-discussions]: https://github.com/feature-sliced/documentation/discussions
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
---
2+
title: 概要
3+
sidebar:
4+
order: 1
5+
---
6+
7+
import { FileTree } from '@astrojs/starlight/components';
8+
9+
**Feature-Sliced Design** (FSD) とは、フロントエンドアプリケーションの設計方法論です。簡単に言えば、コードを整理するためのルールと規約の集大成です。FSDの主な目的は、ビジネス要件が絶えず変化する中で、プロジェクトをより理解しやすく、構造化されたものにすることです。
10+
11+
ルールのセットに加えて、FSDはツールチェーンでもあります。プロジェクトのアーキテクチャをチェックするための[リンター][ext-steiger]、CLIやIDEを通じた[フォルダージェネレーター][ext-tools]、および豊富な[実装例のコレクション][examples]があります。
12+
13+
## FSDは私のプロジェクトに適しているのか? \{#is-it-right-for-me}
14+
15+
FSDは、あらゆる規模のプロジェクトやチームに導入できます。以下の場合、あなたのプロジェクトに適しています。
16+
17+
- **フロントエンド**開発での使用(ウェブサイト、モバイル/デスクトップアプリケーションのインターフェース作成など)
18+
- **アプリケーション**開発での使用(ライブラリ開発ではない)
19+
20+
これだけです!使用するプログラミング言語、フレームワーク、状態管理ライブラリには制限がありません。尚、FSDを段階的に導入したり、モノレポで使用したり、アプリケーションをパッケージに分割し、それぞれにFSDを個別に導入することもできます!
21+
22+
既存のアーキテクチャからFSDに移行することを検討している場合は、現在のアーキテクチャがチームに**支障をきたしている**かどうかを確認してください。例えば、プロジェクトが大きくなりすぎて新機能の開発が効率的に行えない場合や、多くの新しいメンバーがチームに加わることが予想される場合です。現在のアーキテクチャが正常に機能している場合、変更する必要はないかもしれません。しかし、移行を決定した場合は、[移行セクション][migration]の推奨事項を確認してください。
23+
24+
## 基本的な例 \{#basic-example}
25+
26+
以下は、FSDを実装したシンプルなプロジェクトです。
27+
28+
<FileTree>
29+
- app/
30+
- pages/
31+
- shared/
32+
</FileTree>
33+
34+
これらのトップレベルのフォルダーは*レイヤー*と呼ばれます。詳しく見てみましょう。
35+
36+
<FileTree>
37+
- app/
38+
- routes/
39+
- analytics/
40+
- pages/
41+
- home/
42+
- article-reader/
43+
- ui/
44+
- api/
45+
- settings/
46+
- shared/
47+
- ui/
48+
- api/
49+
</FileTree>
50+
51+
`📂 pages`内のフォルダーは*スライス*と呼ばれます。スライスはドメイン(この場合はページ)ごとにレイヤーを分割します。
52+
53+
`📂 app``📂 shared`、および`📂 pages/article-reader`内のフォルダーは*セグメント*と呼ばれ、スライス(またはレイヤー)を技術的な目的に応じて分割します。
54+
55+
## 概念 \{#concepts}
56+
57+
レイヤー、スライス、セグメントは、以下の図に示されるように階層を形成します。
58+
59+
<figure>
60+
![FSDの概念の階層、以下に説明](../../../../../../static/img/visual_schema.jpg)
61+
62+
<figcaption style={{ fontStyle: "italic", fontSize: "0.9em" }}>
63+
<p>上の図には、左から右に「レイヤー」、「スライス」、「セグメント」とラベル付けされた3つの列があります。</p>
64+
<p>「レイヤー」列には、上から下に「app」、「processes」、「pages」、「widgets」、「features」、「entities」、「shared」とラベル付けされた7つの区分があります。「processes」区分は取り消し線が引かれています。「entities」区分は2番目の列「スライス」と接続されていて、2番目の列が「entities」の内容であることを示しています。</p>
65+
<p>「スライス」列には、上から下に「user」、「post」、「comment」とラベル付けされた3つの区分があります。「post」区分は「セグメント」列と同様に接続されていて、「post」の内容であることを示しています。</p>
66+
<p>「セグメント」列には、上から下に「ui」、「model」、「api」とラベル付けされた3つの区分があります。</p>
67+
</figcaption>
68+
</figure>
69+
70+
### レイヤー \{#layers}
71+
72+
レイヤーはすべてのFSDプロジェクトで標準化されています。すべてのレイヤーを使用する必要はありませんが、ネーミングは重要です。現在、7つのレイヤーが存在しています(上から下へ)。
73+
74+
1. App*(アップ) — アプリケーションの起動に必要なすべてのもの(ルーティング、エントリーポイント、グローバルスタイル、プロバイダーなど)
75+
2. Processes(プロセス、非推奨) — 複雑なページ間のシナリオ
76+
3. Pages(ページ) — ページ全体、またはネストされたルーティングの場合、ページの大部分
77+
4. Widgets(ウィジェット) — 大きな自己完結型の機能部分、またはインターフェースの大部分。通常はユーザーシナリオ全体を実装する
78+
5. Features(フィーチャー) — プロダクト機能の再利用可能な実装、つまりユーザーにビジネス価値をもたらすアクション
79+
6. Entities(エンティティ) — プロジェクトが扱うビジネスエンティティ、例えば`user``product`
80+
7. Shared*(シェアード) — 再利用可能なコード。特にプロジェクト/ビジネスの詳細から切り離されたもの
81+
82+
_* — App層とShared層のレイヤーは他のレイヤーとは異なり、スライスを持たず、直接セグメントで構成されています。_
83+
84+
レイヤーの特徴は、レイヤーのモジュールは、下層のレイヤーモジュールのみを知ることができ、その結果、レイヤーが下層のレイヤーからのみモジュールをインポートできることです。
85+
86+
### スライス \{#slices}
87+
88+
次にスライスがあり、レイヤーをドメインごとに分割します。スライスの名前は自由に付けることができ、いくつでも作成できます。スライスは、意味的に関連するコードをグループ化することで、プロジェクト内のナビゲーションをしやすくします。
89+
90+
スライスは同じレイヤーの他のスライスを使用できないため、スライス内のコードの強い結合とスライス間の弱い結合が保証されます。
91+
92+
### セグメント \{#segments}
93+
94+
スライス、およびApp層とShared層のレイヤーはセグメントで構成され、セグメントはその目的に応じてコードをグループ化します。セグメントの名前は標準で固定されていませんが、最も一般的な目的のためにいくつかの共通の名前があります。
95+
96+
- `ui` — 表示に関連するすべて: UIコンポーネント、日付フォーマッター、スタイルなど
97+
- `api` — バックエンドとのやり取り: リクエスト関数、データ型、マッパー
98+
- `model` — データモデル: バリデーションスキーマ、インターフェース、ストレージ、ビジネスロジック
99+
- `lib` — 他のモジュールが必要とするライブラリコード
100+
- `config` — 設定ファイルとフィーチャーフラグ
101+
102+
通常、これらのセグメントはほとんどのレイヤーに十分であるため、独自のセグメントはShared層やApp層でのみ作成されることが多いです。しかし、これは厳格なルールではありません。
103+
104+
## 利点 \{#advantages}
105+
106+
- **一貫性**
107+
構造が標準化されているため、プロジェクトがより一貫性を持ち、新しいメンバーのチームへの参加が容易になります。
108+
109+
- **変更とリファクタリングへの耐性**
110+
レイヤーのモジュールは、同じレイヤーや上層レイヤーの他のモジュールを使用できないため、アプリケーションの他の部分に予期しない影響を与えることなく、分離された変更を加えることができます。
111+
112+
- **ロジックの再利用制御**
113+
レベルに応じて、コードを非常に再利用可能にすることも、非常にローカルにすることもできます。
114+
これにより、**DRY**原則と実用性のバランスが保たれます。
115+
116+
- **ビジネスとユーザーのニーズに焦点を当てる**
117+
アプリケーションはビジネスドメインに分割され、命名にはビジネス用語の使用が奨励されるため、プロジェクトの他の無関係な部分に完全に精通することなく、プロダクトで有用な作業を行うことができます。
118+
119+
## 段階的な導入 \{#incremental-adoption}
120+
121+
既存のコードベースをFSDに移行したい場合は、以下の戦略をお勧めします。私たち自身の移行経験から、この方法は非常に効果的であることが分かりました。
122+
123+
1. App層とShared層のレイヤーを徐々に形成し、基盤を作る。
124+
125+
2. 既存のすべてのインターフェースコードをウィジェットとページに分散させる。FSDのルールに違反する依存関係があっても良い。
126+
127+
3. インポートのルール違反を徐々に修正しながら、エンティティやフィーチャーを抽出する。
128+
129+
リファクタリング中に新しい大きなエンティティを追加することや、部分的なリファクタリングは避けることをお勧めします。
130+
131+
## 次のステップ \{#next-steps}
132+
133+
- **FSDの考え方を理解したい?** [チュートリアル][tutorial]を読んでください。
134+
- **例を見て学びたい?** [実装例セクション][examples]にたくさんあります。
135+
- **質問がある?** [Discordチャンネル][ext-discord]にアクセスして、コミュニティに質問してください。
136+
137+
[tutorial]: /docs/get-started/tutorial
138+
[examples]: /examples
139+
[migration]: /docs/guides/migration/from-custom
140+
[ext-steiger]: https://github.com/feature-sliced/steiger
141+
[ext-tools]: https://github.com/feature-sliced/awesome?tab=readme-ov-file#tools
142+
[ext-discord]: https://discord.com/invite/S8MzWTUsmp

0 commit comments

Comments
 (0)