Slide 1

Slide 1 text

レガシーな MPA アプリケーションを Webpack から Vite に移行する話 2021/10/16 Vue Fes Japan Online 2022

Slide 2

Slide 2 text

自己紹介 oreo 株式会社 iCARE で健康管理システム Carely を開発 @oreo2991

Slide 3

Slide 3 text

結論 まだリリースできていない (2022/9/14 動画撮影時) 歴史あるアプリでの移行は非常に大変 しかし、開発体験向上やアプリケーションの課題発見など 得られる恩恵は大きい

Slide 4

Slide 4 text

Vite 移行を検討するに至った背景 Rails の view 毎に Vue インスタンスを生成する MPA エントリーポイントが多いことによる弊害で、ビルド時間 は肥大化 開発サーバー立ち上げに 2 分弱かかり、開発体験が良いと は言えない状態

Slide 5

Slide 5 text

移行手順 1. サンプルアプリで Vite Rails を触る 2. 一つのエントリーポイントでバンドルし画面表示 3. 全エントリーポイントでバンドルし画面表示 4. Webpack の設定移行 5. 開発サーバーで HMR を有効化 6. ローカル環境と qa 環境でテスト

Slide 6

Slide 6 text

Step1 サンプルアプリで Vite Rails を触る エントリーポイントなどの基本的な設定方法を確認 ビルドやHMR(Hot Module Replacement) などの動作を知る $ bundle exec rails new . $ bundle install $ bundle exec vite install 1 # Gemfile 2 gem 'rails', '~> 6.0.4' 3 gem 'vite_rails'

Slide 7

Slide 7 text

Step2-1 一つのエントリーポイントでバンドルし画面表示 エントリーポイントを一つに絞ってバンドルを行い画面が表示できるように実装 before(default の設定) after( エントリーポイントを一つに) テンプレートエンジンでJS を読み込ませる 画面表示に成功 "all": { }, "watchAdditionalPaths": [] "all": { "sourceCodeDir": "frontend", "entrypointsDir": "entry/home", }, "watchAdditionalPaths": [] 2 - content_for :html_head do 3 / = javascript_packs_with_chunks_tag 'home/index' 4 = vite_javascript_tag 'entry/home/index' 1 / slim ファイル( テンプレートエンジン) 5 = stylesheet_packs_with_chunks_tag 'home/index' 6 7 - content_for :content do 8 home-index#home-index

Slide 8

Slide 8 text

Step2-2 画面表示の為に取り敢えずした変更 Node.js を14.18+ or 16+ にアップデート require を import へ変換 process.env を import.meta.env に変換 Expected version "^14.18.0 || >=16.0.0". ` ` ` ` Uncaught ReferenceError: require is not defined ` ` ` ` Uncaught ReferenceError: process is not defined

Slide 9

Slide 9 text

Step3-1 全エントリーポイントでバンドルし画面表示実装 全エントリーポイントを対象にバンドルを行い画面を表示できるように実装

Slide 10

Slide 10 text

Step3-2 ヘルパータグの置き換え Simpacker のメソッドをVite 用に置き換えることで、テンプレートエンジンの変更を最小限に before after

Slide 11

Slide 11 text

Step3-3 その他ポイント ESM の場合、モジュールが非同期で読み込まれるので、依存関係がコード中に明示されていな いと実行順序が変わって壊れることがある グローバルオブジェクトに値やメソッドを読み込ませる処理があったので、ビルドのチャ ンク設定やコード上での調整が必要に CSS Modules のICSS JS とCSS 間での変数共有のために、ICSS の :export を利用していたが、うまく動作せず 暫定的に変数をハードコーディングしたが、Style Dictionary などの導入を検討中 ` `

Slide 12

Slide 12 text

Step4 Webpack の設定移行 約30 個に及ぶ設定項目をVite 組み込みサポートやプラグインなどを利用して移行 設定関連のコードは517 行から約100 行へと81% 削減 詳細は別途ブログをご参照( https://zenn.dev/oreo2990/articles/3597922483f159 )

Slide 13

Slide 13 text

Step5 開発サーバーで HMR(Hot Module Replacement) 有効化 開発環境ではDocker を使っていたのでIP アドレスのマッピングが必要に (※ ) Step3-2 のヘルパータグでパスを注入する

Slide 14

Slide 14 text

Step6 ローカル環境と qa 環境でテスト グローバルオブジェクトの読み込みエラーなどたくさんのエラーに直面 現在、各種OS 、ブラウザなどでも動作確認 (2022/9/14 動画撮影時)

Slide 15

Slide 15 text

移行作業で得た個人的な学び 「エンジニアになって1 年も経っていないから、、」などとフタをせずに、ストレッチしたチ ャレンジをした結果、以下のような経験を積むことができ、アプリケーションの動作に対する 理解が深まりました。「移行することができるのか?」という不安が常に付き纏う作業でした が、結果はどうなろうと、エンジニアとしての視野が広がった。 1. サンプルアプリと本番プロジェクトでのVite Rails の動作比較 2. Vite 、Vite Rails のソースコードリーディング 3. DevTool 、Linux コマンドなどを用いた問題特定( 何回もしました) 4. 置き換え前のWebpack 設定の理解 5. Webpack 設定移行 6. Vite 、Vite Rails 、Rollup などのDocument 確認.....etc

Slide 16

Slide 16 text

新規PJ へのVite 導入は比較的簡単だが、運用歴の長 いアプリでの移行は大変 開発サーバー起動時間の改善(2 分弱→約3 秒) 、 HMR の即時反映など開発者体験は大幅に向上

Slide 17

Slide 17 text

Rails のテンプレートエンジンに依存した密結合な設計 コンポーネントのスクリプト言語、エイリアス記法などが不 統一 ICSS などのようなwebpack に依存した標準的ではない書き方 グローバルオブジェクトを使って、依存関係が明示されてい ない書き方