apollo-composable を使えるようにしたい!
みなさん、こんにちは。どんぶラッコです。
Nuxt.js に Apollo を導入して GraphQL形式の情報を取得するために @nuxtjs/apollo
パッケージを使ってセットアップをしています。
しかし、時代は Composition API の時代。 Vue3文法でも apolloを使えるようにしたい!
Vue Apollo ( @nuxtjs/apollo
の基になってるやつ ) ではそんな時は apollo-composable
を使いな〜!とアナウンスしてくれています。
よっしゃ! nuxt.jsでもやったろ…と思うと、「どうやったらいいんだ?」となってしまい、結構情報を探しました。
下記の issueをベースに連携させることができたので、その設定方法と何をやっているのかの解説を書いておこうと思います!
手順
plugins/provideApolloClient.ts
を作成する
import { provide, onGlobalSetup } from '@nuxtjs/composition-api'
import { DefaultApolloClient } from '@vue/apollo-composable'
import { Context } from '@nuxt/types'
export default ({ app }: Context) => {
onGlobalSetup(() => {
const apolloClient = app.apolloProvider.defaultClient
provide(DefaultApolloClient, apolloClient)
})
}
Context
の形宣言部分を削除してもらえれば JavaScriptとしても動きますね。
nuxt.config.js
に追記する
export default {
plugins: [
'~/plugins/provideApolloClient.ts' // 追記
],
modules: [
'@nuxtjs/apollo' // @nuxtjs/apolloは設定ずみという前提です
],
}
これで完了です!
解説
改めてプラグインの内容を見ていきましょう。
import { provide, onGlobalSetup } from '@nuxtjs/composition-api'
import { DefaultApolloClient } from '@vue/apollo-composable'
import { Context } from '@nuxt/types'
export default ({ app }: Context) => {
onGlobalSetup(() => {
const apolloClient = app.apolloProvider.defaultClient
provide(DefaultApolloClient, apolloClient)
})
}
そもそも、pluginでは export default (context, inject) => { }
の形式で2つの引数を利用することができます。
今回は context
オブジェクトの app
を利用しているんですね。
app
は vue インスタンスです。なので、vueインスタンス内のプロパティを取得できるわけです。
そして、vue-apollo
を導入すると apolloProvider
という形式で apolloに関する情報を取得できます。
new Vue({
el: '#app',
apolloProvider,
render: h => h(App),
})
このようにinjectされるようです。
そして、 apolloProvider
内 の defaultClient
を取得することで、apolloClient
のインスタンスを取得できます!
最後にそれを onGlobalSetup
を使って Nuxtのグローバル setup() で呼び出します。
この記事のまとめ
皆さん、うまく設定できたでしょうか? pluginの性質を理解できればいけますね!