Slide 1

Slide 1 text

Nuxt.js で SSR 対応をする 2019.1.19 v-kansai Vue.js/Nuxt.js meetup #2

Slide 2

Slide 2 text

ショウノシオリ @shosho_egg 株式会社 chatbox (Web制作、IT系イベントの運営・支援 etc) フロント&バックエンドエンジニア Vue.js・Nuxt.js / PHP(Laravel) PHPカンファレンス関西 2017&2018 実行委員長

Slide 3

Slide 3 text

Nuxt.js で SSR 対応をすることになったきっかけ

Slide 4

Slide 4 text

「Laravel JP Conference のスポンサー詳細ページ を SSR対応にしてください」 (Nuxt.js で作ったサイト)

Slide 5

Slide 5 text

“ 「SSRって聞いたことあるけど、何?」 「なぜするの?」 「どうやってするの?」

Slide 6

Slide 6 text

と私が実際に疑問に思ったことを中心に 学んだことなどを紹介しようと思います

Slide 7

Slide 7 text

「SSRって何?」 「なぜするの?」

Slide 8

Slide 8 text

SSRとは? ▷ サーバーサイドでレンダリングすること ○ サーバー上で Vue.js を HTML にする、とか ▷ メリット ○ ブラウザ以外の場所(サーバー)で HTML を生成することができ る ○ ブラウザに表示される前にHTMLにデータを埋め込むことができ るため、SEO的に強かったりする ▷ デメリット ○ 実装が面倒 ■ ブラウザで使える関数がサーバー上では使えなかったりする ので、その辺を考慮しなければならない

Slide 9

Slide 9 text

Nuxt.js の SSR 対応 ▷ Nuxt.js には SSR の機能が備わっている ○ Nuxt.js は SSR機能、vuex、vue-router などアプリケーション構築 に便利なツールが備わった Vue.js の FW (Vue.js で SSR するには vue-server-render を入れる必要有) ○ 今回試したのは generate の SSR

Slide 10

Slide 10 text

「どうやってするの?」

Slide 11

Slide 11 text

今回 SSR 対応 するページ ○ pages/sponsor/_name.vue ○ コーディングのみ完了 ○ スポンサー情報は API で取得 ○ SSR 対応するとスポンサー情報がSEO的に◎

Slide 12

Slide 12 text

やることは2つ 1. 動的URLページを静的ページ化する 2. ページコンポーネントで SSR する

Slide 13

Slide 13 text

1. 動的URLページを静的ページ化する ▷ Nuxt.js はファイル名を _ 始まりにすると、複数のURLで同じ コンポーネントを表示させることができる ○ 今回のファイルは pages/sponsor/_name.vue ○ _ name.vue のパラメータは $route.param.name でとれる ▷ ただし、_ 始まりのファイルは generate 時に書き出されない ○ generate は実際に HTML ファイルに変換して書き出す作業を行う ○ _ で始まるファイルを HTML に書き出したい場合は設定が必要

Slide 14

Slide 14 text

▷ nuxt.config.js の generate プロパティ下にある routes オプ ションに配列で設定 設定方法 //nuxt.config.js module.exports = { generate: { routes: [ ‘/sponsor/株式会社A’, ‘/sponsor/株式会社B’, ‘/sponsor/株式会社C’, ] } }

Slide 15

Slide 15 text

▷ 動的なパラメータが必要な場合は Promise を返す関数を使う ことができる ○ callback + 関数 でもOK import axios from “axios” module.exports = { generate: { async routes() { const path = [] const request = axios.create({ baseURL: ‘https://...’ }) const {data} = await request(“/sponsors”) for (let plan of data.sponsor_plans { for (let sponsor of plan.sponsors) { path.push(`/sponsor/${sponsor.name}`) } } return path } } }

Slide 16

Slide 16 text

2. ページコンポーネントで SSR する ▷ SSR せず、mounted() や created() でデータをとってくると、 ブラウザで読み込まれた段階でデータは空っぽになってし まっている ▷ ページコンポーネント内で SSR するには asyncData / fetch が使える ○ 両者ができることは同じだが、readability の観点から使い分けるの がよい ○ vuex にデータを入れるときは fetch、ページコンポーネントでデータ を使うときは asyncData

Slide 17

Slide 17 text

▷ ページコンポーネントで SSR しない場合 ○ generate した場合、mounted() は呼び出されないので data() がその まま出力される

Slide 18

Slide 18 text

▷ ページコンポーネントで asyncData を使って SSR する場合 ○ generate時に asyncData が呼び出されるので、data() は上書きされる

Slide 19

Slide 19 text

asyncData / fetch ▷ ページコンポーネントがロードされる前に呼び出される ▷ SSRやページ遷移前にも呼び出される ▷ 第一引数に context オブジェクトを受け取ることができる ▷ ページコンポーネントが初期化される前に呼び出されるた め、asyncData/fetch の中で this は使えない

Slide 20

Slide 20 text

実際に使ってみる //sponsor/_name.vue export default { name: ‘sponsor’, async asyncData({store, route}) { const [sponsor] = await Promise.all([ store.dispatch(“fetchSponsorData”, route.params.name), ]) return {sponsor} } } ▷ 今回はページコンポーネント内でデータを使うため asyncData を使用 ○ context オブジェクトからは store、route などが取れる

Slide 21

Slide 21 text

完成!! スポンサー詳細画面の SSR 対応が完了しました

Slide 22

Slide 22 text

「Nuxt.js で SSR 対応してみた」感想 ▷ Nuxt.js で作ったサイトであれば SSR 対応をするハードル はあまり高くない ○ 作ったサイトやサービスをより良くしていくためにも、必要であれば 取り入れるのが良さそう ▷ ただし、面倒くささは確かにある ○ 必要なページコンポーネントでだけ実装するのが良さそう

Slide 23

Slide 23 text

参考 ▷ https://speakerdeck.com/bumptakayuki/nuxt-dot-js dehazimeru-sabasaidorendaringu?slide=8 ▷ https://zen-web.net/blog/nuxtjs-asyncdata-fetch/ ▷ https://ja.nuxtjs.org/api/configuration-generate/#ge nerate-%E3%83%97%E3%83%AD%E3%83%91%E3 %83%86%E3%82%A3

Slide 24

Slide 24 text

Thanks! Any questions? You can find me at: @username [email protected]