先月よりジョインさせていただいている Web屋さんで猫好きな @jiyuujin 今回は度々登場となって申し訳ないですが、自身のWeb猫ブログを TypeScript化した話をさせていただきます。
nuxt-tsを採用します
結論を先に申し上げると nuxt-ts を採用した件で、その導入周りに留まります。導入にあたってかれこれ1年以上、メンテストップ中の公式テンプレート。。 一切頼りにはできません。今年のどこかで必ず更新してほしさあり、新たに出していただけると大変嬉しいですね😊
Web猫ブログでは個人的なアナウンスこそしていませんでしたが、今回この場を借りて TypeScript化しましたという経緯です。つい最近、 nuxt-ts 不要になるかもという Issue (下記を参照)を見たのですが、とりあえず nuxt-ts をインストールするしかありません。ビルドコマンドも nuxt から nuxt-ts を使うよう変更してあげる必要があります。
yarn add nuxt-ts yarn add typescript @types/node ts-loader -D
nuxt-ts 不要になるの?
上記でも触れた nuxt-ts 不要になるかも、というのが以下 Issueを見たことでした。 tslint から @typescript-eslint に移行する一環と思いますが、気になる話でした。
Nuxt.configを TypeScriptで書く
Web猫ブログでは Headless CMSに Contentfulを採用。 Sitemapの生成処理や Makdownのパース処理など単純な設定に縛られず比較的コードを書く箇所が多く存在すると思いますが、これらの実装箇所が全て型安全に書けるようになったことは今までと大きく違う点だと思います。
APIを使うために型定義を設定する
asyncData や fetch などのAPIをを型安全に利用するために自分自身でVueのInterfaceを拡張してあげる必要があります (/types/nuxt.d.tsを作成すると良いでしょう) この辺りはさすがVue界隈と思う部分ですが、丁寧に書いてくださっていることに対しては感謝しかありません。Nuxt公式ページに Context一覧が存在します。そのページと照らし合わせながらぐりぐり型定義を設定します。
declare module 'nuxt' {
import { Store } from 'vuex';
import { Route } from 'vue-router';
export class Builder {
constructor(nuxt: Nuxt);
}
export class Nuxt {
constructor(config?: NuxtConfig);
}
export interface NuxtConfig {
dev: boolean;
[key: string]: any;
}
export interface NuxtContext<S = any> {
app: NuxtApp;
isClient: boolean;
isServer: boolean;
isStatic: boolean;
isDev: boolean;
isHMR: boolean;
route: Route;
req: any;
res: any;
store: Store<S>;
env: any;
params: any;
query: any;
redirect(path: string): void;
error(params: { statusCode: number; message: string }): void;
nuxtState: any;
beforeNuxtRender(fn: Function): any;
}
}
上記はあくまでミニマムな構成になっています。当ブログではこの構成に加えて、 contentful 用のModelも定義しています。このように必要に応じて随時追加してあげなければならず少々面倒ではありますが、後々を考えると良い「投資」になってくれるかもしれません。
今回はミニマムな構成の下で動作確認をとることができたのでこの辺で。
リポジトリ公開中
ブログでは随時お問い合わせコメント受付中、PRも絶賛受付中です。
Web猫ブログ 本番運用中
今までの TypeScriptを採用していない版です。
Web猫ブログ β版 (いずれ本番運用予定)
既に切りました、本番運用開始されたら再度アナウンスしたいと思います。
最後に、
SCOUTERではエンジニア、デザイナーともに募集しております! 新規事業、絶賛グロース中の事業ともにLaravel, Vue.jsで開発しておりますので、 興味のある方はお声がけください!