Slide 1

Slide 1 text

Copyright © M&A Cloud All rights reserved. Roppongi.vue #5 @KenjiroKubota Nuxt.jsでCompositionAPIを使う 1

Slide 2

Slide 2 text

Copyright © M&A Cloud All rights reserved. Profile 2 久保田 賢二朗 kubotak-is kubotak_public kenjiro.kubota 株式会社M&Aクラウド所属 PHP JavaScript Go Scala

Slide 3

Slide 3 text

Copyright © M&A Cloud All rights reserved. 3 PR

Slide 4

Slide 4 text

Copyright © M&A Cloud All rights reserved. 前置き 4 LaravelからNuxt.jsへ Laravel(PHP)で作られたサイトをNuxt.jsに移行 LaravelでHTTP APIを作成し、Nuxt.jsでフロントエンドを作る ❏ フロントエンドはVue.jsを使っていたので学習コストが低いだろうと Nuxt.jsを選定 ❏ 型安全の恩恵を受けるためにTypescriptで開発 ❏ Vue.js version3で導入が決まっているCompositionAPIを利用

Slide 5

Slide 5 text

Copyright © M&A Cloud All rights reserved. 前置き 5 Composition APIについては詳しく話さない もうみんな耳にタコができるくらい聞いていると思うのでCompositionAPIについ ては詳しく話しません。

Slide 6

Slide 6 text

Copyright © M&A Cloud All rights reserved. お品書き Nuxt.js + CompositionAPI 6 1 Nuxt.js + Typescript + Composition API 2 Nuxt.js + Vuex 3 Vuex + CompositionAPI

Slide 7

Slide 7 text

Copyright © M&A Cloud All rights reserved. Nuxt.js + Typescript 7 Typescript Nuxt.jsをTypescriptで開発する ためにNuxt Typescriptを利用し てスケルトンを作成

Slide 8

Slide 8 text

Copyright © M&A Cloud All rights reserved. Nuxt.js + Composition API 8

Slide 9

Slide 9 text

Copyright © M&A Cloud All rights reserved. Nuxt.js + Composition API 9 pluginsディレクトリにこんな感じのファイルを作成

Slide 10

Slide 10 text

Copyright © M&A Cloud All rights reserved. Nuxt.js + Composition API 10 nuxt.config.tsのpluginsに作成したファイルを指定

Slide 11

Slide 11 text

Copyright © M&A Cloud All rights reserved. Nuxt.js + Composition API 11

Slide 12

Slide 12 text

Copyright © M&A Cloud All rights reserved. Nuxt.js + Composition API 12 SFCで普通にComposition APIが利用できる ※2020/02現在ではCompositionAPIライブラリが必須

Slide 13

Slide 13 text

Copyright © M&A Cloud All rights reserved. Nuxt.js + Composition API 13 @nuxt/types/app/vue.d.tsにNuxt.js特有のSFCプロパティ の定義があるのでTypescriptの恩恵を受けられる

Slide 14

Slide 14 text

Copyright © M&A Cloud All rights reserved. 14 (o`・ω・´σ)σ 普通に使えそうやん と思ったが

Slide 15

Slide 15 text

Copyright © M&A Cloud All rights reserved. 15 (o`・ω・´σ)σ 普通に使えそうやん と思ったが そんなことはなかった _:(´ཀ`」 ∠):

Slide 16

Slide 16 text

Copyright © M&A Cloud All rights reserved. Nuxt.js + Composition API 16 Nuxt.js + Composition APIの問題点 Nuxtはサーバーサイドレンダリングの際に、サーバーサイドで取得し たデータをHTMLのscriptタグにwindow.__NUXT__.~に出力して、ク ライアントサイドでステートをマッピングすることができるが CompositionAPIを利用した際にはうまく出力されなかった・・・ (書き方を間違えているかもしれないのでホントはできるぞという方は 後で連絡ください)

Slide 17

Slide 17 text

Copyright © M&A Cloud All rights reserved. Nuxt.js + Composition API 17 Nuxt.js + Composition APIの問題点 templateに埋め込んでHTMLとしてサーバーサイドレンダリングはされ るのでSEOとしては利用できるが、その出力した変数情報は空になって しまうのでAPI通信などでデータ取得してる場合はクライアントサイド でも再度取得しなければならない・・・

Slide 18

Slide 18 text

Copyright © M&A Cloud All rights reserved. 18 ( ー`дー´) ならばVuex

Slide 19

Slide 19 text

Copyright © M&A Cloud All rights reserved. Nuxt.js + Vuex 19 Nuxt.jsにはVuexコアが組み込まれている Vuexについてはみなさんもうご存知と思うので詳しく説明しません。 Nuxt.jsではstoreディレクトリにあるファイルをVuexとしてインポート する仕組みを持っている。 ここで状態管理がされたステートはwindow.__NUXT__.~を利用してク ライアントサイドでステートを引き継ぐことができる

Slide 20

Slide 20 text

Copyright © M&A Cloud All rights reserved. Nuxt.js + Vuex 20 VuexとTypescript Nuxt.jsでVuexをTypescriptで扱う場合は大きく以下の2パタンある ● クラスベース ● Vanilla

Slide 21

Slide 21 text

Copyright © M&A Cloud All rights reserved. Nuxt.js + Vuex 21 クラスベース vuex-module-decorators を利用する

Slide 22

Slide 22 text

Copyright © M&A Cloud All rights reserved. Nuxt.js + Vuex 22 Vanilla Vuexに用意されている型 定義を利用して素朴に記 述する

Slide 23

Slide 23 text

Copyright © M&A Cloud All rights reserved. 23 クラスベースに慣れてないので Vanillaを採用

Slide 24

Slide 24 text

Copyright © M&A Cloud All rights reserved. Nuxt.js + Vuex 24 nuxt-typed-vuex Vuexで型定義の恩恵を受けられるライブラリがあるらしいが検証でき てない(懇親会があったら聞きたかった・・・!)

Slide 25

Slide 25 text

Copyright © M&A Cloud All rights reserved. 25 ( ゚д゚ )あれ? Composition APIは?

Slide 26

Slide 26 text

Copyright © M&A Cloud All rights reserved. Vuex + Composition API 26 SFC Composition API Vuex SFCから直接Vuexにdispatchやgettersを実行せず、CompisitionAPI側 にVuexとの接続を隠蔽

Slide 27

Slide 27 text

Copyright © M&A Cloud All rights reserved. Vuex + Composition API 27 なぜCompositionAPIを挟むのか ● 現状でVuexとのやりとりが文字ベースなので型情報が失われるの でCompositionAPIで型を定義し直す ○ nuxt-typed-vuexで解決するかも ● SFCが依存するものをCompositionAPIだけに制限したい ● 将来的にサーバーとクライアントのステート共有が CompositionAPIだけになったらいいなという期待 ● クライアントサイドだけで非同期通信して値を取得する場合は Vuexを使わず、CompositionAPIだけで完結させている

Slide 28

Slide 28 text

Copyright © M&A Cloud All rights reserved. Vuex + Composition API 28

Slide 29

Slide 29 text

Copyright © M&A Cloud All rights reserved. Vuex + Composition API 29 Vuexを利用している場合はCompositionAPIは右から左に バケツリレーするだけ

Slide 30

Slide 30 text

Copyright © M&A Cloud All rights reserved. Vuex + Composition APIのテスト 30 先程の構成のCompositionAPIをテストする(Jest)

Slide 31

Slide 31 text

Copyright © M&A Cloud All rights reserved. Vuex + Composition APIのテスト 31 LocalVueにVuexとCompositionAPIを登録

Slide 32

Slide 32 text

Copyright © M&A Cloud All rights reserved. Vuex + Composition APIのテスト 32 VuexStoreの登録

Slide 33

Slide 33 text

Copyright © M&A Cloud All rights reserved. Vuex + Composition APIのテスト 33 モジュールモードで登録されるように加工

Slide 34

Slide 34 text

Copyright © M&A Cloud All rights reserved. Vuex + Composition APIのテスト 34 APIレスポンスのモックを作成

Slide 35

Slide 35 text

Copyright © M&A Cloud All rights reserved. Vuex + Composition APIのテスト 35 モックの差し込み

Slide 36

Slide 36 text

Copyright © M&A Cloud All rights reserved. Vuex + Composition APIのテスト 36 簡単でしたね?

Slide 37

Slide 37 text

Copyright © M&A Cloud All rights reserved. まとめ 37 まとめ ● Nuxt.js+CompositionAPIはサーバーサイドとクライアントサイド でのステート共有においてまだ使えないが、既存の仕組み(Vuex) と組み合わせることで問題なく使える ● 懇親会で色々聞きたかった人生

Slide 38

Slide 38 text

Copyright © M&A Cloud All rights reserved. 38