くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Nuxt(TS)でrouterのextendRoutesでredirectしようとしたらハマった(chunkNamesが必要)

Nuxt.jsでTypeScript化したところ、nuxt.config.jsのextendRoutesでハマった。。。 redirectしたいだけなのに。。。 いろいろ調べたので、その備忘録

まとめ

  • Nuxt.js v2.7.0以上を使おう
  • chunkNames: {}も設定しよう

TypeScriptでの設定

こんな感じにで設定すればOK!

const config: NuxtConfiguration = {
  router: {
    extendRoutes(routes: NuxtRoutConfig[], resolve) {
      routes.push({
        path: "/_user/:uid",
        redirect: "/user/:uid",
        chunkNames: {}
      });
    }
  },
}

v2.7.0で#5700の修正が入っているので、v2.7.0以上を使わないといけない。。

ここからは調べた流れ的なの

JavaScriptでの設定

JavaScriptの場合はこんな感じの設定。
/_user/:uid/user/:uidにリダイレクトしたかった。。

module.exports = {
  router: {
    extendRoutes(routes, resolve) {
      routes.push({
        path: "/_user/:uid",
        redirect: "/user/:uid",
      });
    }
  },
}

やってみると、こんな感じで怒られる。。(-_-;)

f:id:wannabe-jellyfish:20190711171209p:plain

routesの型定義を見てみる

routesの型はNuxtRoutConfig[]らしい。

import { RouterOptions, RouteConfig } from 'vue-router'

export interface NuxtRouteConfig extends RouteConfig {
  chunkNames: { [key: string]: string }
}

export interface NuxtConfigurationRouter extends RouterOptions {
  routeNameSplitter?: string
  extendRoutes?(routes: NuxtRouteConfig[], resolve: (...pathSegments: string[]) => string): void
  linkPrefetchedClass?: string
  middleware?: string | string[]
  prefetchLinks?: boolean
}

ちなみに、RouteConfigの型定義はvue-routerのほうにある。(types/router.d.ts | vue-router - GitHub)

NuxtRouteConfigを見ると、chunkNamesを指定しないといけないっぽい。
公式ガイド(名前付きビュー | ルーティング - Nuxt.js) を見てみると、
componentsを使ったルート拡張のときにチャンクの名前を指定するプロパティのよう。

今回はredirectしたいだけなので、chunkNames: {}を指定。
無事、解消されたヽ(=´▽`=)ノ

以上!!

参考になる書籍

実践TypeScript ~	BFFとNext.js&Nuxt.jsの型定義~

実践TypeScript ~ BFFとNext.js&Nuxt.jsの型定義~

TypeScript実践プログラミング (Programmer's SELECTION)

TypeScript実践プログラミング (Programmer's SELECTION)

Nuxt.jsビギナーズガイド―Vue.js ベースのフレームワークによるシングルページアプリケーション開発

Nuxt.jsビギナーズガイド―Vue.js ベースのフレームワークによるシングルページアプリケーション開発

参考にしたサイト様