今回、弊社としてはVueでの開発がメインとなってきておりますが、Nuxt3移行の時に下記部分を感じ頂いたかと思います。
このことから現状でも弊社にはVueが適切なのか?他に適切なライブラリがあるか?を調査しました。
今回調査したのは下記です。
下記が過去3ヶ月のトレンド結果です。(わかりやすいようにVueとReactも含めております。)
Preact | Svlete | |
---|---|---|
レンダリング方法 | 仮想DOM | 実DOM |
SSR実現性 | 可(Preact + Vike) | 可(SvelteKit) |
storeによる実装 | 可能 | 可能 |
[!TIP] バンドルサイズについては以下記事がかなり参考になります
https://zenn.dev/jay_es/articles/2021-10-22-javascript-framework-size-comparison
まず今回Reactではなく、Preactを押しているのかというというと下記理由です。
Signals
というものでpropsされた値を使っていないところには勝手に伝達されないまとめるとReactに比べ、軽量で、少しマイルドに書けます。 デメリットもあります。
こちらは実DOMで最近勢いが増してきているものです。
test (testというpathにアクセスした場合に下記ファイルをそれぞれ実行)
├── +page.server.ts # サーバ側でのみ実行
├── +page.ts # レンダリング前に実行 (サーバー/クライアントどちらでも実行されうる)
└── +page.svelte # 上記それぞれのデータを受け取りレンダリングするファイル
Vue Preact Svelteそれぞれのコードについて弊社の環境を模して実験的にコーディングしてみました。 ビルドツール: Vite
初期描画速度計測
以下構成の読み込み速度(DOMContentLoaded)を開発者ツールにて5回計測し、それの平均値を求め比較。(その際cacheは毎度削除。)
5階層までネストしたコンポーネント + 10個のコンポーネント 呼び出ししたAppファイル
初回読み込み速度の平均値(ms) | |
---|---|
Vue | 431 |
Svelte | 427.7 |
Preact | 425 |
[!IMPORTANT] というように弊社で使用するレベルでしたらあまり大きな差異はなさそうです。
再描画速度計測
以下構成で最上位のApp.vueで入力したデータを最下層のコンポーネントで際描画されるまでの速度を5回計測、それの平均値を求め比較。
10階層までネストしたコンポーネント + 入力フォームがあるAppファイル
初回読み込み速度の平均値(ms) | |
---|---|
Vue | 1.32 |
Svelte | 0.4 |
Preact | 1.08 |
[!IMPORTANT] というようにPreactとVueはあまり差はありませんでしたが、Svelteのみ実DOMなことから反映速度が一際速いです。
個人的には「Svelte」が良いかな?と思っております。 理由としましては以下です。
Vue(Compostion API) | Preact | Svelte | |
---|---|---|---|
フレームワークのissueの数(単体) ※openのissue数/総issue数 |
356/10012 | 150/1746 | 953/5890 |
フレームワークのissueの数(SSRフレームワークの場合) ※openのissue数/総issue数 |
900/13886(Nuxt) | 193/2493(Preact + Vike) | 673/5048(Svelte.kit) |
学習コスト | 小 | 小~中 (Reactを触ったことある方にとってはほぼ小) |
大 |
相性の良い開発規模 | 小~大 | 小~中 | 小~大 |
可読性 | ✕ | 〇 | ◎ |