This repository was archived by the owner on May 1, 2025. It is now read-only.
File tree Expand file tree Collapse file tree 10 files changed +164
-1
lines changed
content/2.concepts/5.middleware Expand file tree Collapse file tree 10 files changed +164
-1
lines changed Original file line number Diff line number Diff line change 1+ <template >
2+ <NuxtPage />
3+ </template >
Original file line number Diff line number Diff line change 1+ export default defineNuxtRouteMiddleware ( ( ) => {
2+ console . log ( 'Hello from global middleware!' )
3+ } )
Original file line number Diff line number Diff line change 1+ <script setup lang="ts">
2+ definePageMeta ({
3+ middleware: [' hello-foo' ],
4+ })
5+ </script >
6+
7+ <template >
8+ <h1 >Foo</h1 >
9+ <NuxtLink to =" /" >
10+ /Index
11+ </NuxtLink >
12+ </template >
Original file line number Diff line number Diff line change 1+ <template >
2+ <h1 >Index</h1 >
3+ <NuxtLink to =" /foo" >
4+ /Foo
5+ </NuxtLink >
6+ </template >
Original file line number Diff line number Diff line change 1+ import type { GuideMeta } from '~/types/guides'
2+
3+ export const meta : GuideMeta = {
4+ startingFile : 'pages/index.vue' ,
5+ features : {
6+ fileTree : true ,
7+ } ,
8+ }
Original file line number Diff line number Diff line change 1+ <template >
2+ <NuxtPage />
3+ </template >
Original file line number Diff line number Diff line change 1+ export default defineNuxtRouteMiddleware ( ( to ) => {
2+ // FIXME: import . meta . server が置換されてしまう
3+ if ( import . meta. server )
4+ return
5+
6+ const isSignedIn = JSON . parse ( localStorage . getItem ( 'isSignedIn' ) || 'false' )
7+
8+ if ( ! isSignedIn && to . path !== '/' ) {
9+ return navigateTo ( '/' )
10+ }
11+ else {
12+ return true
13+ }
14+ } )
Original file line number Diff line number Diff line change 1+ <script setup lang="ts">
2+ definePageMeta ({
3+ middleware: [' hello-foo' ],
4+ })
5+ </script >
6+
7+ <template >
8+ <h1 >Foo</h1 >
9+ <NuxtLink to =" /" >
10+ /Index
11+ </NuxtLink >
12+ </template >
Original file line number Diff line number Diff line change 1+ <script lang="ts" setup>
2+ function setIsSignedIn() {
3+ window .localStorage .setItem (' isSignedIn' , JSON .stringify (true ))
4+ }
5+
6+ function removeIsSignedIn() {
7+ window .localStorage .removeItem (' isSignedIn' )
8+ }
9+ </script >
10+
11+ <template >
12+ <h1 >Index</h1 >
13+ <NuxtLink to =" /foo" >
14+ /Foo
15+ </NuxtLink >
16+
17+ <div >
18+ <button type =" button" @click =" setIsSignedIn" >
19+ Set isSignedIn
20+ </button >
21+
22+ <button type =" button" @click =" removeIsSignedIn" >
23+ Remove isSignedIn
24+ </button >
25+ </div >
26+ </template >
Original file line number Diff line number Diff line change 22ogImage : true
33---
44
5- # Middleware
5+ # ミドルウェア
6+
7+ Nuxt では、特定のルートにナビゲートする前にコードを実行する為のミドルウェアを提供しています。\
8+ この機能は例えば、認証状態によってページへのアクセスを制限する場合などに便利です。
9+
10+ ミドルウェアにはグローバルミドルウェアとページ単位のミドルウェアの2つの種類があります。
11+ どちらも、` middleware ` ディレクトリに実装します。
12+
13+ ## グローバルミドルウェア
14+
15+ グローバルミドルウェアは以下のように定義することができます。
16+
17+ ```
18+ middleware/
19+ --| hello.global.ts
20+ ```
21+
22+ ``` ts
23+ // middleware/hello.global.ts
24+ export default defineNuxtRouteMiddleware (() => {
25+ console .log (' hello' )
26+ })
27+ ```
28+
29+ ## ページ単位のミドルウェア
30+
31+ ページ単位のミドルウェアは以下のように定義することができます。
32+
33+ ```
34+ middleware/
35+ --| helloA.ts
36+ ```
37+
38+ ``` ts
39+ // middleware/hello.ts
40+ export default defineNuxtRouteMiddleware (() => {
41+ console .log (' helloA' )
42+ })
43+ ```
44+
45+ ``` vue
46+ <!-- pages/a.vue -->
47+ <script setup lang="ts">
48+ definePageMeta({
49+ middleware: ['hello'],
50+ })
51+ </script>
52+
53+ <template>
54+ <h1>Hello A</h1>
55+ </template>
56+ ```
57+
58+ ## ミドルウェアの実行タイミング
59+
60+ これらのミドルウェアは、クライアント上でのナビゲーション時はもちろん、SSR または SSG でのページ生成時にもサーバーサイドで実行されます。\
61+ ミドルウェアでローカルストレージなどのクライアントサイドの API を使用する場合は、クライアントサイドのみで実行されるようにする必要があります。\
62+ ` import.meta ` を使うことで実行している環境を判定することができます。サーバーサイドでの実行スキップする場合は ` import.meta.server ` を利用します。
63+
64+ ``` ts
65+ export default defineNuxtRouteMiddleware ((to ) => {
66+ // skip middleware on server
67+ if (import .meta .server )
68+ return
69+
70+ // some processing
71+ window .localStorage .setItem (' key' , ' value' )
72+ })
73+ ```
74+
75+ ## チャレンジ
76+
77+ localStorage の情報を読み取って、特定の値がある場合のみ ` /foo ` にアクセス可能にするミドルウェアを作成してみましょう。\
78+ 今回は例として、` isSignedIn ` というキーに ` true ` が設定されている場合のみ ` /foo ` にアクセス可能にするミドルウェアを作成します。\
79+ 値のセットは ` index.vue ` から行えるようにボタンを設置してみましょう。
80+
81+ : ButtonShowSolution { . bg-faded . px4 . py2 . rounded . border . border-base . hover:bg-active . hover:text-primary . hover:border-primary:50 }
You can’t perform that action at this time.
0 commit comments