Skip to content

Commit 11e759d

Browse files
authored
feat: content/2.concepts/5.rendering-mode (#36)
* feat: content/2.concepts/5.rendering-mode * chore: lint config
1 parent 52ba6fc commit 11e759d

File tree

8 files changed

+189
-1
lines changed

8 files changed

+189
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<script setup lang="ts">
2+
const count = ref(0)
3+
function increment() {
4+
count.value++
5+
}
6+
7+
console.log('count.value:', count.value)
8+
</script>
9+
10+
<template>
11+
<button type="button" @click="increment">
12+
count is: {{ count }}
13+
</button>
14+
</template>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import type { GuideMeta } from '~/types/guides'
2+
3+
export const meta: GuideMeta = {
4+
startingFile: 'pages/index.vue',
5+
features: {
6+
fileTree: true,
7+
terminal: true,
8+
},
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<template>
2+
<NuxtPage />
3+
</template>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export default defineNuxtConfig({
2+
routeRules: {
3+
'/foo': { ssr: false },
4+
},
5+
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<script setup lang="ts">
2+
console.log('pages/foo.vue')
3+
</script>
4+
5+
<template>
6+
<h1>Rendering Modes</h1>
7+
<p>Foo</p>
8+
<p>
9+
<NuxtLink to="/">
10+
Index
11+
</NuxtLink>
12+
</p>
13+
</template>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<script setup lang="ts">
2+
console.log('pages/index.vue')
3+
</script>
4+
5+
<template>
6+
<h1>Rendering Modes</h1>
7+
<p>Index</p>
8+
<p>
9+
<NuxtLink to="/foo">
10+
Foo
11+
</NuxtLink>
12+
</p>
13+
</template>

content/2.concepts/5.rendering-modes/index.md

+126-1
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,136 @@
22
ogImage: true
33
---
44

5-
# Rendering Modes
5+
# レンダリングモード
66

77
<!-- TODO:
88
- Universal Rendering (as default)
99
- Client-side Rendering
1010
- Hybrid Rendering
1111
- Edge-Side Rendering?
1212
-->
13+
14+
Nuxt は様々なレンダリングモードをサポートしています。\
15+
具体的には、ユニバーサルレンダリング、クライアントサイドレンダリング、ハイブリッドレンダリングがあります。
16+
17+
デフォルトでは、ユニバーサルレンダリングが選択されています。\
18+
また、これらは `nuxt.config` で簡単に切り替えることができます。
19+
20+
## ユニバーサルレンダリング
21+
22+
ユニバーサルレンダリングでは、サーバーが完全にレンダリングされた HTML を返します。\
23+
これにより、ユーザーはアプリケーションのコンテンツをすぐに取得することができます。
24+
25+
また、ブラウザ上で HTML を読み込んだ後、インタラクションを必要とする動的な UI を構築するためにブラウザ上で JavaScript コードを読み込みます。\
26+
このことを「ハイドレーション」と呼びます。
27+
28+
この例では `app.vue``count` と言うステートをコンソールに出力しています。\
29+
このページにアクセスした際にターミナル(サーバー)とブラウザのコンソールの両方でこの出力を確認することができます。
30+
31+
これはつまり、Nuxt が HTML をサーバー上で生成するために Vue.js のコードをサーバー上で実行し、その後ブラウザでも同じコードが実行されていることを意味します。\
32+
これゆえに「ユニバーサルレンダリング」と呼ばれています。
33+
34+
ユニバーサルレンダリングの利点と欠点は主に以下の通りです。
35+
36+
### 利点
37+
38+
- パフォーマンス\
39+
サーバーサイドで HTML を生成し、それをブラウザが読み込むため、ブラウザ上で JavaScript によってコンテンツを生成するよりも高速です。
40+
- 検索エンジン最適化 (SEO)\
41+
Webクローラはページのコンテンツを直接インデックスできるため、SEO に有利です。
42+
43+
### 欠点
44+
45+
- 開発の制約\
46+
サーバーサイドとクライアントサイドでシームレスに動作するコードを書くためにいくつかの制約があります。
47+
- コスト
48+
サーバーを必要とするため、サーバーの稼働コストがかかります。
49+
50+
より詳細な説明については [公式ドキュメント](https://nuxt.com/docs/guide/concepts/rendering#universal-rendering) を参照してください。
51+
52+
## クライアントサイドレンダリング
53+
54+
`nuxt.config``ssr: false` を設定することで、クライアントサイドレンダリングを有効にすることができます。
55+
56+
```ts
57+
// nuxt.config.ts
58+
export default defineNuxtConfig({
59+
ssr: false
60+
})
61+
```
62+
63+
クライアントサイドレンダリングでは、アプリケーションをブラウザ上でレンダリングします。\
64+
ブラウザが現在のインターフェイスを作成するための命令を含むすべてのJavaScriptコードをダウンロードして解析した後、HTML要素を生成します。
65+
66+
クライアントサイドレンダリングの利点と欠点は主に以下の通りです。
67+
68+
### 利点
69+
70+
- 開発スピード\
71+
サーバーサイドとのシームレスな動作を要求しないため、ブラウザで動作することだけを考慮して開発することができます。
72+
- 安価\
73+
サーバーを必要としないため、インフラストラクチャのコストがかかりません。
74+
- オフライン\
75+
コードはすべてブラウザで実行されるため、インターネットが利用できない状態でもうまく動作し続けることができます。
76+
77+
### 欠点
78+
79+
- パフォーマンス\
80+
ユーザーはブラウザがJavaScriptファイルをダウンロード、解析、実行するのを待たなければなりません。それらに時間がかかり、ユーザーの体験に影響を与える可能性があります。
81+
- 検索エンジン最適化 (SEO)\
82+
クライアントサイドレンダリングで配信されたコンテンツのインデックス化と更新には時間がかかるため、サーバーレンダリングのHTMLドキュメントと比べ SEO に不利です。
83+
84+
## ハイブリッドレンダリング
85+
86+
Nuxt ではルートのルールを設定することにより、ルートごとに異なるキャッシュ ルールとレンダリングモードを選択することができます。
87+
88+
設定は `nuxt.config``routeRules` オプションで行います。
89+
90+
詳細は [公式ドキュメント](https://nuxt.com/docs/guide/concepts/rendering#hybrid-rendering) を参照してください。
91+
92+
```ts
93+
export default defineNuxtConfig({
94+
routeRules: {
95+
// Homepage pre-rendered at build time
96+
'/': { prerender: true },
97+
// Blog posts page generated on demand, revalidates in background, cached on CDN for 1 hour (3600 seconds)
98+
'/blog': { isr: 3600 },
99+
// Blog post page generated on demand once until next deployment, cached on CDN
100+
'/blog/**': { isr: true },
101+
// Admin dashboard renders only on client-side
102+
'/admin/**': { ssr: false },
103+
}
104+
})
105+
```
106+
107+
## チャレンジ
108+
109+
クライアントサイドレンダリングを設定し、Vue.js のコードがブラウザ上のみで実行されることを確認してみましょう。
110+
111+
そのためには:
112+
113+
1. `nuxt.config``ssr: false` を設定します。
114+
2. `app.vue``count` と言うステートをコンソールに出力します。
115+
3. ターミナルでコンソールの出力が行われていないことを確認します。
116+
4. ブラウザの開発者ツールを開き、コンソールの出力を確認します。
117+
118+
次に、ハイブリッドレンダリングを設定し、ルートごとに異なるキャッシュ ルールとレンダリングモードを選択することができることを確認してみましょう。
119+
120+
そのためには:
121+
122+
1. `app.vue``NuxtPage` コンポーネントを使って、ページをレンダリングします。
123+
2. `/pages/index.vue``/pages/foo.vue` を作成し、`script setup` 内コンソールの出力を行います。(内容は任意のもので構いません。)
124+
3. `nuxt.config``routeRules` を設定し、`/``/foo` に対して異なるキャッシュ ルールとレンダリングモードを設定します。\
125+
今回は、`/foo``ssr: false` を設定してみましょう。
126+
4. `/` にアクセスし、コンソールの出力がサーバーとクライアントの両方で行われていることを確認します。
127+
5. `/foo` にアクセスし、コンソールの出力がブラウザのみで行われていることを確認します。
128+
129+
:ButtonShowSolution{.bg-faded.px4.py2.mb3.rounded.border.border-base.hover:bg-active.hover:text-primary.hover:border-primary:50}
130+
131+
:::note
132+
レンダリングモードの動作の確認は、実際には console の出力場所だけではなく、開発者ツールのネットワークタブなどを使って、
133+
リクエストの挙動を確認することも重要です。
134+
135+
ユニバーサルレンダリングの場合はサーバーが HTML を生成するため、ネットワークダブを確認してみるとコンテンツ内容 (主に `<div id="__nuxt">` 内)が完全なものになっているのに対し、クライアントサイドレンダリングの場合は、HTML が空の状態で JavaScript によってコンテンツが生成されていることが確認できます。\
136+
(ダウンロードした JavaScript も別のリクエストとして観測することができます。)
137+
:::

eslint.config.js

+6
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,10 @@ export default antfu(
77
formatters: true,
88
},
99
nuxt,
10+
{
11+
files: ['**/.template/**'],
12+
rules: {
13+
'no-console': 'off',
14+
},
15+
},
1016
)

0 commit comments

Comments
 (0)