9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Nuxt.js] クライアントサイドだけで機能するmiddlewareが作りたい

Last updated at Posted at 2021-05-14

Nuxtをユニバーサルモードで動かしている時に、CSRでだけで働く共通middlewareが欲しい時がありますね。

そんな時、すぐに思いつくのがmiddlewareの処理を prosess.client で条件を絞るという方法です。

clientOnlyMiddleware.ts
export default function (context:Context) {
  if (process.client) {
    // 認証処理など
  }
}

しかし、このmiddlewareはページの初回読込やブラウザリロード時にはSSR側でのみ起動するため、CSR側では呼び出されません。

ユニバーサルモード時のNuxtのライフサイクルはSSRとCSRで2回呼び出されるものと片方だけで呼び出されるものがありますが、それらの中でCSR側でのみ呼び出されるmiddlewareというパターンがありません。

mixinを使ってbeforeCreateやbeforeMountの処理を共通化しても良いのですが、あまり美しいものではありません。

では、どうするのかと言うとプラグインを使います。

app/nuxt.config.js
export default {
  mode: 'universal',
  plugins: [
    { src: '@/plugins/initClient', mode: 'client' }
  ]
}

プラグインは動作モードの指定ができるため、CSRのみのプラグインを作成します。
このプラグインから、先程のmiddlewareを起動することで、問題であった初回読込やブラウザリロード時にもCSR側から起動することができます。

initClient.ts
import clientOnlyMiddleware from '@/middleware/clientOnlyMiddleware'

export default function (context:Context) {
  clientOnlyMiddleware(context)
}

pluginと同じように、middlewareでもモード指定ができるように作ってくれてもいいと思うのですけどね。
それなりに要望はあるようですが、本家の回答を見ると意地でも作る気は無いような感じがします。

[参考] https://github.com/nuxt/nuxt.js/issues/2653

9
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?