🙃

2021年現在Vueを選択すべきでないと思う理由

2021/09/21に公開

使ってわかる、Vueへの恨み、つらつらと(随時更新)

  • コンポーネントのローカルスコープでコンポーネントを定義しようとするとJSXが必要
  • JSXが嫌でReactを使わないならSvelteがあり、SvelteはゼロオーバーヘッドでVueより速い
  • React+JSXと違って、マークアップをJavaScriptの式として扱えないせいで、TypeScriptとの相性も悪い
    • 後述するが、コンポーネントのプロパティの型をジェネリックにできないところなどは、これの例にあたる
  • Vueの新しい機能が出て、新しい構文を必要とするたびにIDEのプラグインの対応が必要になる
    • JSXも構文拡張だが、JS関数呼び出しのシンタックスシュガーでしかないので、関数と同じだけの表現力(汎用性)を持ち、ReactのAPI拡張のためにいちいちJSXまで拡張する必要はない
  • JSX無しだと、マークアップ内でアクセスしたいコンポーネントや関数等をいちいち指定しないといけないので、どうしても冗長になる
  • 属性をコメントアウトできない(属性に対するコメントを書けない)
    • 方法はありそう
  • Reactでは、ある状態に対する関数による変換があっても当然リアクティブだが、VueだとComputedにしなければいけない
  • 書く側の問題でもあるが、多くの問題はComputedで抽象化した方がバグが少ないが、watchやコンポーネントライフサイクルと扱いが同列なので、そうなってないことが多い(なのでバグが多い)
  • 双方向性地獄
  • refで勝手に内部のrefがunwrapされたり(toRefsだとならなかったり)Refで囲ってもTypeScriptの定義はunwrapされていなかったり(TypeScript)
  • .valueは明らかに冗長
  • Slotに渡す引数の型が指定できない(TypeScript)
  • ジェネリックなコンポーネントが作れない(TypeScript)
    • 【追記1】表現があいまいでした。Propsの型をジェネリックにできないという意味です。
  • Propsに関数を指定したいときもあるのに、イベントをemitするパターンが推奨されている為、仕事場で他メンバーの目が気になる
  • emitされるイベントの型が効かない(TypeScript)
    • 【追記1】validator関数を設定すれば引数の型が効くようです(常に true 返すジェネリック関数用意すれば、簡単に型が効きますね)
  • Vue3でref属性に関数が使えるようになったが、引数の型が object|null 固定(TypeScript)
  • Vue2からVue3へのBreaking Changeが、Deprecatedで十分そうなものが廃止になっていたりするせいで、移行はかなりきつい
  • Vue3のコンポジションAPIにおけるwatchはオブジェクトをディープに監視する仕様になっていて、プロキシベースであることと一貫性が取れてない上に、パフォーマンスの問題を引き起こしたりする
  • Provide/Injectで、状態に応じてProvideしたりしなかったりができないので、undefinedとの闘いから抜け出せない
    • 【追記1】こちらのスクラップで挙げられている方法だと、provideをする専用のコンポーネントを用意して props に対して利用側でundefinedを弾いた値を渡せばできるらしい。やる価値あり。
  • コンテキストの機能を提供するProvide/Injectで型が効かない(TypeScript)
    • 【追記1】こちらの記事で解説されている通り、Vue自体の特徴ではないもののcomposablesとしてinject/provideをラップしてあげれば型を効かせることができるようです。
  • Vuexはdispatchする時、型がまともに効かない(TypeScript)
    • 【追記1】typed-vuex というのが存在するようです。
  • Vuexの思想としてmutationがあるが大抵 set~ という何のロジックもないバイパスの列挙になりがちで、本来はactionで純粋関数を使うだけで十分。また、mutationこそ型を重視すべきなのに構造上推論ができないのは辛い。
  • VSCodeの拡張機能が重いし、ちょくちょく壊れる

結論

Vueは出てきた時からそうだけど、MVVM系のライブラリやWeb Componentsの仕様に引っ張られすぎていて、入りは楽だがだんだん辛くなるばかりである。
多少JSXが怖くてもReact使うべきだが、どうしてもReact嫌ならSvelteを使うべきだと思う。
JSX理解できずに、まともなJS書けるのだろうかという疑問もある。

追記1

私のVueに対する熱い(?)想いに対してご返答を頂けたので、なるべく内容を反映しました。(勉強になった)
https://zenn.dev/ushironoko/scraps/867375d4879706

ただの愚痴

ただの殴り書きがそこそこ人目に触れ、大量のはてぶコメントや技術とはなんら関係無いポエムによって雑な一般化の対象にまでされたので、愚痴ることにする。

まず、「はてぶコメント」についても文句を言いたい。
はてぶコメントは非常に不愉快なシステムだ。
彼らは安全な場所から小便をかけて気持ち良くなっている正真正銘のクズだ。
たとえ、賛成意見であったとしても私の意図とは関係ない方向に話を伸ばしてしまう。
感想や言いたいことがあればコメントしてくれば応対するのに、彼らは怖いのでせず他人の記事に寄生し、付いた星を見て愉悦に浸っている。
全くもって不愉快である。

次に「タイトルが煽りだ」という意見についてだ。
この意見を言った人は「2021年現在Vueを選択すべきでないと思う理由」という日本語が理解できていないようなので解説しよう。
まず「2021年現在」とつけたのは、当然ながら今後のVueの進化によってはそうでなくなる場合があるからだ。
そして、「選択すべきでない」というのは本当にそう思っていて、この記事を読んで選択しない人が増えればいいと思ったからだ。
「と思う」とつけたのは、それがあくまで私の意見であることを表し、「理由」はこの記事のコンテンツのことである。
日本語が理解できれば問題なく読み取れるはずだが、おそらくアフィリエイトの記事に晒されすぎて精神を病んだのだろうと同情するばかりである。

また、私が投稿した記事はあくまで「すべきでないと思う理由」である。
であるならば当然「すべき理由」もあるだろうが、単にこの記事では扱っていないだけである。
ただし、私のスタンスとしてはReactとVueを個人の好みや選択肢の問題だとは思っていない。
確実にReactが理論面でVueを上回っているという自信がある。
また、Vueを選択「すべき理由」には、技術と関係ない趣旨のものが目立つと思っている。
例えば、VueはEasyだから人材が確保しやすい、という内容だ。
PHPも同じような主張をよく聞く。
プログラマとして恥ずかしくないのだろうかと思う。

どのような反論でも肯定的意見でもいいが、プログラマならが技術についての意見であるべきだ。既にVueを選定してしまっていて、この記事を読んで不安になった非エンジニアは残念ではあるけど、技術を重視するなら受け容れた方が得だ。この記事に対する技術に関係ない意見や事実とかけ離れたただの予想に価値はない。そんなものに惑わされないことを祈るばかりだ。

Discussion