Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Vue.jsで作るシングルページアプリケーション〜Vue.js, Nuxt.js, Vuetify〜

Vue.jsで作るシングルページアプリケーション〜Vue.js, Nuxt.js, Vuetify〜

Vue.jsとNuxt.jsを使って、簡単なSPA(シングルページアプリケーション)を開発する勉強会で使用したスライドです。

Vue.jsでつくるシングルページアプリケーション開発講座
https://connpass.com/event/106613/

Masahiro Nishimi

November 10, 2018
Tweet

More Decks by Masahiro Nishimi

Other Decks in Programming

Transcript

  1. UIをレンダリングす る UIをコンポーネント 化する クライアントサイド ルーティング 状態を管理する データの永続化 データバインディング(宣 言的レンダリング)

    Vue.jsのディレクティブへ の習熟 コンポーネント設計 (Atomic Designなど) 単一ファイルコンポーネン ト Vue Routerによるルー ティング Vuexによるデータフロー、 状態管理 クライアントサーバ通信、 Firebaseと言ったサーバレ スへの永続化 (※本日は扱いません)
  2. チャットをつくることを考えてみよう 送信 Masahiro Nishimi 2018/08/31 11:21 やあ、こんにちは! .message Masahiro Nishimi

    2018/08/31 11:23 どうもどうも テキストフィールドの中 を消す メッセージの内容から チャットメッセージの HTMLを作成する 既存のdiv.messageの 下に新しいdiv.message を追加する HTML構造なんてすぐ変わる かもしれないし、そのたびに メッセージの追加ロジックを変 更するのは面倒だな...
  3. データに従って自動的に描画するとしたら・・・? 送信 Masahiro Nishimi 2018/08/31 11:21 やあ、こんにちは! { messages: [

    { body: "やあ、こんにちは!", createdBy: { name: "Masahiro Nishimi", photoURL: "xxxx" } } ] } データを反映 配列にpushする データ
  4. データに従って自動的に描画するとしたら・・・? { messages: [ { body: "やあ、こんにちは!", createdBy: { name:

    "Masahiro Nishimi", photoURL: "xxxx" } }, { body: "どうもどうも", createdBy: { name: "Masahiro Nishimi", photoURL: "xxxx" } } ] } 送信 Masahiro Nishimi 2018/08/31 11:21 やあ、こんにちは! Masahiro Nishimi 2018/08/31 11:23 どうもどうも データ 配列にpushする データを反映
  5. メッセージの削除の実装も簡単 送信 Masahiro Nishimi 2018/08/31 11:21 やあ、こんにちは! { messages: [

    { body: "やあ、こんにちは!", createdBy: { name: "Masahiro Nishimi", photoURL: "xxxx" } } ] } データを反映 データ 配列から該当データを削除
  6. UIをレンダリングす る UIをコンポーネント 化する クライアントサイド ルーティング 状態を管理する データの永続化 データバインディング(宣 言的レンダリング)

    Vue.jsのディレクティブへ の習熟 コンポーネント設計 (Atomic Designなど) 単一ファイルコンポーネン ト Vue Routerによるルー ティング Vuexによるデータフロー、 状態管理 クライアントサーバ通信、 Firebaseと言ったサーバレ スへの永続化 (※本日は扱いません)
  7. あらためて・・・Vue.jsとは? <template> <div> {{ message }} </div> </template> <script> export

    default { data () { return { message: 'Hello, vue.js!' } } } </script> Hello, vue.js! レンダリング結果 テンプレート構文とデータを紐づけてDOMを描画できるようにしてくれるライブラリ テンプレート部 スクリプト部
  8. 「リアクティブ」にレンダリング結果が変わる <template> <div> {{ message }} </div> </template> <script> export

    default { data () { return { message: 'Come here!' } } } </script> Come here! レンダリング結果 変更 即時反映 データと連動して(データバインディングで)表示結果が変わる
  9. ディレクティブで多様な表現を実現できる <template> <div v-if=”show”> directive! </div> </template> <script> export default

    { data () { return { show: true } } } </script> directive! レンダリング結果 条件分岐(if文)や繰り返し(for文)をテンプレートに仕込むことができる showがtrueのときに レンダリングされる
  10. イベントもタグに埋め込める <template> <button @click=”showAlert”> showAlert </button> </template> <script> export default

    { methods: { showAlert () { alert('hello, vue.js') } } } </script> レンダリング結果 clickイベントやkeyupイベントなどのイベントハンドリングも可能 showAlert クリック時に アラートを表示
  11. UIをコンポーネントとして管理できる <template> <div> <my-component></my-component> </div> </template> <script> import MyComponent from

    '~/components/MyComponent' export default { components: { MyComponent } } </script> レンダリング結果 まとまった機能はコンポーネントとして切り出すと管理が楽になる MyComponentが レンダリングされる 外部から読み出し
  12. UIをレンダリングす る UIをコンポーネント 化する クライアントサイド ルーティング 状態を管理する データの永続化 データバインディング(宣 言的レンダリング)

    Vue.jsのディレクティブへ の習熟 コンポーネント設計 (Atomic Designなど) 単一ファイルコンポーネン ト Vue Routerによるルー ティング Vuexによるデータフロー、 状態管理 クライアントサーバ通信、 Firebaseと言ったサーバレ スへの永続化 (※本日は扱いません)
  13. コンポーネント指向 vue component vue component vue component vue component vue

    component ページ内の各要素をコンポーネントとして切り出すことで 保守性をアップさせることができます! また、このようにコンポーネント指向でページを組み立てていく設計手法 の一つに「Atomic Design」という方法論があります。 http://atomicdesign.bradfrost.com/ 実装例はReactを利用したものになりますが、Atomic Designのやり方を 説明した日本語の書籍もあります。とても分かりやすく書かれているの で、オススメです! https://www.amazon.co.jp/dp/477419705X
  14. Nuxt.jsとVue CLIという2つの選択肢について Nuxt.js Vue CLI ビルドプロセスを隠蔽 事前設定済みのwebpackを提供 アプリケーション開発に必要なmiddlewareや pluginsといった機能を独自に用意している (レールが用意されている)

    Vue Router & Vuexといったライブラリを追加 する機能はあるが、つなぎ合わせるための レールを用意しているわけではない プロジェクトの構成について細かなカスタマ イズが可能 細かなカスタマイズはできず、Nuxt.jsのレー ルに乗る必要がある 開発のレールに乗ることで価値を出す 開発のレールを開発者がつくる
  15. Nuxt.jsを採用する理由 ▪ フルスタックフレームワークである ◦ Vuexストアの効率的な利用のためのオートローディング機能や、ディレクトリ構造を参 照して自動的にルーティングを生成する機能が標準で組み込まれている。 ◦ Nuxt.jsのレールに従うだけで便利な機能を利用することができる。 ▪ ビルドプロセスを隠蔽してくれる

    ◦ webpackの複雑な設定をメンテナンスする必要がない。 ◦ 慣れていない人にとってはwebpackのメンテナンスは非常に苦痛... ▪ アプリケーション開発に便利な独自レイヤが用意されている ◦ ルーティングをフックして特定の処理を行うことができるmiddleware機能や、Vueプラグ インを管理するための機能が標準で組み込まれている。
  16. UIをレンダリングす る UIをコンポーネント 化する クライアントサイド ルーティング 状態を管理する データの永続化 データバインディング(宣 言的レンダリング)

    Vue.jsのディレクティブへ の習熟 コンポーネント設計 (Atomic Designなど) 単一ファイルコンポーネン ト Vue Routerによるルー ティング Vuexによるデータフロー、 状態管理 クライアントサーバ通信、 Firebaseと言ったサーバレ スへの永続化 (※本日は扱いません)
  17. サクッとはじめる $ npx create-nuxt-app <project-name> ( いくつかの設問に答える ) $ cd

    <project-name> $ yarn run dev これだけで http://localhost:3000/ でアプリが動きます create-nuxt-app内のUIプラグイン設定で例えばVuetifyを選択すれば、それだけでVuetifyを適 用したnuxt上で動くアプリケーションの骨組みが生成されます
  18. ディレクトリ構造の詳細 assets webpackによる処理を入れるような画像ファイル、スタイルシートを配置する components Vue.jsコンポーネントを配置。Nuxt.jsの非同期データサポートは使えない layouts レイアウトファイルとして利用するVue.jsコンポーネントを配置する middleware ページをレンダリングする前に挟む処理を記述したJSファイルを配置する pages

    アプリケーションのページとなるVue.jsコンポーネントを配置(メインで使う) plugins Vue.jsアプリケーションをインスタンス化する前に実行したいJSファイルを配置 static robots.txtなどの静的ファイルを配置する store Vuexストアのファイルを配置する
  19. ストア Route Middleware Page Components 設定ファイル グローバル ページ Layout Components

    ルーティング プラグイン パッケージングされる アセット そのまま配信されるア セット /nuxt.config.js /plugins /assets /static /store /middlewares /pages /layouts 生成される
  20. ちなみに:なぜストアを使うのか? vue component vue component vue component vue component vue

    component vue component vue component vue component vue component vue component vue component コンポーネント指向で考えると、コンポーネントか らコンポーネントを呼び出す形のネスト構造にな る
  21. ちなみに:なぜストアを使うのか? vue component vue component vue component vue component vue

    component vue component vue component vue component vue component vue component vue component このコンポーネントからヘッダのコンポーネン トの内容を変更しようと思うと... まずルートのコンポーネントまで情 報を遡らせ... ※ このコンポーネントの情報を 変更したいとする
  22. ちなみに:なぜストアを使うのか? vue component vue component vue component vue component vue

    component vue component vue component vue component vue component vue component vue component このコンポーネントからヘッダのコンポーネン トの内容を変更しようと思うと... ルートのコンポーネントから目的 のコンポーネントに情報を渡す形 になる これは 面倒くさい...!
  23. ちなみに:なぜストアを使うのか? vue component vue component vue component vue component vue

    component vue component vue component vue component vue component vue component vue component 値を変更 値を反映 とてもシンプル
  24. 画面設計 {{ リスト名 }} {{ タスク内容 }} {{ タスク内容 }}

    テキストフィールド 削除ボタン List Component Card Component NewCardForm Component テキストフィールド NewListForm Component
  25. データモデル設計 List id: integer title: string Card id: integer title:

    string listId: integer 極めてシンプルなデータモデルです Vuexを利用してデータを管理します