Roppongi.vue #5
https://gyazo.com/9112d129906acee40daa4268e418ca52
https://roppongi-vue.connpass.com/event/164185/
Vetur Terminal Interface
https://slides.com/ktsn/vti
スピーカー
kazupon
katashin
Vuejs Amsterdamについて
Vue CLI UI
guijs
GitHub.icon https://github.com/Akryum/guijs
Nuxt.js
企業になってる
200万ドル
発表のときにEvan Youがラップしてた
インスタグラムも熱かった
Veturとは
VS Codeのエクステンション
シンタックスハイライト
.vueが対応
各ブロックの言語機能を提供
補完
型チェック
変数にマウスカーソルを乗せたら情報を出す
テンプレート解析の現状
変数の中身を確認
型チェックでエラー
何を入れるのか教えてくれる
定義元を見る
実験的なので使用するときはフラグをONにする
Vetur > Experimental: Template Interpolation Service
https://gyazo.com/208ec8356e3d16efe28b737ead8e17b1
Vetur Terminal Interface
CLIからtemplate型チェック
エディタのチェックだけだとまずい場合
CI上で動かして確認できるようにする
npm.icon npm i -g vti
vti diagnostics
型チェック
実装について
vue-eslint-parser AST
code:example-ast.js
{
type: 'VElement',
range: 13, 37 ,
name: 'div',
startTag: {
type: 'VStartTag',
range: 13, 18 ,
selfClosing: false,
attributes: []
},
children: [{
type: 'VExpressionContainer',
range: 18, 31 ,
expression: {
type: 'Identifier',
range: 21, 28 ,
name: 'message'
}
}],
endTag: {
type: 'VEndTag',
range: 31, 37
}
}
TypeScriptに変換する
code:example-ast.ts
import __Component from "./Test.vue";
import { __vlsRenderHelper, __vlsComponentHelper,
__vlsIterationHelper } from "vue-editor-bridge";
__vlsRenderHelper(__Component, function () {
__vlsComponentHelper(this, "div", {
props: {},
on: {},
directives: []
}, [
this.message
]);
});
templateの型チェックをTypeScriptの型チェックでしてくれる恩恵がある
https://gyazo.com/30699fa09d70faa5a12d5196393cab0c
https://gyazo.com/30699fa09d70faa5a12d5196393cab0c
不正な Location でクラッシュ
"pos": -1でTypeScriptコンパイラにわたすとクラッシュする
Location ズレ問題
エラー表示箇所が正しい位置にハイライトされない
Source Map Generation
マッピング
だいたいこういうことをやってる
独自仕様のSource Mapping
code:mapping.ts
ts.setSourceMapRange(tsNode, {
pos: 13,
end: 37
});
Location を持たない ASTの場合
コードジェネレーションでTS化
パースして位置情報が保管される
計算
https://gyazo.com/7fddcabeb80e4ecdaaa49a35678541f4
実装予定
Props の型チェック
Template Transformer の改善
Vue.js + Typescriptの事情と補助ツールの話
https://slides.com/kahirokunn/vue-js#/
kahirokunn
サンプル GitHub.icon https://github.com/kahirokunn/vue-ts-sample
Vue.js + typescriptの対応状況は日々改善されている
composition apiはtypescriptの体験を向上
vuedts
yarn.iconyarn vuedts src --watch
Nuxt.jsとVuetifyで新規サービスを爆速リリース
https://docs.google.com/presentation/d/1LxILi1GSKDeUK3QaN-4_PiRAEyqP-Xrx3OzA2fn1_AU/edit#slide=id.p
inosy22
株式会社GameWith
サーバーサイドエンジニア
ポケモンすばやさ比較ツールをつくる
2つのポケモンの素早さを条件に応じて比較できる
条件の変更はリアクティブに比較結果に反映される
バトル中に即座に計算しやすいUI
どう作るか
Nuxt.jsで静的ページ作成
規約ルーティングが便利
Vue.jsのテンプレート記法がわかりやすい
nuxt generateで静的ページ生成
Vue.jsで使用した機能
Vueテンプレート記法
CompositionAPIの基礎的な記述
フォーム入力バインディング(v-model)
Component設計
繰り返し使われる部分を、Propsで機能や値を渡せば動作するように、抽象的なコンポーネントに
OGP設定も一括でできる
Vuetify
Vue.js用コンポーネントフレームワーク
マテリアルデザインのコンポーネントが利用できる
機能とデザインがセットになっているので実装コストを大幅に削減できる!
アイコンも簡単に利用できる
デザインテーマはDarkを使用
コンポーネントも流用
インクリメンタルサーチ
https://vuetifyjs.com/ja/components/combobox
v-radio-group
v-checkbox
v-selectbox
v-progress-liner
レスポンシブ対応
グリッドシステムを採用
Netlify
無料で使えるホスティングサービス
Github連携したデプロイが簡単に設定可能
無料SSL/カスタムドメイン/FaaSとかもあり
PR毎にプレビューサイトを作れる
Firebase と比較するとできることは少ないが、必要最低限なので設定が簡単で扱いやすい
Domainはサブドメインを自由に変更
Google Analitics 設定
デプロイする際に、<head>タグ内に埋め込む文字列を設定できる
結果
12時間でできた
SEOで1ページ目に表示されるように
Twitterでも反響あり
2ヶ月程で 1万人以上 が利用してくれている!
Nuxt.jsでCompositionAPIを使う
https://speakerdeck.com/kubotak/nuxt-dot-jsdecompositionapiwoshi-u
KenjiroKubota
株式会社M&Aクラウド
LaravelからNuxt.jsへ
HTTP APIを作成してNuxtでフロントエンドを作る
Nuxt + TypeScript + Composition API
nuxt typescriptを利用する
import VueCompositionApi from '@vue/composition-api
問題点
SSRの際にデータをフロント側に持ってくるときに
window._NUXT/_.~に出力
CompositionAPIのときはうまくいかなかった
出力された変数情報がからなのでAPI通信などでデータ取得時は再度取らないといけない
Vuexを使う
クラスベース
vue-module-decorators
Vanilla
型定義を利用して素朴に記述
クラスベースに慣れてないので採用
nuxt-typed-vuex
型定義の恩恵が得られそう?
https://gyazo.com/7f0a85a4740ae97d4ab95c50c876c2c5
なぜ途中で挟む?
型情報が失われるので定義し直すため
SFCで依存するものをcomposition APIのみにする
クライアントサイドだけで非同期通信して値を取得する場合はVuexを使わず、CompositionAPIだけで完結させている
テストする
Jest
LocalVueにVuexとCompositionAPIを登録
VuexStoreの登録
モジュールモードで登録されるように加工
APIレスポンスのモックを作成
モックの差し込み
アットコスメのブランドマーケティングシステムにVuexを導入した話
https://docs.google.com/presentation/d/1VEDAMG50k28bp3zinbRf1aPMVwrV5602OEpMp96LFOk/edit#slide=id.g7ea1e9cf8f_0_344
株式会社アイスタイル
sakaguchii
テクノロジー本部デザイン部所属
y_okasuke
テクノロジー本部BIDソリューション開発部所属
マーケティングシステム「ブランドオフィシャル」というサービス
主に化粧品ブランドがマーケティング分析に活用
2018/3
サービスリリース
2020/1
新機能リリース
商品やコンテンツに接触したユーザーデータの分析画面
ユーザーの行動を絞り込み、接触した商品情報等を表示する機能
Vuex導入
開発期間
7~10月 仕様をもとにひたすら開発
11月 単体テスト
12月 サービステスト
導入理由
新画面ということで新しい技術の選定
APIにて頻繁にデータを取得・更新
APIレスポンスのデータ形式が微妙に異なる、表示する項目が多く、
表示レイアウト形式も非常に複雑
リアルタイムで絞り込みかつ可視化が必要→ストアの機能を十全に活かせることができるのでは…
Vue.js使った人が多かった
学習
基礎から学ぶVue.js
https://qiita.com/m_mitsuhide/items/f16d988ec491b7800ace
https://github.com/vuejs/vuex/tree/dev/examples
プロジェクト構成
appディレクトリ配下
Laravel(blade.php)にて読み込むjsファイル類
components配下
vueコンポーネント、APIクライアント、エンティティ、Store、各種モジュール類
entities配下
企画側と認識を合わせた、このプロジェクトの共通言語(ドメインモデル)が定義されたクラスファイル類
ファクトリークラス
エンティティオブジェクトを作成
APIクライアント
config配下
定数を定義したモジュール
util配下
ユーティリティクラス
Storeディレクトリ配下
エンティティをStore(state)に保持し状態を管理
トップレベルのVueコンポーネント
実装について
DOM読み込み完了
画面に必要なトップレベルのVueインスタンスを生成
blade.php側からのdata属性をpropsで子コンポーネントに流し込む
受け取ったjsonをファクトリーを介してエンティティへ
Store(state)データを操作するjs
getters,mutations,actions実装
actionsにてAPIクライアントを呼びだし、mutations内のメソッドにてStateを変更しcommit
storeのactions内のメソッドを呼び出す
表示について
コンポーネント
ダッシュボード固有のパーツ
商品の個別パーツ
「商品画像」「商品名」「評価点」「コメント数」「順位」
記事のパーツ
情報構造(ブログ・商品情報・クチコミ)や、デザインの構造から再利用性を考えてコンポーネントをわける
Issue
Atomic Designが意識できなかった
コンポーネントを切るとき「UIとして再利用しやすいか」よりどちらかというと「作業分担がしやすいか」に重きをおいてファイルをわけてしまった
知見・経験の少なさから、コンポーネントとしての「あるべき」が見えていなかった
要件定義・マークアップと並行してデザインが進んでいたため(!)、UIとして「最小のパーツ」が見極められなかった
今なお答えは出ていないので、「あるべき」は模索していきたい
CSSのコンポーネント化が出来なかった
CSSは画面単位でファイルを作成、読み込むようにした
結果、自己完結するコンポーネントにならなかった
ただし、vue-loaderはコンポーネント内に記述されたcssの順番を担保しないため、vue-loaderのバージョンが変わり、cssの順番が入れ替わった時確認が必要(スコープがちゃんとしていれば大丈夫とはいえ、確認しないままリリースは出来ない。。)
保守性を高くする
現在 jasmin、karumaを使用している→Vue Test Utils、Jest導入
TypeScript導入
よかったこと
画面の関心事をエンティティとして取り扱い、Storeで管理することにより複雑な画面の状態変化に対応することができた
仕様変更にも柔軟に対応できた
今後の要望にて柔軟にカスタマイズができそう