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
Phoenix1.4とVue.jsによるサービス構築のノウハウ
Search
MIXI ENGINEERS
PRO
June 01, 2019
Programming
2
2.9k
Phoenix1.4とVue.jsによるサービス構築のノウハウ
https://elixir-fest.jp/
Erlang & Elixir Fest 2019の発表資料です。
MIXI ENGINEERS
PRO
June 01, 2019
Tweet
Share
More Decks by MIXI ENGINEERS
See All by MIXI ENGINEERS
SoccerNet GSRの紹介と技術応用:選手視点映像を提供するサッカー作戦盤ツール
mixi_engineers
PRO
1
190
2つのフロントエンドと状態管理
mixi_engineers
PRO
3
230
月間4億メディアの画像解析を救え!みてね発・オンデバイスMLで挑む圧倒的コストカット作戦
mixi_engineers
PRO
2
270
Google Agentspaceを実際に導入した効果と今後の展望
mixi_engineers
PRO
4
1.7k
プロジェクトマネジメント実践論|現役エンジニアが語る!~チームでモノづくりをする時のコツとは?~
mixi_engineers
PRO
5
500
セキュリティ研修【MIXI 25新卒技術研修】
mixi_engineers
PRO
4
2.3k
QA・ソフトウェアテスト研修【MIXI 25新卒技術研修】
mixi_engineers
PRO
3
2.5k
AI研修【MIXI 25新卒技術研修】
mixi_engineers
PRO
8
4.1k
ソフトウェアアーキテクチャ研修【MIXI 25新卒技術研修】
mixi_engineers
PRO
39
16k
Other Decks in Programming
See All in Programming
NetworkXとGNNで学ぶグラフデータ分析入門〜複雑な関係性を解き明かすPythonの力〜
mhrtech
3
1.1k
Le côté obscur des IA génératives
pascallemerrer
0
130
デミカツ切り抜きで面倒くさいことはPythonにやらせよう
aokswork3
0
210
Local Peer-to-Peer APIはどのように使われていくのか?
hal_spidernight
2
460
明日から始めるリファクタリング
ryounasso
0
120
実践AIチャットボットUI実装入門
syumai
7
2.5k
そのpreloadは必要?見過ごされたpreloadが技術的負債として爆発した日
mugitti9
2
3.1k
エンジニアとして高みを目指す、 利益を生み出す設計の考え方 / design-for-profit
minodriven
23
12k
Breaking Up with Big ViewModels — Without Breaking Your Architecture (droidcon Berlin 2025)
steliosf
PRO
1
350
WebエンジニアがSwiftをブラウザで動かすプレイグラウンドを作ってみた
ohmori_yusuke
0
170
Serena MCPのすすめ
wadakatu
4
910
Pythonスレッドとは結局何なのか? CPython実装から見るNoGIL時代の変化
curekoshimizu
5
1.5k
Featured
See All Featured
Writing Fast Ruby
sferik
629
62k
It's Worth the Effort
3n
187
28k
Practical Orchestrator
shlominoach
190
11k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
51k
Into the Great Unknown - MozCon
thekraken
40
2.1k
Building an army of robots
kneath
306
46k
jQuery: Nuts, Bolts and Bling
dougneiner
64
7.9k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
6.1k
Why Our Code Smells
bkeepers
PRO
339
57k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
127
53k
Transcript
XFLAG STUDIO Phoenix1.4とVue.jsによる サービス構築のノウハウ 2019.06.01 Tsuyoshi Yamaguchi 株式会社ミクシィ
Phoenix1.4とVue.jsによる サービス構築のノウハウ ⾃⼰紹介 はじめに PhoenixとVue.jsのノウハウ 最後に 3 5 11 21
2
⾃⼰紹介 3
あなたは誰︖ だれ︖ • ⼭⼝ 強 • 北海道出⾝ どんな⼈︖ • 2018年5⽉にミクシィ⼊社
• Elixir/Phoenixを⽤いたバックエンド開発 • JavaScript/TypeScript/Vue.jsを⽤いたフロントエンド開発 よく使う⾔語は︖ • Elixir, JavaScript, TypeScript 好きなものは︖ • Game of Thrones, スノーボード 4
はじめに 5
今⽇話すこと 現在開発中のプロダクトでは、⼀部機能でPhoenixとVue.jsを⽤いたWeb ページを提供します。本⽇は、それらの開発時に得られた知⾒についてお話し ます。 6 Phoenix Vue.js ×
Vue.jsとは • WebのUIを構築するJavaScriptフレームワーク • 再利⽤可能なコンポーネント、双⽅向データバインディグ、仮想DOM などの特徴を持つ • 開発中プロダクトでは、ユーザーインタラクションに伴って動的にペー ジ内のUIを変更するために利⽤ 7
Phoenixとは 省略 8
PhoenixとVue.jsでできること • クライアント(ブラウザ)側における、動的なコンテンツの更新 • ページをまたいだ同⼀コンポーネントの再利⽤ 9
ディレクトリ構成例 10 "dependencies": { … "vue": "^2.6.10" }, "devDependencies": {
… "vue-loader": "^15.7.0" } module: { rules: [ ... { test: /\.vue$/, loader: "vue-loader" }, ] }, plugins: [ new VueLoaderPlugin(), ... ], Phoenix 1.4からはwebpackがデフォルトの バンドラとなった (以前はBrunch)
PhoenixとVue.jsのノウハウ 11
Digestを使おう (1/3) Digestとは︖ Phoenixが提供する静的ファイルの処理機能。 Digest機能を使うことで、JavaScriptファイルに以下の処理することができ る • ファイルの圧縮: • ダウンロードするファイルの量の削減
• ファイル名へのハッシュの追加: • 古いファイルのキャッシュを読み込まなくなる 参考: https://hexdocs.pm/phoenix/Mix.Tasks.Phx.Digest.html 12
Digestを使おう (2/3) 13 $ cd asset && npm run deploy
$ cd ../ && mix phx.digest 1. Vueを含むJavaScriptファイルのビルド 2. Digest処理の実⾏
Digestを使おう (3/3) 14 phx.digest により⽣成されたマニフェスト ファイル。 リクエストされるファイルとハッシュを含んだ ファイルとの対応関係を定義する。
Vueに値を渡してみよう(1/3) 15 ⽅法1: グローバルスコープを介して値を渡す page_controller.ex index.html.eex page.js
Vueに値を渡してみよう(2/3) 16 ⽅法2: input hiddenを介して値を渡す page_controller.ex index.html.eex page.js
Vueに値を渡してみよう(3/3) 17 メリット デメリット グローバルスコープを介して 値を渡す - 実装は比較的シンプル - JavaScriptのグローバルスコープを汚染する
Input hiddenを介して 値を渡す - グローバルスコープを汚染しない - プリミティブな値しか渡すことができない ただし、いずれの⽅法も処理内容を分散させることになり、.exファイ ル、.eexファイル、.jsファイルが密な結合になりやすい
ファイルを分割しよう(1/3) 18 page1.html.eex page2.html.eex import import page1.js page2.js compiled.js <script
src=“compiled.js”> <script src=“compiled.js”> Build by webpack ダウンロードするファイルが肥⼤化する xxx.vue yyy.vue aaa.vue bbb.vue 大
ファイルを分割しよう(2/3) 19 page1.html.eex page2.html.eex import import page1.js page2.js page2.js <script
src=“page1.js”> <script src=“page2.js”> Build by webpack ページごとのJSファイルを⽣成する page1.js xxx.vue yyy.vue aaa.vue bbb.vue
ファイルを分割しよう(3/3) 20 Webpackのエントリーポイントをページ単位で指定する 参考: https://webpack.js.org/concepts/entry-points/
最後に 21
PhoenixとVue.jsを使ってみて - PhoenixテンプレートとVue.jsを⽤いる場合、⼀程度の規模の処理をさせ ようとするとコードが複雑になりがち。またテストが困難 - Vue.jsのようなJavaScriptフレームワークを使う場合、Phoenixテンプ レートと⼀緒に⽤いない⽅が良いかも - Phoenix側はAPIサーバーとし、Vue.jsはAjax通信によって得られたデー タを扱う作りとした⽅がシンプルな構造にできる
- これからはLiveViewという選択肢も…? 22
23