Vue Fes Japan 2022イベントレポート

2022年10月16日開催のVue Fes Japan 2022について、いくつかの公演をピックアップして紹介します。

なお、本イベントはオンライン開催で、録画がすでに公開されています。

2022年10月16日、Vue.jsの国内大規模カンファレンス、Vue Fes Japan 2022が開催されました。Vue Fes Japan 2019が台風、Vue Fes Japan 2020が新型コロナウィルス感染症によって中止となったため、Vue Fes Japan 2018以来4年ぶりの開催となります。

オープニング | 川口 和也(Vue.js日本ユーザーグループ代表)

Vue.js日本ユーザーグループ代表 川口和也氏はオープニングでVue Fesの歴史から振り返りました。台風、コロナ禍で2度の開催中止。これらの自体が運営、コミュニティに与えた負担・衝撃は大きかったと言います。

このような状況下でもオンラインイベント開催などで盛り上げてきたなかで、またカンファレンスをやりたい思いが募り開催。

企業スポンサー、個人スポンサーへの感謝を述べ、カンファレンスを開始しました。

【録画】オープニング

キーノート | Evan You(Vue.jsオリジナル開発者)

Vueのオリジナル開発者で現在も開発を牽引するEvan You氏がキーノートで登壇します。Evan氏はフロントエンドのビルドツール、Viteの開発でも著名です。

Vueを知るためには、Vueの歴史を解説しないといけない。Vueのこれまでとこれからを語りました。

図1 川口氏とEvan氏
図1
図2 The Evolution of Vue
図2

Pre 1.0

バージョン1.0の前、2013年にリリース。2014年2月にHacker Newsでリリースをアナウンスしました。2014年OctにVue SFCを考えた。Nov 2014に大きく書き換えました。

  • Plain JSのオブジェクトリアクティブリティ、ES5のゲッターセッター。
  • MVVM/Template data binding
    • 今はフォーカスしてない
  • simple library、scriptタグだけでも利用できる
  • 初期はシンプルさを意識していた。

初期はフレームワークではなく、Backbone/Ractiveに影響されたAPIのライブラリでした。テンプレートとscoping modelに重きを置いていました。

当時はレンダリングシステムに課題があり、またコンパイラーはありませんでした。この当時のしくみはpetite-vueに近いです。

Vue 1.0

Vueは1.0系でフレームワークへの道を進み始めました。2015年8月にVue Routerが登場します。Vue Routerによる、再読み込みが発生しないページ遷移はとても重要でした。

  • Sep 2015 Vue 1テンプレートの構文の安定化。
  • Dec 2015 vue-cliのリリース。
  • Mar 2016 Vuexの初期リリース。

この段階でフレームワークとしての非常に重要な機能をリリースしました。

テンプレートのシンタックスと、スコーピングモデルの安定化に集中し、ユーザー体験やScoped CSSを重視しました。開発のスコープをSPAフレームワークまで拡張し、SPA Router/State Management/Build Toolchainも整備されていきます。

Vue 2.0

Vueはバージョン2で普遍的なフレームワークになりました。Mar 2016に「プログレッシブフレームワーク」を提唱しました。大きなフレームワークか、より小さい範囲で使うか選べます。Apr 2016にVue 2に注力しました。Vue 2では2度目のリライトを経験しました。全体のコードアーキテクチャの改善をしました。このリライトで全体の書きやすさが向上し、開発に寄与しています。

コンパイラーを導入し、テンプレートをVDOMレンダーに変換。SSRレンダリングも可能になりました。ブラウザ依存が消えた/Node.jsでもレンダリングできるようになったということです。

この段階で型システムの導入を開始しました。Flowを導入し、TypeScriptも利用できるようにしました。

vue-hackernews-2.0はVue 2のSSRなどのデモとして非常に重要なものでした。Nuxtのような、よりSSRを使いやすいハイレベルなフレームワークとして成立するようになってきました。

2.1〜2.xでもいくつもの大きな進化がありました。2.4では非同期SSRコンポーネント、部分的ながらSSR最適化(SSR-specific compile methods)などの機能が追加されました。

Vue CLI 3.0は、⁠既存のvue-cli新規のプロジェクトです。SPAプロジェクトのために既存のものとは大きく変更して作成しました。フレームワークの範囲を広げました。⁠Vue CLIのような)ツーリング(Tooling)はフレームワークの一部だ」と認識しました。

この姿勢は後のViteの開発にも関わってきています。

Vue 3.0

Vue 3はコンパイラー・ランタイムハイブリッドフェーズです。

Sep 2018にVue.js Londonでv3のアイディアを披露し、そこから時間をかけて3をやりました。

3.0のリライト。ブラウザーのサポートラインを上げた(IE9を捨てた)ことで、大きな進化を達成しました。言語(JavaScript)の様々な新機能の利用、パフォーマンス向上、型システムの向上、スケーラビリティの向上を達成しました。

Vueの型システムはTypeScriptではなかったのが課題でした。ここでTypeScriptに移行しました。型とマッチしづらい機能についても見直しました。

Vue 2以降大規模アプリケーションでも使われるようになり、スケーラビリティの重要度が上昇しました。

2019 3月にVDOMを改善、コンパイラーをアップデートしました。コンパイル中により多くの最適化が実施でき、ランタイムですべきことが減らせました。2019 8月にCompositions APIのRFCがまとまりました。同時期にclassのRFCもありましたが、課題があってこちらは諦めました。

Composition APIは大規模に適しています。Options APIを制限し、スケールしやすくしました。タイプインターフェース(型との整合性)に優れ、ロジック再利用による柔軟さとメンテナンス性をComposition APIで確保できました。

Jun 2020 3.0 alpha, Apr 2020 3.0 Beta SSRのコンパイルを完全に最適化2.4は一部だけだった最適化が、3.0ではstringにできるところはすべてstringにできるよう最適化が進みました。

Apr 2020, Feb 2021はViteの作業に入っていました。より軽いツールが欲しくてViteに没入していました。Viteはとても重要なツールになって、ものすごく人気が出ました。開発者の体験(DX/Developer Experience)を大きく改善できました。

Vite自体は(ReactやVueのような)フレームワーク依存がありません。これで他コミュニティに広がりました。Viteを導入することで、Vue CLIのような特化型から、create-vueに開発ツールも移行しました。より軽く、より早くなったのです。

(他フレームワークの開発でも盛んに使われるので)Viteを最適化すると、Vueのコミュニティ外にも影響があります。

Sep 2020ようやくVue 3.0をリリース。Jun 2021に3.1でMigration buildをリリース。3.2 script setup。Jan 2022 vue 3を新デフォルトに以降、2022は公式ドキュメントもVue 3向けになりました。

Vue 3は登場まで時間がかかった。それはフレームワークとしてのコアだけではなく、Piniaなどライブラリ、IDEサポートによる開発体験の向上、TypeScriptサポート、Lint、ユニットテスト。完全移行のために、これら1つ1つに対応する必要があった。それが大変でした。

コアもコンパイラー/ランタイムハイブリッドなものに変更。コンパイラーを大きく、ランタイムを小さくしました。テンプレート構文をほぼそのままにコンパイラーを進化させて機能を最適化します。パスを最適化できます。

コンパイラーの未来としては、VDOMを捨てる、Vaporモード(Solidに影響)を考えています。多くのフレームワークが採用している、出力にVDOMを前提としない、VDOMが不要になるモード(コンパイルのモード)です。

SFCは開発者体験に重要なので残します。script setup、CSS V-BINDなどとあわせて実験中です。Reactivity Transforで改善できる面もあるかもしれません。

同じテンプレート構文(SFC)をしつつ、コンパイラーの戦略としてVDOMに依存しない。パフォーマンス改善、メモリー使用量削減、ゼロコストでコンポーネントをアブストラクションできるように、いらない機能をコンパイル時に落としてランタイム負荷を削減しようとしています。

Vaporモードはパフォーマンスがいい、理にかなっています。ただVaporモードだけに切り替えるにはVDOMを捨てる必要があり、それにはメリットもデメリットもあります。

Vueの現状と今後

現在は2から3への移行期です。2系の2.7は橋渡しに使っています。npmのインストールベースだと現状v3が30%、2.7は25%。およそ半数はComposition API/script setupを使っている。いい傾向、これが上がっていけば改善に役立ちます。

Vue 3系のAPIの安定化は済んでいる、これは非常に重要なこと。次の改善を出すタイミングです。これまでバージョンアップに伴う仕様変更の影響を仕様に影響を与えずに改善していくつもりです。

短期的にはSSRハイドレーションの改善、Suspenseの安定化。中長期的にはVaporモードの改善、AngularやQwikに影響を受けたResumable hydrationにも力を入れていきたいです。

図3 Vueの今後
図3

【録画】キーノート

メドピアのサービスにおけるテスト戦略の過去と未来 | メドピア株式会社

メドピアのサービス、Kakariにおけるテストを解説するセッションです。幅広い医療事業を行うメドピア、技術アセットは幅広く、新しいツールも積極的に導入しています。

フロントエンドはVueの利用がメインで、新規はTypeScriptも使っている。Vuefes 2019, 2022のスポンサー、v-tokyo#13のスポンサーなどコミュニティへの貢献も行っています。

Kakariのテスト戦略の今までとこれから

kakariは薬局の利用者と薬剤師向けのサービス。調剤を先にすすめるなど幅広い。薬剤師向けの画面はVueです。Vue+Railsで構築するMPA。HTMLを返すものと、SPAを使うところのハイブリッドになっています。

jestで書かれた初期ユニットテストはCoverageが50%を切るぐらいでした。コンポーネント数は82。

現在は60%近くに改善、ファイル数(コンポーネント数)は197です。

(テスト改善にあたって)Storybookをすぐに導入。Rails viewにマウントしながらコンポーネントを確認するのが難しいという課題があったからです。同時期にビジュアルリグレッションテストも導入しました(+reg-suit⁠⁠。

reg-suitは便利な機能が多いです。storycapも導入。

実は(現在は)KakariではStorybookを捨てています。うまく運用に載せられませんでした。既存コンポーネントを上げきれない、Storybook追加の滞り、運用で更新されたpropsやAPI変更のモック反映漏れ、Storybookのバージョンアップが滞るといった課題がありました。

また、Storybookのゴール設定が不明確でした。新規コンポーネント追加時にStory追加を矯正する仕組み・文化もありませんでした。

(こういった選定などの経験は)姉妹サービスに知見をいかしています。

課題とe2eテスト

Kakariはclassベースコンポーネントを採用していますが、⁠現在Vueのclassベースコンポーネントの)開発があまり活発ではありません。アップデートの課題となりえます。⁠今後のスムーズな移行のために)E2Eテストを採用しました

Playwrightを導入して、正常系のテストの網羅。2→3のマイグレーションを安全にするため、ユニットテストでモックされがちなライブラリの動作保証をしました。Vuex→pinia、Vue router 3→4などにも備えます。

まとめとして、テストツールはゴール目的を明確にするのが重要。Vue 2のEoLは2023年12月です。

【録画】メドピアのサービスにおけるテスト戦略の過去と未来

Evan Youに聞こう | Evan You

Evan You氏のQAコーナーです。

  • 有名なフレームワークと比較して、Vueのいいところはどこ?
    • ハイレベルないいところがある。とっつきやすさがいいところ。プログレッシブフレームワーク、学習しやすさからくる導入のしやすさ。
  • Vueはいつ、どんなユースケースで選べばいい?
    • Vueはどんなユースケースでも適用する、よくわかんないときにはとりあえずVueがいいぐらい。
    • プログレッシブ。徐々に導入していける。既存システムにゆるやかに導入できるし、フルスタックのFWもつくれる。
  • SFCでJSXのように複数の変数にテンプレートを実装できるような機能は実装する?
    • 技術的には可能ではあるが、RFCでディスカッションも立っている。SFCでやると影響範囲が大きい、HMRなどにも影響がある。クローズドなシンタックスで外部に影響なしでできればいけるとは思う。現状はまだ、いいユースケースが出てくれば、もしかしたら実装に向かて進むかも。
  • Options APIはサポートし続ける? options/composition apiの関係性はどうなる?
    • Options APIまわり大きな変更を加えるつもりはない。それぞれ今いい形でまとまっている。
    • options/composition apiは併用できる。
    • それぞれ大きな変更を加えることはない、APIに大きな影響を与えずに改善を続けていく。
  • 今見ているアニメは?
    • アニメはそんなに見ない。マンガ派、今は呪術廻戦を見ているよ。
  • 仕事とOSS貢献を両立するには?
    • Googleで働いたときにVueをはじめた。仕事とOSSを両立すると、悲惨なワークライフバランスになりがち。
    • OSSをやることの目的を明確にする、情熱なのか、趣味なのか、キャリアに影響するのか。どれも正しい理由。自分の目的が大事。
    • ワークライフバランスが大事なら趣味のレベル、すべてのIssueに対応しなくてもいい、PRもすぐに見なくていい。自分のスタンスをREADMEに書いておくと気が楽になるはず。
    • 大きなOSSをつくりたい、キャリアのためにやるというなら、ハードなワークライフバランスも大切になるだろう。
  • Nuxt 3が現在RC(記者注:執筆時点ではリリース済⁠⁠、Nuxt 3の遅れでVue 2のEoLが伸びることは?
    • 基本的にはNuxtとVueは独立している、彼らに影響されて調整するのは考えてない
    • Vue 2はLSTの終了後にextended supportは検討しているが、有償のサポート。専用サポートであまり(一般の)ユーザーには関係ない。
  • デザイナーはOSSにどうコントリビュートする?(ドキュメント以外⁠
    • 興味深い質問。Vueそのものに、デザイン面での大きな需要はない。イラストレーションがあったらいいよねという話はした。ただイラストはテイストなど課題が多い。
    • デザインは顧客中心だよね。踏み込んで付き合う。コードのほうがより貢献のカタチが明確、OSSへの貢献と性質の違うところがある。
    • プロダクトに対して聞いてみるのはいいと思う。やめたほうがいいのは複数のロゴのデザインを送りつけるのはやめて! 求めてないところに来られても困る。
  • Deno(ディーノ)にVueは対応していく予定がある?
    • ViteがDenoで動くならVueも動くよね、VueのSSRもDENOで動くとは思う(Vueはnodeに依存していない)
    • CloudflareのedgeでもSSRできたと思う、だったらできるんじゃないか。
    • Vueはplatform agnostic(プラットフォーム非依存)なので、多分動くと思う。
  • SolidjsインスパイアのVaporモードを投入するなど、今後機能が増えるとリリースに時間がかかるのでは?その点の懸念は?
    • 開発速度が遅くなるというのは自然な流れ。ユーザーが増えると仕方のないこと。影響範囲が大きくなる、misson-criticalな領域で使われていることもある。責任がどんどん大きくなる。
    • Vue 3のリリース時はインパクトが大きかった。それを踏まえて、API互換性、使い勝手になるべく影響を与えずに進化したい。
    • リリースのスローダウンというわけではないが、慎重にならざるを得ない。
    • 人が足りないとかではなく、責任の大きさの変化がリリースに影響すると思う。
  • Vue.jsへの情熱はどこにある?
    • 最初のモチベーションはテクニカルホビー、技術的な趣味だった。
    • ユーザーが増えてレスポンシビリティーも生まれる VS 新しいアイディアを試したい。
    • フェーズでも変わる。最初は趣味、技術的な挑戦。途中で変わる、大きなものになるかもしれない、競合するかもという野心。今は責任感が大きい。ユーザーに感謝、重要なシステムでも使われる。今の生活にも関わってきている。
    • 責任感だけではない、新しいアイデア重要にしたいという技術者としての視点もある。生活しながら新しいものに常に挑戦できるのは嬉しいこと。

【録画】Evan Youに聞こう

プロダクト開発を止めずにComposition APIとTypeScriptに最速で移行するための戦い | STORES 株式会社

STORESはネットショップをはじめ店舗のデジタル化を支援するサービス。

ネットショップのデザインを変更する機能を、移行開始一ヶ月で35.51%をTypeScript/Composition APIに移行。プロダクト開発をとめずに移行中。

技術的な課題

options apiとmixinsを使っていて型アサーションが必要なため、TypeScriptへの移行のしづらさがありました。composition apiとcomposablesにすればいい(型アサーションを全部に指定する必要がない)と気づきます。しかし、手動で、option apiとcomposable apiに変更すると1ファイル1時間くらいかかり大変です。

そこで半自動化ツールvue-mixins-converterを作成し、自動化しました。mixinsをTypeScriptのCompoler APIでAST化、最終的にcomposable(合成関数)にし、ツールでmixins/options apiを変換します。これによって型アサーションの手間も減ります。

半自動化ツールの導入で1ファイル20秒程度にまで短縮でき、さらにTypeScript化もスムーズになりました。

運用的な課題

開発ロードマップが定まっている状態で取り掛かる時間を確保しづらく、モチベーションの維持(課題認識はできても優先度が下がる、プロダクト開発と平行だと)も課題でした。進捗不明なのも不安材料です。

PdMとスクラムチームに移行への理解を得るよう動きました。移行の準備と計画をしっかり。

とにかくIssueに着手しやすい状態を作りました。Issueを大きくしないようにスコープをきり、更にその中でファイルを修正という形にしました。

Datadogによるメトリクス確認で、進捗を把握し、モチベーション維持に活用しました。

【録画】プロダクト開発を止めずにComposition APIとTypeScriptに最速で移行するための戦い

Vue.jsのUIを強化するグレープシティのJavaScriptライブラリ | グレープシティ株式会社

Vue.jsソフトウェア開発支援ツールを紹介します。Vue.jsではいくつかUIライブラリがありますが、業務アプリのUI要件を満たしやすいものがあります。

Excelライクや多段明細(1レコードを複数行で表現)など。業務特化したSpreadJSは簡単な手順でExcelライクな画面を作成できます。

【録画】Vue.jsのUIを強化するグレープシティのJavaScriptライブラリ

負債が溜まったレガシーフロントエンド画面を Vue.js でリプレイスした話 | とよへい

クラウドワークスにおける、レガシーなフロントエンドからVue.jsへの移行を解説します。

なぜVue.js化を実施したのかVue.jsを選択したか。新規はVue、既存のものはRails+jQueryという構成。

課題として、次がありました。

  • 見た目を変えたいだけなのにバックエンドのRailsをイジる必要がある
  • バックエンドフロントエンドの分業が難しかった
  • jQueryを書きたくない。

最終的には全画面をVueにするとして、優先度高い順に実装していきます。将来的に改善したくなる可能性が高い画面を優先します。具体的には、まずはユーザーのアクセスが多い一般ユーザー向けの画面としました。

UIの変更が頻繁に行われている画面は優先順位としてはおきませんでした。単に手を入れるのが簡単だったり、バナー更新など特定の理由で更新されているだけだったりするからです。

対応が簡単な画面をたくさん改善、対応が難しい画面にじっくり挑むの双方を大事にしました。ユーザーインパクト、長期的な改善の両方を重視しています。

実施にあたっては「Vue.js化して既存画面をもっと改善しやすくしよう」という目的に注力。やりすぎないこと、スコープを定めることを意識しました。CSSフレームワークを外すことや、バックエンドAPI化などは行いません。

品質管理についてはツールと人力で担保します。Storybook, VRT, vue-test-utils、手動テストを組み合わせました。PRが出たら自動でStorybookなどは進みます。E2Eテストは不採用。負債が溜まった画面でやるのは大変そうだったのと、一括リプレイスに対してはメリットがそこまで多くないという判断からです。

難しかったところは、Rails/jQueryのアプリのフロントエンドをVueに置き換える部分。宣言的UI化、Vue/TS化、バックエンドからフロントエンドに適切に値を渡すのも重要。

今回の変更にあわせて歴史的な経緯でいらないものを消す、壊れていたものはリリース前に修正した。

機能が多く、機能ごとにコンポーネントをわけてひたすら作成しました。Container Componentで統制を取りやすくした。styleをもたないVueコンポーネントでpresentation componentと組み合わせ、バックエンドAPIとのやりとりなどをにないます。scriptを持たないlayout componentでスタイル定義を分離しました。slotで後から出します。また、共通のスタイル定義を切り出すとかもできます。

さらに、あまりよくない実装もこのときに見直し、どういう実装が嬉しいか(理想的か)をもとに検討しました。

まとめとして、Vue 3+TSは開発体験がいい、書いてて楽しい。レガシーフロントエンドの置き換えは単純にはできない。削れる機能は削ってもっと楽したかった。

大事なのは目的の明確化、やらないことを決めるのが重要でした。

やめないこと、続けることが重要。

【録画】負債が溜まったレガシーフロントエンド画面を Vue.js でリプレイスした話

ライトニングトーク

  • レガシーなMPAアプリケーションをWebpackからViteに移行する話(oreo⁠
    • 開発サーバー立ち上げに時間がかかりすぎ。Vite(Vite Rails)導入を目指す。
    • 移行にはいくつかのステップで実行。まずはサンプルアプリから試す。いくつかのポイントもがありました(Webpackの設定移行、開発サーバーでのHMRなど⁠⁠。
    • いいチャレンジができました。エンジニアとしての視野が広がる。
    • Viteは新規では導入が楽ですが、古いアプリケーションだと移行も難しくなります。ただvite自体のメリットは非常に大きく開発者体験も向上します。
    • 作業をすることで、アプリケーション全体の課題が見えたのも良かったです。
  • provide/injectを用いたローカルな状態管理(ebiryu⁠
    • UIコンポーネントの状態設計についてアコーディオンコンポーネントを例に解説。
    • 状態を生成し、それを必要なコンポーネントに渡します(provide/inject⁠⁠。
    • controllerを作成することでコンポーネントの状態操作を一元管理できるようになります。
    • シンプルな状態を組み合わせてアプリを構築していきましょう。
  • Nuxt compositon apiからNuxt Bridgeへのマイグレーションのすゝめ(掛水優輝⁠
    • Nuxt 2にAutoImportを追加。
    • NuxtBrideではcompositon apiをAutoImportするようになった。このため、アプリケーションから削除する必要があるため。
    • unplugin auto import/auto importをnuxt2に追加。nuxt.config.tsに設定します。
    • 注意点は3つ。型はauto importできません。pluginやmiddlewareもauto importできない。NuxtBridgeではcomposablesの書き方が少し変わります。
  • ブログを作るならNuxt Content v2はいいぞ(Furusawa Kaoru⁠
    • ヘッドレスCMSは実装や移行の考慮が必要。
    • Nuxtコンテントならファイルを置くだけで静的コンテンツが作れる!
    • Prose Componentsで各タグの装飾(内容)を上書きできる。
    • MDC(markdown)から任意のVueコンポーネントを使える。
    • 他にも便利な機能があります。

【録画】ライトニングトーク

施策を止めるな!Vue2からVue3への移行 | 志賀 奎太

メイン施策を止めずに、大きな不具合もなくVue 2からVue 3にアップデートすることができました。今回はRettyのtoB領域をVue 3にアップデート。

Vue 3はパフォーマンス、保守性の向上。導入の恩恵が大きく、⁠やるしかない」と思いました。

なかなかできないという話も耳にします。コマンド一発では移行できません。多くの破壊的変更があり、アップデート時間の確保が必須でした。

Rettyはスクラムを用いたアジャイルな開発を採用。プロダクトバックログから優先度順に一週間で対処するという仕事の進め方です。メイン施策としてプロダクトバックログにバージョンアップ作業をのせようと思ったものの、難しかったです。⁠Vueのバージョンアップ自体は)事業インパクトが出しづらい、⁠EOLの)期限が直前でもありません。

どうVue 3化をすすめるかというところで、きっかけとしてはスクラムのレトロスペクティブ(振り返り)が有効でした。ここでVue3化したいいという意見を出したところ、チームが興味を持ってくれました。

作業時間はタイムスケジュールのうち、チームで空き時間ができやすいタイミングにメイン施策に影響ない範囲で着手するというかたちで捻出しました。

Vue3でビルドできるように、Compositon APIの導入、Vue 3で動かなくなったページの修正、検証・コードレビュー、リリース……というような手順で移行しました。

最初はVue 3導入を試したプロジェクトが大きすぎ、歴史が古すぎて失敗しました。そこで、社内管理画面を対象に再度導入を試します。アップデートに適したサイズ、移行に問題があっても影響範囲が社員で閉じます。公式のアップグレードワークフローを参考に更新しました。Vuexの導入手順の変更など、ビルドは通るようになりました。

Composition APIで動かせるように、サンプルコンポーネントを用意して試します。ここまでできれば、移行は6割完了と考えていいでしょう。

動かなくなったページの修正。チームの協力を得て、1つずつ修正。不確実性が低い作業で、知見もチーム内で共有できる。古いライブラリの移行などもできます。

検証・コードレビュー。ファイル数が多く、結構気合で進めた部分もあります。

リリース時は不具合が1つだけ発生位。並行して動いていた新ページが1つだけVue 2で、うまく表示できなかった。検証漏れ。

移行前に知りたかったこともあります。

施策とVue 3化のバッティング、コンフリクトや予期しないバグに当たるかもしれないリスクがあります。対処としては小さくリリースを重ねる方針が良いです。Vue 2/Vue 3の共存リリース(公式の移行ビルド)もありますし、先に依存を上げる、Vue 3の破壊的変更を見越したコード修正を行うというのもいいでしょう。ビッグバンリリースを避けたほうが良いでしょう。

小さなプロジェクトからの移行で知識・経験を積むのがおすすめです。日々のライブラリ更新が大事です。

【録画】施策を止めるな!Vue2からVue3への移行

十数万レコードに耐えうるVue.jsプロジェクトを実現するためのパフォーマンスチューニング | tbashiyy

パフォーマンスチューニングを解説します。YESODは組織・従業員情報の管理サービスです。組織情報や組織図が確認できます。フロントエンドはVue 2.7、TypeScript/Vuexを採用。

大規模な人事データが入るタイミングがあり、チューニングの必要性が生じます。パフォーマンスチューニング前は大規模な人事データが入ると、ログインしてから初回表示まで十数秒、基本何をしても遅いという状況でした。

フロントエンドのアーキテクチャが特殊だった。Vuexに初回でほぼすべてのデータを格納、基本immutable。16万件超のデータを取り扱う必要が出てきます。

一気にデータを取得するからもいいのでは?という意見がありそうですが、アーキテクチャの変更が困難でした。

パフォーマンスパネル、メモリーパネルで計測。時間のかかるメソッドやメモリー量を確認します。JSでメモリーが1000MB以上、大きなデータをリアクティブするのに数秒。大量要素が表示されるケースは全部描画を待つため遅いことが判明しました。

リアクティブ化、definereactiveが遅いことがわかりました。本来はimmutableなobjectなのでdefinereactiveにする必要はないので、そこを削りました。Object.freezeでreactive化を避ける。これで問題も副次的に解決できます。

組織図へ遷移する処理は要素が大量だと時間がかかりました。組織が大量だと、全部表示はものすごい大画面じゃないと不可能だったので、できたところからページの描画を進める方式に変更した。

画面範囲画の要素はIntersection Observer APIを用いて表示しないようにしました。vue-observe-visibilityがあります。

【録画】十数万レコードに耐えうるVue.jsプロジェクトを実現するためのパフォーマンスチューニング

なるほどVueコンポーネント | miyaoka, ushironoko, takanorip, yamanoku, kazupon

エンジニア・デザイナー複数人で、Vueコンポーネントについて語ります。

Options API→Compositon APIでどう変わったか

(Kazupon)Options APIはobjでコンポーネントを操作、Compositon APIはVueの関数を合成してVueコンポーネントを変えていくものです。

(ushironoko)miyaokaさんが置き換えツール作ってくれた。define component関数を使うなど段階的に移行できた。そこまで難しいことはなかったが、変更ファイルの多さによる物量的な大変さがあった。

(miyaoka)書き換えは手でやるとかなり面倒でツールを作りました。Options APIは再利用性の乏しさがあります。単純な関数なら切り出しやすい、mixinsでも一応できるが課題が多いので、そこでCompositon APIはいい選択肢となりました。開発しやすくなりました。

(yamanoku)Compositon APIはコンポーネント単位の肥大化を防ぎやすい。テストの分離ができるようになってきました。

Vueで作るアクセシブルなコンポーネントについて

(miyaoka)STUDIOというサービスでエディター(サイト制作⁠⁠/レンダラー(表示)をつくっていて、レンダラーのアクセシブルの対応はやっています。社外の方に監修に入ってもらっています。modalの読み上げやフォーカス。詳しくないとわからないポイントがある。確認もscreen reader使わないときづかないなどいろいろある。Vue自身の難しさはそこまでない。

(ushironoko)社内にa11y(アクセシビリティ)チームがある。自分もそこに参加している。yamanokuさんに相談しているところもある。teamでsemantitcs気にしたり、レビューテンプレートにa11yのことがはいったりするようになりました。Vue自体の難しさはないが、アプリの仕様や経歴に生じる難しさはあります。a11yのピックアップなどもやっている。freeeが公開しているアクセシビリティー・チェック・リストは本当にいいです。

(kazupon)普段はa11yチームがある。そこから定期的に勉強会。freeeのmagiさんにセミナーをやっていただいた。

(yamanoku)全員が全員HTMLやアクセシブルの知識があるわけではない。vueのa11yでは、propsの渡し漏れやボタンのaタグ化などがコンポーネント規模が大きくなると難しくなりる。lintツールや静的ファイルのmarkuplintをやっている。今は体制づくりもやっている。

(yamanoku)Vue用のa11yツールとしてはeslint-plugin-vue-accesibilityというのがある。JSX版からヒントを得ている。

(ushironoko)axe devtoolsは入れて、チームで使っていたことがある。自分たちのサイトを見るのに使っていた。

(yamanoku)axe devtools使っています。よく使ったり見たりしていますね。vue-axeというのもあるのですが、個人的には使っていません。

(miyaoka)使っているツールはaxe。ただユースケースが多くてツールだけだとなかなか難しい。

デザイナーとエンジニアで作るデザインシステム

(ushironoko)全社共通のデザインシステムがあり、デザインシステムは3サービスに導入。自分がやっているところはVueコンポーネントでデザインシステムを実装。どこから始めるかが難しい、事例があんまり多くなくて、導入したという話はあっても、どうやってうまくいったかやベストプラクティスの話がない。手探りで始める必要があった。あとは、コンポーネントをがあっても使ってくれるとは限らないところ。そこが難しい。事例を先に作って、そこから移植する。デザインシステム専任を設けず、プロダクト開発者に自分がデザインシステムに関わっているという意識を醸成しました。周囲を巻き込んでやっていく。

(miyaoka)管理画面はフォーマットを揃えたい。そこで使っている。⁠デザインシステムとしては)デザイナーがFigmaベースに進めて、そこで使える変数をVueコンポーネントに与えています。うまくいっているところもあるが、実際に運用すると足りないところが出てきたりします。そこから結局tailwindも併用する形にした。微妙な調整をしたいところはFigmaベースで作ると少し難しい。

(kazupon)PLAIDはデザインエンジニアがデザインシステムをつくるような体制になっています。BAISUというデザインシステムをもってきてVueでつくるだけ。あまり考えずに使える。最近はVue以外も使うようになって、Vue依存が強かったBAISUをより他FWでも使えるようにバージョンを更新中。BAISUはtailwindベースでした。

(yamanoku)まだデザインシステムは取り組み中、エンジニア中心。デザイントークンでやりとり。

【録画】なるほどVueコンポーネント

安全に開発効率を上げるための Vue 2.7 移行 | watsuyo

v2.6→v2.7へのVueのアップデートの体験談。v3には上げられないけど、少しでも上げたい人向けに話します。2.7はVue 3リリース時に予告されていた、⁠watsuyo氏が所属する)iCareのCarelyもalphaから移行を進めました。

Vue 2.7は2系の最終マイナーバージョン。Vue 3移行のためのバージョン。2023年末にEOL。Vue 2、Vue 3間は破壊的変更が多く、移行コストが高い。3系からはCompositon API/script setup/CSS v-bindがバックポートされている。

2系と3系ではリアクティビティシステムが違い、バックポートされない機能もあります。

経由するメリットとしては、バックポートで段階的移行ができます。動作確認コストの削減、影響範囲の切り分け、安全にバージョン移行できる確率が高まります

経由で注意する点はVue 2.7は2系でCompositon APIを使えた@vue/composition-apiの一貫性が提供されておらず、Vue 3とも機能に差分がある、把握する必要がある点です。

Vue 2は2023年末にEOL。セキュリティリスクなども考慮して、残りの期間を考えると後回しにはできない。そこで段階的なアップデートが必要になります。

2.7移行のつまずきポイントを3つ紹介します。

  • Vue Instanceの参照方法の変更
    • deprecatedなプロパティの削除など、参照方法を変更しないといけない。
    • ワークアラウンドで対処したが、課題もある。
  • emitを関数へ渡すときの型の注意点
    • Vue 2.7以降は型を明示する必要が出た
  • _$はじまりの変数のエラー
    • _を使ってしまっていた。Vue 2.7でそのあたりのエラーが厳格になった。

移行の振り返りで出たポイント5つをまとめます。

  • コミットごとに手順書を書いたほうがいい(影響範囲も鑑みて機能開発より詳細に)
  • フロントエンドエンジニアのメンバーにに動作確認をお願いし分担チェックする
    • 知見共有、その箇所を実装した詳しい人に見てもらう
  • チェックお願いのアナウンス、事前告知
  • PRは影響範囲が自明になるように切り出す
  • GitHub以外にRedditやDiscordなど他箇所のライブラリの情報も見る。

【録画】安全に開発効率を上げるためのVue 2.7移行

Vite 3 and Beyond | Matias Capeletto

Vite 3の新機能を紹介。Matias Capeletto氏(a.k.a patak)はStack Blitz勤務で、Viteのコアチーム、VitestとVueのチームメンバーです。

ViteはWebpackやParcelと近いツールです。Opinionated(意見のある)なRollupといえるかもしれません。

Viteは開発時にコードをバンドルせず、開発サーバーを立ち上げて、ブラウザへ直接ESM形式でコードを渡します。ESM形式でブラウザが処理。これで高速なHMR(Hot Module Replacement、全体の再読み込みなしにJSを差し替える)が可能になります。

10x(日々成長する)エコシステムに集中しています。毎週150万DLされる人気があり、最新の開発環境を快適にしています。

多彩なプラグインがあるのも特徴です。ビルド時にはrollupと同じように動作します。開発時とビルド時で同じプラグインが使えます。NuxtやSveltekitのベースレイヤーとして機能し、今までにないレベルで基盤実装を共有しています。

Vite、Vueは両方ともEvan氏が開発者です。そのため、Vue CLIを置き換えるcreate-vueはすぐに登場しました。Vueは最適なViteの開発環境を(早期に)構築できました

Nuxt 3もViteベース。複雑な用途ではViteは使いやすいですVitePressなんて静的サイト生成のプロジェクトもある。HistorieはViteベースのStorybook代替。Vue terminalやslidevもあります。

VitestはVue専用ではありませんがVueでは非常によく使われています。

LaravelコミュニティもViteを採用した。

Vite 3はNode.js 12をドロップするため。EOLをNode.jsに合わせました。少しのブレイキングチェンジも新機能のためにあった。

Kia King氏による新しいデザインの、VitePressで実装されたドキュメントも出ました。

vite starter templatesが用意されました。とてもミニマルで、Viteを学ぶのに最適です。

Viteを使う上で最も楽しいのは、高速なフィードバックループです。

Vite 3の改善点

dev serverはブラウザから大量のリクエストがあった場合、最初のロードに時間がかかります。多くのケースはコードスプリットで対応できるものの、lodashのような依存の多いライブラリはそれでも課題がある。

Vite 2では依存関係をesbuildでビルドして解決していた。スキャン時に依存をまとめ、ビルド時にesbuildでビルド、このファイルをブラウザに渡していました。

Vite 2.7ではオンデマンドにするために最適化を進めました。ただ、サーバーが起動する前にスキャンと最適化を行っていたため。初回起動に少し時間がかかってしまった。

Vite 2.9はこれを並列処理しました。これは良かったのですが、処理が失敗する可能性があり、依存関係注入などでは顕著でした。これだと正しくないパッケージをブラウザに送ってしまう可能性がありました。これが起こるとフルリロードが必要になります。

Vite 3はこれらの問題を解決。ブラウザへコードを返すのを、最適な依存関係ツリーをつくってから送るようにしました。高速な依存関係の最適化をしたあとに、パッケージをブラウザに送る。コールドスタートの速度上昇にいい結果をもたらしました。結果はキャッシュされるので次回以降も早い。

他には、複数パッケージをまとめて取り込むimport.meta.globの導入、ツリーシェイキングの改善などもあります。改善や機能の導入は他にもたくさんあるので、リリースブログを見てください。

ESM/SSRをデフォルトにする変更もあり、ESM移行は進めています。将来的にはESMオンリーを目指しています。CJSレイヤーも残してはいます。WASMとの互換性問題を防ぐ変更も加わっています。

Relative Base(相対的ベース)の改善も進めています。あらゆる環境でのデプロイに対応しました。

Vite 3.1も出ています。HTMLのパーサーを移行し、Rollupとのコラボレーションもあります。

Vite 3でバンドルサイズも削減しました。

Issueの解決も順調です。品質は重要で、以前は800に届く寸前だったIssueを現在は半分まで持ってきました。

私達にとって重要なのは安定した基盤を提供することです。コアをリーンなまま保ち、基盤レベルでイノベーションが置きます。

Vite 4では有用な機能のデフォルト化や、Rollup 3の導入なども検討しています。

【録画】Vite 3 and Beyond

Component Testing | Jessica Sachs

Cypress 10, Vite, Vueによるコンポーネントテスティング。Cyperssで働いていた、Cyperssアンバサダー。vitestの開発や、Fakerjsにも携わっています。

Cypressはシンプルなものから複雑なものまで適用できるブラウザベースのテストランナーです。テスト可能なコンポーネント駆動開発を助けます。

このトークではCypressによるコンポーネントのテストをライブコーディングしました。

【録画】Component Testing

共通コンポーネントのテスト実装方法にあえてVRTを選択した話 | プログラミングをするパンダ

フロントエンドのテスト選定を解説します。Vue 2ベース、成熟期で頻繁なアップデートはないサービス、メンテナンスは有志が手の空いたタイミングで対応していました。

共通コンポーネント(ショップオーナー無の管理画面を構築するためのコンポーネント集)があり、2018年1月から開発開始、成熟期で頻繁なアップデートはなく、有志が手が空いた時間にメンテナンス対応をしています。

1つめに変更が怖いという課題がありました。共通コンポーネントにテストがない、本体の共通コンポーネントを呼び出す側にもテストがない(本体の影響が不明)という状態でした。メンテナンスは続いていて変更はあります。

2つめに変更のレビューをしにくい課題がありました。Storybookはあるが実行にひと手間かかっていました。プルリクにスクショを貼る形式、ちょっと手間。本体App側の影響範囲はそれでもわからない状態でした。

3つめに依存のアップデートに時間がかかる。Dependabotは入っていたものの、PRのチェックが大変。有志のメンバーのモチベーションが下がってきていました。

変更+レビューに手間がかかる状態、手動テスト(Storybookによるチェック)が辛くなっていたので、テスト自動化で解決しようとなった。

テスト実装方法の比較として、フロントエンドのテストはTesting Trophyが参考になります。Testing Trophyはintegrationの有効性をつよく意識(integration=結合テスト⁠⁠。

テスト実装方法を比較します。

  • ユニットテスト
    • JSのロジック、関数やクラスメソッド、サーバー実行
    • 早い
    • htmlcssは対象外
    • テストフレームワーク
    • jsのロジックを切り出しにくかった
      • クラスのstateも多様
  • インテグレーションテスト
    • ユニットテスト+αの立ち位置
    • ブラウザAPIやデータフェッチも
    • サーバーで実行
    • 実行速度はまあまあ
    • 全部のコンポーネントに書くのが大変(ROI、成果がニーズに見合わない)
  • E2E
    • ブラウザからサーバーまで
    • ブラウザで実行
    • 遅く、壊れやすい
    • テスト対象が広い
      • できることが多い
      • VRTもできる/方向性はいいがページ単位であって、コンポーネント単位でやりたいのとはあわない。
  • VRT(ビジュアルリグレッションテスト、画像回帰テスト⁠
    • HTML+CSSをテスト(E2Eの一部)
    • 遅い
    • JSは対象外
    • 表示崩れに気付ける
      • 差分比較がコンポーネント単位
    • Storybookを書くモチベになる

どのテスト方法が課題を解決してくれるか検討すると、VRTがマッチします。ここからVRTツール選定に入ります。

reg-suit、画像比較のOSS、比較結果の差分がわかりやすくエンジニア以外にも使いやすい。ただ環境構築に一手間かかります。

chromatic、画像撮影+画像比較のSaaS。導入が簡単、Storybookは必須。Chromaticを選定し、無料枠でひとまずChromaticを導入しました。Storybookのコンポーネントを増やしていった。

運用結果とまとめ

Chromaticで冒頭の課題は解決できた。予期せぬ変更ははいらない、差分がピンポイントでわかる。レビューもかんたんに。

依存パッケージのアップデートは月に一度パッケージアップデート会をするようにした。dependbotに対してchromaticが自動で動くので、差分があるか確認できる。ほとんど変更もないので、すぐにマージできるようになりました。

メンテナンスチームもStorybook立ち上げが必要なくなってポジティブな効果がありました。

テスト対象ごととに適した内容があります。テスト自動化はメリットが大きいです。

【録画】共通コンポーネントのテスト実装方法にあえてVRTを選択した話

Peephole(ピープホール)

Peephole(ピープホール)セッション、今取り組んでいる秘密のプロジェクトやearly previewを見せていくというスタイルのセッションです。Eduardo San Martin Morote氏、Anthony Fu氏、Yaël Guilloux氏が登壇。Kia氏が聞き手を務めました。

Eduardo氏はunplugin-vue-routerを紹介。Vue Routerでのルートのセットアップや型まわりを強力にするプラグインです。これらの機能をVue Router本体追加するかは、おいおいRFCもだして検討するとのことです。

Yaël氏はCSS-in-TSライブラリ、pinceauを紹介。CSS-in-JSに影響された。unpluginでつくられた。デザイントークンとコンベンションをもとに動かします。CSSだけでなく、デザインシステムに関連することは扱えるようになっています。補完もCSSなどが効き、プロジェクト全体で型の恩恵を受けられます。

ここまで名前の出てきたunpluginの作者でもあるAnthony氏は、reTypewriterを紹介。ライブコーディングやデモを再現するソフトウェアです。

【録画】Peephole

クロージング

川口氏とKia氏がクロージングトークを行います。

久々に開催できたことの喜び、2019年の台風中止でものすごく落ち込んだこと、3トラック無事開催できて皆さんに楽しんでもらえてよかったことなどカンファレンスのまとめを話しました。

また、来年以降へのオフライン開催の希望など、今後への期待も込めて会を閉じました(注:来年以降の開催は現状未定⁠⁠。

【録画】クロージング

おすすめ記事

記事・ニュース一覧