Nuxt.js環境の学習継続中

Nuxt.js開発を進めるためには、もう少し学習が必要ということで、入門サイトを見てみたりしていますが、なかなか思う方向には進んでくれません。その苦労の足跡を残します。(ごちゃごちゃになりすぎて記憶も飛び気味ですが)

やりたいことのゴールはこちら

入門用サイト

本当はまずやりたいのはヌルサクです。

ただ、結構端折られているところも多く、また、微妙に最新環境でないところがあって、初心者にはエラー対処が難しかったりするため、もう少し入門的なところから始めたいと思いました。そして、それはそれで色々参考になるサイトがあるのですが、これもなかなかそのままは動いてくれなかったりして、苦労しました。

Nuxt × TypeScript でTodoListとユーザ認証を実装してFirebase Hostingにデプロイ

https://note.mu/tkugimot/n/nfe81dbbe8bad

こちらのサイトは、入門者の立場から、gitの使い方的なところにも配慮しながら進めてくれるので、非常に勉強になります。

それでもたまにそのままでは動かないところがあったりして、例えば、
3.Todoの module と Component を準備する
の時点でのpages/index.vueは

<template>
  <Todos />
</template>

ではなくて

<template>
  <TodoList />
</template>

ですよね、みたいなのがあったりします。

また、結構
implicitly has an ‘any’ type.
で怒られることが多く、「: any」をつけて対処したりしてたのですが、それで良いのか、理解できていません。

さらに、
module namespace not found in mapGetters(): todos/
みたいなエラーが出て、これは解消できずにとりあえず進めたりしました。
その後も色々なエラーを解消できず、もう一度最初からやり直してみても最後には上記エラーに引っかかってしまう状態から抜けられず、途中で一旦中止しました。

(追記)
この問題は解消しました。
store/modules/todos.ts
という構造になっているので、

// export const name = 'todos';
export const name = 'modules/todos';

とすることにより、エラー解消しました。
また、サイトでは、store/index.tsに記載する内容がありますが、これはファイル名store/todo.tsで作成することにしました。その場合は、

// import { RootState } from 'store'
import { RootState } from 'store/todo'

とすることが必要です。

TypeScriptでNuxtアプリを作るチュートリアル【書籍検索システム】

次に見つけたのはこちら。API呼び出しの簡単なサンプルとしても良いですし、結論から行けば、この通りにやれば、ちゃんと動きました。初心者にはそれが一番重要!
ですので、このソースを元に、色々追加していこうと思いました。

しかし、これの若干マニアックなところが、Pug(元Jade)を使ってテンプレートを記載するため、その辺のサンプルをそのまま使えないこと、しかも、使用するUIフレームワークがBootstrapで、もちろんそれ自体は良いのですが、ことVueに関して言えばVuetifyの方が目につくことが多く(ぬるさくもそうだし)、ちょっとコピペしにくいぞ、というところがあります。

そして、悪戦苦闘しながら、もう一度位置から作ろうと思って、
vue init nuxt-community/typescript-template
で環境を作り直そうとしたところ、

 ERROR  ERROR in /app/node_modules/@nuxt/vue-app/node_modules/vuex/types/vue.d.ts   03:53:11
10:5 Subsequent property declarations must have the same type.  Property 'store' must be of type 'Store<any> | undefined', but here has type 'Store<any> | undefined'.
     8 | declare module "vue/types/options" {
     9 |   interface ComponentOptions<V extends Vue> {
  > 10 |     store?: Store<any>;
       |     ^
    11 |   }
    12 | }
    13 | 

という状態で、起動しなっくなってしまいました。nuxt-community/typescript-templateは割と頻繁にメンテされているようで、直近でnuxtも現時点で最新の2.7.1に上げられているし、やらかしているのでは、と思いましたが、これも自力では解決する力がないため、他を探すこととしました。(今見たら、さらに「Update dependency @types/node to v10.14.7」と書かれているので、色々頑張られていることと思います)

nuxt-typescript-vuetify

ということで使わせていただいたのは、こちら。

https://github.com/lautr/nuxt-typescript-vuetify

これにより、ナビゲーションメニュー付きの画面が起動するので、そこにメニュー追加してアプリを追加していこうと考えました。

ソースの構成

こちらを起動すると、よくある、ボタンを押したらカウントアップするという画面だけがあります。
ソース構成で嬉しかったのは、store/idnex.tsを使っておらず、store/counter.tsになっていること。これなら、アプリごとに、他を汚さずに、storeを作れるのではと思いました。pagesにはindex.vueしかないので、pages/Lauterを作り、index.vueをコピーします。これだけで、/Lauterでアクセスできるようになります。
ここに、上記の書籍検索を追加しようということで、store/book.tsとpages/book/index.vueを作り、そこにアプリを作っていくことにします。そして、進んでいくのですが、どうも検索しても、一覧が表示されません。調べながら、storeの作り方としてモジュールモードとクラシックモードがあり、今回はモジュールモードになっていて、ストアをモジュール分割する場合には、名前空間指定をしなければならないこともわかったので、対応したのですが、それでもエラーにはならないものの、表示されません。
(こんな感じで「book/」を付けました)

export default class extends Vue {
  @State('book/books') books
  @State('book/query') query

  handleChange(e): void {
    this.$store.commit('book/setQuery', e);
  }

  onSubmit(e): void {
    e.preventDefault();
    this.$store.dispatch('book/search');
  }

}

store/book.tsに記載した内容を、store/index.tsに書けば動作しますし、情報を読み込んでいるところまでは確認できるので、画面からStoreのステートの読み取り方が正しくないと思うのですが、これも自力解消できず、とりあえず、index.tsに書いて進めます。

もう一点、小ネタですが、最初のソースではメニュー表示はあるものの、リンク情報が記載されていないので、bookメニューを追加して、リンクを張るようにします。で、v-list>v-list-tileで作成されているので、v-list-tileを追加します。
そこにリンクを張る方法として、普通に検索すると、v-list-tileに「:to」を指定する方法が見つかるのですが、それでは動作せず、router-linkを追加して動作しました。

          <router-link to="/">
          <v-list-tile>
            <v-list-tile-action>
              <v-icon>home</v-icon>
            </v-list-tile-action>
            <v-list-tile-title>Home</v-list-tile-title>
          </v-list-tile>
          </router-link>

          <router-link to="/book">
          <v-list-tile>
            <v-list-tile-action>
              <v-icon>book</v-icon>
            </v-list-tile-action>
            <v-list-tile-title>book</v-list-tile-title>
          </v-list-tile>
          </router-link>

書籍検索を表示させたところはこんな感じ。

こうやってちょっとずつ勉強しながら、そのうち理解できるようになってくるでしょうか。