I want to be "I can develop frontend a little"

とあるエンドエンジニアの勉強会や技術系の個人的メモ集。

2019/09/25 【シューマイ】Tech Lead Engineerから最新技術を学べ!Vue.js編 参加してきました!

2019-09-25(水)に開催された【シューマイ】Tech Lead Engineerから最新技術を学べ!Vue.js編 に参加してきました!

shuuu-mai.connpass.com

f:id:matsumana07384:20190925230347j:plain
入り口のご案内

1人30分のLTなので、LongTalkでした!
以下雑なメモです。

「Nuxt.js + Firebaseでの開発と高速化に挑んだ話」

株式会社リビルド 代表取締役 鈴木 孝之氏

ざっくりすぎる概要

Firebase をなぜ導入したの?

  • 技術スタック
  • 関連ドメイン
    • ワーカー画面(mpa)
      • 一部がvueのcomponentを採用
    • エージェント画面(mpa)
    • 企業管理画面(spa)
    • 自社管理画面(spa)
  • 各画面でチャット機能を作りたい
    • どう作っていくのかを議論
  • 様々な調査
    • ロングポーリング
    • WebSocket
      • LaravelEchoで実現する方法を調べたものの難しそう
  • Firebase の導入前の懸念点(2019年1月時)
    • 無料枠だと1GBしか使えない
    • 検索クエリに制限あり

FireBaseを使ってみた

  • JSONの構成
    • usersコレクション
      • roomsコレクション
        • メッセージなどの情報が入っている
  • シーケンス図
    • フロントだけの図
  • Usersにサブコレクション理由
    • 実装当時は検索が困難だったので、Usersにサブコレクションをもたせた
  • リアルタイムを担保する部分
    • 変更を感知してチャットを更新

ビルド高速化でやったこと

  • Webpack Bundle Analyzer をファイルの関連性の可視化ができる
  • 改善案
    • moment.js が重い
      • 複数の言語を全部読み込んでいる
        • 日本語だけでいいのに他の言語も読み込んでいた
          • 必要な分だけに絞った
    • loadsh.js が重い
      • ディープコピーにしか使っていない
      • クリーンJSに変更
    • 1MB軽量化に成功!

まとめ

  • 思ったより導入コスト高め
  • 少し複雑なアーキテクチャになった
    • 知見があれば回避できたかも

質疑応答

「Firestoreから(チャットユーザの)プロフィール画像は取れない」とおっしゃっていた理由が気になります。URLをFirestoreに保存しておくのならできるのでは、と思ったのですが、どんな設計だったのでしょうか?また、RDBとNoSQLの使いわけについて詳しくお聞きできたらうれしいです!

  • やり方はある
    • DBのS3に画像のURLを付与すれば可能なはず
    • Usersによけいな情報を持ちたくない
      • DBが分断していたため

Day.js は検討されなかったのでしょうか?

  • 日付周りでなにか原因があると思ったので、検討してなかった

ちゃんと聞いてなかったかもなのですがmoment.jsやlodash.jsが遅いっていうのを可視化してた図は何かのツールですか??


GMOインターネット株式会社 デベロッパエバンジェリスト 成瀬 允宣氏

Vue.js × フロントエンドのつくりかた

speakerdeck.com

ソースコードを見ながら説明してくださる形式!

ざっくり内容

  • BuildersConで登壇されていた内容を寄りコードに関して説明する形でお話されていました!

つつましいエラーハンドリング

  • エラーハンドリング
    • エラーハンドリングは、ソフトウェアの使い勝手を決定づける
    • やりたいことをやってもらうがソフトウェアの本質のはず
  • 拾ってあげるべきエラー
    • ユーザーが回復できるエラー
      • クライアントの回復できるエラー
        • バリデーションを表示
        • 画面ごとでハンドリング
      • サーバーの回復エラー
        • 画面ごとにハンドリングしたい→したくない!
          • 通信ライブラリ(axios)をラップ
        • 細かく制御したいときもある
          • オプションパラメータを付ける
            • 確認画面から入力画面に戻るエラーを追加
  • エラーハンドリングは場合分け
    • 成功したときはハンドリングする
    • 失敗/例外
      • ハンドリングする?しない?
    • ハンドリングするときにオプションで対応する
      • 基本的にはなにもしなくてよい状態に
        • 必要なときに差し込めるように

認証認可の戦略

  • 強力な仕組みが必要
    • 人力を排除する
  • 認証と認証切れ
    • 認可が必要ではないページを設定する
  • ルートの認可
    • すべてのルートは最高権限が必要にする
      • 認証が不要な画面は設定
  • リソースの認可
  • 子同士がやりとりするのはNG
    • 相互参照しあってはいけない
  • 親のルートページが司令塔になるべき
    • 上から下はメソッドで、下から上はイベントで実装するべき
  • ページ遷移や通信をする箇所
    • ボタンポチ→コンポーネント→ページ→ページに遷移の流れ
      • ページを見てどこに遷移するかわかることが大切
      • コンポーネントがリンクの場合は、値としてリンク先をページで渡しているので、OK
      • ページに通信を書くことであとから苦労することが減る

まとめ

  • 無駄な努力はせず必要な努力をする
  • チームで注力するべきところはどこかを考えながらコアな部分を作っていこう

質疑応答

エラーメッセージなんですがサーバーからどれくらい詳細に返しますか??詳しく返しすぎると良くないケースがある場合がある気がしています。

  • フロントで返している

wraxiosはかなり作り込んでるように思えますが、どれくらい時間かけて作りましたか?おおよそでいいので教えてほしいです。

  • 数時間ぐらい

SPAの認証はJWTでやっていますか??まだなんとなく怖いのですが…

  • JWTはSessionとは違うものらしい
  • ヘッダーでトークンを返して、ページに埋め込んでいる

stateのバケツリレーしたくない時はvuex使うかな

  • 書くときに楽するじゃなくて、読むときにどうなのかを意識して成瀬さんはつかっていない

複数ページで全く同じ通信内容が発生した場合はどうやってコードの重複を防ぎますか?api.jsなど通信をライブラリ化してページからはそれを呼び出しますか?

懇親会

  • シューマイを食べながら懇親会!

f:id:matsumana07384:20190925230354j:plain
懇親会に登場するシューマイ

感想

  • はじめの登壇者の方のBDD=ビーチ駆動開発は斬新で面白いなーと思いました!
  • わりと初心者向けの内容だった印象なので、初心者エンジニアとしてはなるほどなーと思うことが多かったです!
  • またフロントエンド関連の会があれば参加します🌟