Vueに対する自分のスタンス

最初から最後まで自己紹介文なので技術的な学びは一切ないことを念頭に置いてご覧ください。

Vue を専門的に書き始めて大体 4 年くらい経ちました。Vue は技術的にも人脈的にも成長機会を与えてくれた大変恩のあるライブラリです。昨年には縁あって単著も出させてもらいました。Vue に関しては他の人よりも深く知っていると自負しています。

そんな自分ですが、身の回りの環境の変化や界隈の流れを見ていて最近思うことがあります。みなさん Vue って楽しく書いていますか?観測範囲内では、なんとなく後ろめたさを感じながらやっている人もいるようです。

2022 年現在において、宣言的 UI と呼ばれる手法を達成できるライブラリの中で最も躍進したのは間違いなく React であり、数学的根拠にインスパイアされたアーキテクチャは堅牢かつ柔軟でスケールしやすく、成熟期にあるフロントエンド界隈でより一層人気を得ています。

対して Vue に代表される独自テンプレート + リアクティブシステム系ライブラリは React に押され気味と言っても差し支えないでしょう。とりわけライバル的なポジションとして認知されている Vue への風当たりの強さを感じなくもないです。

自分も技術者の端くれですから、お金をもらってコードを書く上で自分の感情や都合に左右されて意思決定するのは問題です。昨今では React が書けるエンジニアは多いが、Vue に絞って採用するにはプールが狭い、などと聞き及ぶこともあります(何調べかはしりませんが)。採用リソースを引き合いに出されてはどんなにアーキテクチャに自信があってもはい…としか言えませんね。

さて、ここまで Vue を若干擁護するような文章を書いてきましたが、改めて自分のスタンスを示しておこうと思います(特に意味はないですがなんとなくこの記事を書いています)。 自分は Vue が丸ごと好きというわけじゃなく、好きな部分と嫌いな部分がはっきりしており、このまま React に押されて jQuery のようになっても構わないですし(悲しいけど)、所属会社(今のかそうでないかかかわらず)が React にします!と言えばすぐにその通りにします。Vue への執着は一切ありません。

理由はいろいろありますが、まず Vue に対しての興味関心が薄らいだというのがあります。Vue は安定期が長く 2 系の際に頂点を極めた(もっとも個性が強く求められていた)と思っています。Vue 3 以降の進化について批判する気持ちは毛ほどもありませんが、自分が Vue に求めていたものとは違う道を進んでいるというのが主な理由です。

Vue は長らく「持たざる者のための宣言的 UI」でした。React は Javacript さえ書ければ使えると評されるように、裏を返せば JavaScript を書けないデザイナーや非フロントエンドエンジニアにとって扱いが難しく、jQuery が支配的な環境において Vue の存在はとてもありがたかったのです。段階的に宣言的 UI を導入できる(Vue では漸進的と表現されます)ライブラリとして、当時サーバーサイドを中心に仕事をしていた自分もこの要素に惹かれていました。

フロントエンドの重みがまだ低かった時代、スタートアップにおいてコストを軽くするためにできる選択は、サーバーもできるフロントエンドではなくフロントもできるサーバーサイドエンジニアの採用というのが一般的であり、2017 年あたりまではサーバーテンプレートメインの MPA 構成もかなりの数世に出回っていたと思います。そんな中、宣言的 UI をコモディティ化してくれた Vue2 の登場はとても目を引いていました。

一方企業のスケールに合わせてアプリケーションもスケールさせなければならないもの世の常です。かかわる人が増えるほど堅牢性とわかりやすさが求められますし、エンジニア側の高度化に合わせてライブラリも進化を問われるわけです。1 つめの進化は Nuxt の登場です。これは Vue アプリケーションを作るうえでベストな選択になりました。今では Vue アプリケーションを作るのに大きさを問わず Nuxt から始めるのが良いと思っています。

次の進化は 2020 年あたりに起こった Vue3 のリリース、より少し前の @vue/composition-api の登場です。Vue3 で利用可能になる一部の Composition API システムを Vue2 に導入できるというもので、Vue アプリケーションに革命が起きました。しかし、この Composition API というのがそのまま Vue 本来の特徴を薄めてしまったというのも一定事実と捉えています。

Composition API はまさに JavaScript が書けるなら使える類の機能であり、設計センスや型安全性など、当時一部の上澄みユーザーが求めていた(React と比較されていた)部分を補うものでした。このあたりから、自分にとって Vue は「持たざる者のための宣言的 UI」から「手足のように使える魔法のライブラリ」になりました。自分主体で見るとうれしい進化でしたが、Vue のありようとして考えるとなんとも言えないものでした。

多くの開発者は自分がそのレベルになっていなくても、より高度かつ堅牢でスケールしやすく、React のようなライブラリを求めます。スマブラ開発者の桜井政博の著書に、ユーザーのほとんどは上位プレイヤーほどのスキルを持っていないが、求めるゲームバランスは上位プレイヤーと同水準になるというのがありましたが、なんかそれに近いのかなと感じています。

一方で、置き去りになるユーザーも世の中には沢山います。自分は特に computed という機能が好きです。computed に渡した無名関数のスコープに含まれる値は Vue が自動で追跡し、値に変化があった場合はそれを参照しているテンプレートすべてが再レンダリングされます。Vue はユーザーが意識しなくともある程度のパフォーマンスを保証してくれるため、作りたいものを作ることに集中できるというのがウリです。それがベストな時期のユーザーも沢山いるはずですよね。

作りたいものを作ることに集中させる、持たざる者のためにコモディティ化するというのはめちゃくちゃテック企業の理念っぽくないですか?自分はそういうのが好きですし、そういう会社で働きたいと思っています。まあこれは Vue に限らず、React もそうですが(React は一般人がギリギリ理解できるレベルで関数型の概念を取り込んでいる)。

というわけで、Vue に対する愚痴っぽくもなりましたが今でも Vue の好きな部分は変わりませんし、嫌いな部分もあります。ただ昔よりは興味も薄れてきたし、なんかみんな React 書けるようになってきたしいいか~という気持ちも正直あります。Vue 書いてるだけでなんか罵倒されることもたまにありますし(長いものにまかれると攻撃的になるのは人間の性なのか?)。Vue が最初から最後までベストな選択なんてことはないですから、今の自分たちにあったものを選んでいけばよいと思っています。

ただ自分が Vue より React が書きたいという理由だけで会社の予算を確保して特にメリットのないリプレースをするのはいただけないです。古の jQuery コードだって今までで何百何千万と利益を生んでいるわけなので、本当にその採算が合わなくなってきたと感じたらやるのが良いかなと思います。

おわり。