teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

構造化、コード例の追加

2025/01/11 02:06

投稿

honey32
honey32

スコア246

answer CHANGED
@@ -6,6 +6,8 @@
6
6
 
7
7
  ---
8
8
 
9
+ ## 1. 「Client Component だから SSR されない」は誤り
10
+
9
11
  まず、「Client Component だから SSR されない」と思っていらっしゃるとしたら、それは誤りです。
10
12
 
11
13
  Server Component (以下 SC)は、getServerSideProps と同様に「SSR のための、前段階の処理」であるに過ぎません。
@@ -14,6 +16,8 @@
14
16
 
15
17
  https://zenn.dev/yumemi_inc/articles/use-client-directive-explained-with-gssp
16
18
 
19
+ ## 2. 「パフォーマンスのために SSR にする」の解釈のしかたの誤り
20
+
17
21
  あと、巷で言われている「**CSR が重いから、SSR にすべき**」というのを、App Router に正しく翻訳すると、
18
22
 
19
23
  - 「CSR が重い」
@@ -24,8 +28,34 @@
24
28
 
25
29
  です。
26
30
 
31
+ ## 3. まとめ
32
+
27
33
  なので、無理に `app/layout.js` を SC 化する必要はありません。
28
34
 
29
35
  各ページ `app/hogehoge/page.js` を、`"use client"` なしで書けば、それは SC になり(**ここも、誤解なさっている可能性がありますが、重要なところです**)、その中で取得したデータを、ページ内の各部分に配分すれば良いのです。
30
36
 
31
- その「ページ内の各部分」は、SC であっても CC であっても、特に問題ありません。
37
+ その「ページ内の各部分」は、SC であっても CC であっても、特に問題ありません。
38
+
39
+ 以下のように書けます!
40
+
41
+ ```books/page.js
42
+ // "use client" が無いので、SC
43
+ import { BookList } from "./book-list.js";
44
+ import { getBooks } from "./get-books.js";
45
+
46
+ const BooksIndexPage = async () => {
47
+ const books = await getBooks();
48
+ return (
49
+ <div>
50
+ <BooksFilter />
51
+ <BooksList items={books} />
52
+ </div>
53
+ );
54
+ }
55
+ export default BooksIndexPage;
56
+ ```
57
+
58
+ ```books/book-list.js
59
+ "use client"
60
+ export const BookList = () => { // 以下略
61
+ ```