Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Vue.js + Firebaseで作るリアルタイムアンケート / real time que...
Search
masahito.ando
June 19, 2019
Technology
2k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Vue.js + Firebaseで作るリアルタイムアンケート / real time questionnaire
masahito.ando
June 19, 2019
Other Decks in Technology
See All in Technology
Apache Icebergインフラストラクチャ:ストレージ・カタログ・エンジンの選択肢とClouderaプラットフォームでの実装
tsugiyama
0
110
メルカリのグローバルアプリで挑んだ AlloyDB 運用と課題解決の実践記
hatappi
0
250
LanceDB入門
mocobeta
8
570
JavaScript 研修 (2026)
recruitengineers
PRO
2
600
その“隠したつもり”が命取り ── 自前と平文をやめて「正解」に委ねる
kuroneko13
0
130
ブラウザ研修 2026
recruitengineers
PRO
6
1.1k
研究開発部の紹介 / Sansan R&D Profile
sansan33
PRO
4
24k
MIRU 2026 チュートリアル
keisuke198619
0
960
AIコーディングの次。コードレビューと理解負荷を解消して組織の開発生産性を高める
moongift
PRO
2
2.6k
社内の7割が使うデータ基盤を、 データチーム2人で回すためにやったこと
koh_yoshi
4
1.4k
Invisible to AI? Making TYPO3 Sites Quotable by AI Search Systems
wolfgangwagner
0
220
LLM・AIエージェントシステムベストプラクティス
shibuiwilliam
6
1.4k
Featured
See All Featured
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
280
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
210
The Invisible Side of Design
smashingmag
301
52k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
500
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
470
Everyday Curiosity
cassininazir
0
280
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
210
Designing Powerful Visuals for Engaging Learning
tmiket
1
490
Believing is Seeing
oripsolob
1
190
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
470
Transcript
Vue.js + Firebaseで作るリアルタイム アンケート ZOZOテクノロジーズMeetup #10 for Frontend Engineer 株式会社ZOZOテクノロジーズ
開発部 安藤 正人 Copyright © ZOZO Technologies, Inc.
© ZOZO Technologies, Inc. 株式会社ZOZOテクノロジーズ 開発部 安藤 正人 アパレル販売 ↓ 受注web制作会社
↓ ZOZOグローバル事業部 ↓ ZOZOTOWN開発部(検索改善チーム) 2 プロフィール
© ZOZO Technologies, Inc. 先日、ZOZOTOWNに出店いただいているブランド様655社1206名の 方にお集まり頂いただき 日頃の感謝とブランドの皆様と共に創っていきたい未来についての 共有を目的とした ZOZOTOWN Brand
Conference 2019というカンファレンスを開催し ました。 3 ZOZOTOWN Brand Conference 2019
© ZOZO Technologies, Inc. 4 その中の一コンテンツとして リアルタイムアンケートを実施したので その実装方法の一部を紹介します。
© ZOZO Technologies, Inc. 詳しくは https://techblog.zozo.com/entry/firebase-realtime-questionnaire
5 実はこのアンケート使用するの 2回目なんです。
© ZOZO Technologies, Inc. • 技術選定理由 • 各画面について • Cloud
Firestoreのデータ構造 • FirestoreとVuex Storeの連携 • 実装を通して思ったこと • 今後の改善点 6 Vue.js + Firebaseで作るリアルタイムアンケートの実装方法 今日のテーマ
© ZOZO Technologies, Inc. 7 • Firebase ◦
手軽にリアルタイムリスナーが使用できる(Firestore) ◦ この規模なら無料枠(Sparkプラン)で収まりそう ◦ 手軽にホスティングが可能 • Vue.js ◦ 他のフレームワークより学習コストが低い ◦ その分スピーディーに開発ができそう ◦ データ駆動設計 + Tweenライブラリ = 状態アニメーションが容易に実装可能 技術選定理由
© ZOZO Technologies, Inc. 8 各画面について
© ZOZO Technologies, Inc. 9 各画面について スタンバイ画面 回答中の画面 回答締切画面 User画面
質問内容は非公開のため画像を加工しています
© ZOZO Technologies, Inc. 10 各画面について 回答中の画面 結果画面 Screen画面 質問内容は非公開のため画像を加工しています
© ZOZO Technologies, Inc. 11 各画面について Admin画面 質問内容は非公開のため画像を加工しています
© ZOZO Technologies, Inc. 12 Cloud Firestoreのデータ構造
© ZOZO Technologies, Inc. 13 Cloud Firestoreのデータ構造
© ZOZO Technologies, Inc. 14 FirestoreとVuex Storeの連携
© ZOZO Technologies, Inc. 15 { "status": {
"current": { "questionIndex": 0, "deadlineTimeStamp": 1560487021599 } }, "votes": { "00mLbY71Rm88Nz11gxAA": { "questionIndex": 0, "selectedAnswerIndex": 0 }, "021tVyGd46luzFmrkeQp": { "questionIndex": 0, "selectedAnswerIndex": 1 }, "02GH3o3FUuS110IO5ZFX": { "questionIndex": 1, "selectedAnswerIndex": 1 },... } } コンポーネント内で扱いやすいように Vuex Storeとの連携の際に データ構造を変換 → statusCollection → statusModule votesCollection → questionModule Cloud Firestore { status: { currentQuestionIndex: 0, deadlineTimeStamp: 1560487021599 }, question: { questions: [ { text: '質問テキスト1', answers: [ { votesCount: 0, text: 'YES' }, { votesCount: 0, text: 'NO' } ] }... ] } } Vuex Store FirestoreとVuex Storeの連携
© ZOZO Technologies, Inc. 16 import { VuexModule,
Action, Mutation, Module, getModule } from 'vuex-module-decorators'; import store from '@/store/index'; import firestore from '@/firestore'; @Module({ dynamic: true, store, name: 'question', namespaced: true }) class Question extends VuexModule { // state questions = initializeQuestions();// stateの初期化を行う // mutation @Mutation updateQuestions(vote) { this.questions[vote.questionIndex].answers[vote.selectedAnswerIndex].votesCount++; } // actions @Action observeVotes() { firestore.collection('votes').onSnapshot((snapshot) => { snapshot.docChanges().forEach((change) => { const vote = change.doc.data(); this.updateQuestions(vote); }); }); } } export const questionStore = getModule(Question); questionModule FirestoreとVuex Storeの連携 vuex-module-decoratorsを使用 • クラス形式で記述できる • 型補完、インテリセンスが効く • thisを使ってお互いを呼び出せる メンバ変数 → State @Mutation + メンバ関数 → Mutation @Action + メンバ関数 → Action
© ZOZO Technologies, Inc. 17 実装を通して思ったこと
© ZOZO Technologies, Inc. 18 • 自身によるサーバ構築が不要、フロントエンドの知識のみでリアルタイムリスナーを使用したア プリケーションが作成できる • 参加規模にもよるが(1000人位のアンケートなら)
基本無料(Firebase Spark プラン)でアプリ ケーションが作成できる • 充実した日本語ドキュメント + 単一ファイルコンポーネント(.vue)で学習コストが低いうえ開発ス ピードが爆速 • Vue.js(データ駆動設計) + TweenMaxは状態のトランジション制御が楽に行えるし、ロジックとア ニメーションコードを分離しやすい 実装を通して思ったこと
© ZOZO Technologies, Inc. 19 • アンケート開始のタイミングや結果発表画面のへの切り替えを登壇 者のクリッカーでコントロールしたい •
アンケートの内容をその場で決定し反映したい • カウントダウン中にsoundをつけたい 今後の改善点(イベント運営チームからの要望)
© ZOZO Technologies, Inc. 20 ご静聴ありがとうございました!
None