hiroktsのブログ

IT開発系の勉強会の感想とか雑記とか

Vue Fes Japan に参加してきました

2018.11.03 にあった、「Vue Fes Japan」に参加してきました。
素晴らしいイベントでした。
セッションだけでなく、ランチとかディナーもすごく評判が良かったみたいです。
スピーカーの皆様、スタッフの皆様、ありがとうございました。

f:id:hirokts:20181104103351j:plain

Keynote

vuefes.jp Vue.js の作者である Evan YouさんによるKeynoteでした。

英語がすごく聞き取りやすかったです。
全部は理解が追いつけなかったので、英語勉強したいと思いました。

内容はVue.3.0についての紹介で、3.0でものすごくパフォーマンスが向上するという感じでした。本当にすごいとしか言いようがない。

以下はメモ内容をそのまま載せていますが、書き間違いなど多々ありそうです。

Vue 3.0 についてのキーノートのメモ(書き間違いあり)

より速く、ちいさく、メンテしやすく、よりネイティブ向けに作りやすく
よりあなたのコードを保守しやすく

  • 仮装DOMの実装をフルスクラッチで作り直し mount, patchの処理が最大100%向上

  • proxyを用いた監視で完全な言語レベル 速度向上

  • 通知の仕組みを作ることができる ES5のGetterやSetterを使っているが、かわりにproxy機能を使うことになる プロパティの追加や削除についても知ることができる

Object.definePropertyはさようなら インスタンスのproxyという概念も登場

  • 実行時のオーバーヘッド削減のため、コンパイル時にヒントを追加

template is static analyzable テンプレートからのコンパイル コンポーネント探索の高速化 子要素数0であることをコンパイラ出力し、スキップする

Just in time optimization

  • スロット生成の最適化

インスタンスが依存関係を正しくトラッキングできるように 不要な親子のレンダリングを回避 Lazy Funcitonという仕組みを取り入れ、 子関数は必要に応じて呼び出される

  • Hoisting (巻き取り)
    • Static Tree Hoisting
    • Static Props Hoisting ノード全体への適用はしない
    • Inline Handler Hoisting

パフォーマンスが2.5から3.0protoで倍以上向上

  • Tree-shaking ビルトインのコンポーネント (keep-alive, transition)

  • カスタムrendererAPI Canvas, iOS, などネイティブ向けの出力を出すために作った

  • コードのメンテナンス性向上 リアクティビティAPI

  • Render Track

コンポーネント countをprop インスタンスを見るとどのようなキーがあり、mutateされたかわかる

  • TSXによるTypeScriptサポートの強化 型によるwarningが表示される

(TypeScriptよさそう)

  • 実験的なHooks API

  • Mixinのサポート 複数のmixinをコンポーネントで使うとネームスペースの問題が発生することがある

hooksはreact.jsのDanさんのプレゼンを聞いて

Vue.js と Web Components のこれから

speakerdeck.com スピーカーはTakanori Okiさんです。 FOLIOに所属しており、ウェブフォントが大好きとのこと。

Web ComponentsはEdge以外でほぼ実装が進んでおり、一気に普及していく見込みとのこと。
Vue.jsとWeb Componentsとの共存方法などについてのお話でした。
Webアプリケーションを作る上で、Vue.jsだけでなく将来的な移行も考えてUIのフレームワークを考える場合、Web ComponentsやAtomic Desginなどの考え方は非常に有用だと感じさせられました。 とても面白かったです。

この講演についてのメモ (書き間違いなどあり)

web標準技術 EDGE以外では動く polyfillを使わなくてもうごかせる

Custom Elements

独自の機能や見た目を持ったHTML Elementを定義できる

Shadow DOM

shadowRoot グローバルのCSS, JSSは影響できない

HTML Template

要素 HTML

HTML Modules

HTMLをJavaScriptをimportできる まだGitHubで議論中 CSS Modulesも

どうやって

来週のVue.js with Web Componentsの勉強会が参考になりそう

Build with Vue.js

Vue CLI 3 BUild Targets

vue/web-component-wrapper

Vueコンポーネントをラップしてカスタム要素として登録する

Example

UIフレームワークを統一したい JavaScriptフレームワークごとに切り替える、とかは効率が悪い

Scopeを制限したい -> Shadow DOM CSS

Demerit

属性値にStringsのみ 外部から渡されるイベントハンドリングが難しい DOM要素の取り回しが面倒 CSSの設計を大幅に見直す必要がある

いまのところ

Vue.jsの機能でコンポーネントを作ったほうがよい

Micro frontend

機能の集合体だとみなす

frontend モノリシック

フレームワークの移行

Web Components UIフレームワーク

Vue.sj = Webアプリケーションを構築するためのフレームワーク UIを作るためのものだけではない

Summary

Web componentsはpoduction ready Vue.jsとWeb Componentsは共存できる UIをWebComponentsに任せることで負債を減らすことができる

Q and A

有用な情報は?

  • Takanori OKiさんによる技術書典本

inutetraplus.booth.pm

  • webcomponents.org
  • よくわかるWebComponents せんすいさん

Vue Designer: デザインと実装の統合

slides.com

Katashinさん自身が開発している、Vue Designerについての紹介
Vueのコンポーネントの見た目のデザインがVSCode上でプレビューしたり、chrome devtoolのようにCSSいじったりできるみたいでものすごく便利そう。 これを使うと、デザイナーさんと一緒に開発するフローで革命が起きる感じがします。

この講演についてのメモ (書き間違いなどあり)

作っているVue Designerはまだプロトタイプ

デザインと実装が分かれている photoshop, adobe xd, sketch

デザイナー

UX, 情報設計、アクセシビリティ、スタイルガイド

開発者

コード設計 状態管理 レスポンシブ アニメーション

デザインと実装が分かれることでおきる問題

デザインはsketch, photoshop 開発は vueファイル

単純に二度手間

検索フォームをデザインせずに実装 デザインに戻すのを忘れると、、、

静的なモックアップ ウィンドウの幅 リキッドにするのか、固定にするのか

Dreamweaver デザインビュー

Vueegg

一回プロトチイプとしてデザインしたものが、Vueにつかえる Vueからは戻せない

FramerX

組み立てたUIはReactのコンポーネントになる Reactから戻せそう

ほしいデザインツール

SFCが実装、かつ、デザイン 長期開発、運用

デザイナー向けにするとUIを作りこむのが大変

直近の目標

まずは開発者が使って便利なもの GUI完結ではなくコードを併用

vscode上でVueコードを表示

GUI上であたっているスタイルを編集できる コード上に反映

データを入れて確認もできる 例:ボタンのコンポーネントはlabelというpropsを持っている labelに"test label"を入れた場合

サーバー側にSFCを持っている SFCをパーサーでASTに変更 WebSocketでクライアントに渡す クライアント上でレンダラーでVSCodeGUIに表示

GUI操作はWebcomponentsから逆パーサーにわたし、コードに反映

プレビュー上でデザイン デザインが動的

SFCの静的解析

パーサー自体は自前じゃない

vue-eslint-parser

babel/parser -> jsのブロックを解析 TypeScriptにも対応

postcss

AST プレビューのレンダリング 意味解析 props / data 当たっているスタイル importしているコンポーネント GUI上の操作と対応づけ コード編集・生成

プリプロセッサ

TypeScriptのみサポート

Vue Designerはオープンソースでやっている

プレビューはVueのレンダラーを再実装している Vueのテンプレートコンパイラーと同じことをやっている 描画するだけじゃなくて、任意の処理を挟めるようにしたい ドラッグ&ドロップなど 要素間のマージンのピクセル数を表示したい なので、再実装

たいへん

意外にエッジケースが多い Vueのレンダラを使う方法も模索したい

Vue3.0カスタムレンダラ を使いたい

サーバークライアント構成

プレビュー上で何か操作したら、コードに反映

VSCodeのWebViewが想定していない使い方 エディタの中のプロセスとコミュニケーションをとるのがリッチじゃない サーバーとクライアントにして、WebScoketで通信するほうが楽だった 今はVScodeのWebViewはもっと使いやすくなっている

debugがらく Chrome dev toolsつかえる

開発者が使って便利なものにしたい

1.0.0にむけて

Chrome devtools on VSCode

レイアウトできるツールにしたい 大まかなレイアウトを作るときはVue上でやりたい

npm installするだけでデザインを組み立てられる elment-vuetify quasar-framework vuesax

デザイナーと開発者がGitHubで同じコードを編集 すごく楽しい

コンポーネントカタログ 自動生成 右側から出てきたドロワーに一覧があった

Nuxt.js 2.0

Nuxt.jsの開発者である Sébastien Chopinさん自身によるNuxt.js2.0の紹介でした。 こちらもすごかった。 日本語での通訳も出ていたんですが、もっと英語勉強して普通に聞き取れるようになりたいと感じました。

内容としてはデモが非常に多く、ついていくだけで精一杯であまりメモは取れなかった感じです。

この講演についてのメモ (書き間違いなどあり)

Nuxt.jsを使うパターンの紹介

ブラウザー:リクエスト -> Nuxtサーバー:リクエスト-> APIサーバー
APサーバー:json -> Nuxtサーバー:HTML -> ブラウザ

  • serverside rendering and client navigation

  • 静的ファイルの生成パターン

ブラウザ リクエスト サーバー HTML+js

  • SPAパターン

Nuxt.js 2.0

webpack4 + babel7

CLIを改善

Webpack Bar DEBUG=nuxt consola

より速いBuild

コードスプリッティングの制御

build.splitChunksを利用

バンドルの分離

クライアントサーバーを分離できる

Nuxt-start

ランタム限定 軌道速度2倍

ESM対応

ESMモジュールサーバー ミドルウェア

Nuxtjs 2.3.0 coming soon

モダンブラウザー向けビルド

nuxt build --modern

内部リファクタ

note のフロントエンドを Nuxt.js で再構築した話

note.mu 福井 烈さんによる発表

noteRails とAngular.js 1系のSPAから、BFF を Nuxt.js(Vue.js)に移行していっているお話でした。 RailsAPIのみにとどめて, RederとclientナビゲーションをNuxt.jsとVue.jsに置き換える話は自分のやっていきたい開発としても、とても参考になる感じです。
AtomicDesignを活かしてコンポーネントを開発していく話もあり、過去に一旦挫折したStorybookをまた復活させたという話が響いた人も多かった模様でした。

この講演についてのメモ (書き間違いなどあり)

(メモよりもリンク先のスライドを読んでいただく方がいいと思います。)

noteを最初に開発した当時、react, vue はversion 1にもなっていなかったためAgular.jsを採用

課題

  • SSRをサポートしていない
  • 表示速度

フレームワークリニューアル

Vueを選んだ理由

  • 実行速度と開発効率の両立
  • SSRサポート

  • 学習コスト デザイナーもHTMLでかける Angularjsと書き方が近い

  • 日本語ローカライズ版が用意されている

  • コミュニティが活発

Vue.jsのエキスパートがコンサルに

@kitak - 実装のQA - 設計サポート - ハンズオン開催

Nuxtのきっかけ

VueでSSRするのに簡単

pages配下にコンポーネントを置く
asynccData()/ fech()で必要なデータを定義取得する

  • RailsAPI
  • View層だけをNuxt.jsに

開発体制

  • エンジニア3名
  • デザイナー2名

現時点でのパフォーマンス比較

  • Lighthouse 3 -> 41
    のこりは画像の最適化が大半

  • WebPageTest

開発環境

  • Nuxt 2.2.0
  • Jest
  • Eslint
  • Prettier (formatter)
  • Circle CI
  • Sentry

Vuexの主なルール

  • モジュールモード
  • mutation/actions/gettersのタイプには定数を使用
  • 状態管理に秩序

Vuexモジュールの肥大化

  • Nuxt.jsの新モジュールでリファクタ 半分以上がactions

  • 機能単位でモジュール分割

Atomic Design

アトミックデザインの書籍 と 菅原さん Vue.jsからみたAtomic Designの記事が参考になる

Atomic Desginの課題

Storybookを使っている

Nuxt.jsと設定周りを合わせるのが大変で 過去に挫折 廃止したものを復活した

Storybook webpack4対応 Nuxt2.0でいける
(挫折した時点より使えるようになっていた)

ユニバーサルJavaScript

  • クライアントでもサーバーでもどちらでも実行できるJavaScript
  • SSRは対応必須

DocumentAPIを使っているもの

ssrを使うときだけjsdomをグローバルに入れる

SSのライフサイクル

サーバーサイド、クライアントサイドどちらも通るライフサイクルを押さえる

Polyfill

Polyfill.io UserAgentごとに必要なpolyfillを選べる FastlyのCDN

Serverless

AWS Lambdaの上でNuxtを動かしている

Serverless Framework

過去の構成:EC2 + Node.js + pm2
ぜか突然pm2がおちる

Lambda + Nuxt

LambdaでExpressが動かせる nuxtはExpressのミドルウェアとして動かせる

クラウドフロントでリクエストを受けて ELB経由でRailsに飛ばすか、APIGateway経由でLambdaに飛ばす

まとめ

  • パス(URL)ベースで小さく移行するのは有効
  • SSRの導入は簡単
  • 導入は簡単だが、学習運用コストは上がる

  • 環境基盤のサポート、規約が非常に強力

  • プラグインミドルウェアのサポート

  • 技術的制約

  • 採用して良かった

#### 内容と関係ないですが

yatteiki.fm

この講演のあとに、Yatteiki.fmの@9mさんに声をかけていただきました。ありがとうございました。 たまたま自分がYatteikiパーカー着ていたのですが、となりに@9mさんが座ってました。。。全然気づかなかった。

1年間単体テストを書き続けた現場から送る Vue Component のテスト

speakerdeck.com

土屋 和良さんによる発表でした。 Atomic DesignのStorybookも活用しながら、Vue ComponentをVisual Testingするのが最高という内容だったと思います。

この講演についてのメモ (書き間違いなどあり)

(メモよりもリンク先のスライドを読んでいただく方がいいと思います。)

何をテスト

Componentのテストもそうでないテストも考え方は一緒

@t_wada プライベートメソッドはテストする必要がない 外部から見た振る舞いのテストじゃない

  • テストするとき マウントするのか、シャドウマウントするのか

  • シャドウマウント はchildコンポーネントコメントアウトするものとおなじ

  • Snapshotテスティング DOMの変更 差分がなければ通る
    フェイルした後に意図的な変更ならば、そのスナップショットを新しいExpectedに

Visual Testing

CSSもテストしたい

Visual TestingはSnapshotTestingの画像版

私が採用した最高のtesting

Visual Testing

Storybookを使う スクリーンショットはzisui 比較はreg-suit

vuexに依存しているcomponentはstoreを準備するのが面倒 対応策は
- PresentationalとContainer Componentにわける - 汎用的なmockを用意していく

Storybookがあるとvisualtestしやすくなる

QAでのE2Eもやらないのか、ということについての質問
CypressなどのE2Eでエッジケースまで対応するのは大変 APIをどうするかなどの問題を回避するためにもコンポーネント単位でテストをしたい、とのこと