Vize

ツールの比較

Vize は、いくつかのプロジェクトと位置が近いため、比較されることは避けられません。

比較は役に立ちますが、それは比較の軸がはっきりしている場合に限ります。「速い」だけでは足りません。「Rust 製」だけでも足りません。「Vue に対応している」だけでも足りません。

本当に問うべきなのは、それぞれのプロジェクトがどの層を担おうとしているのかです。

周辺のツールの中での Vize の位置を示す関係図。参考にするもの、隣接する基盤、Vize が利用するもの、比較対象の 4 つに分類している

早見表

プロジェクト 中心にあるもの Vize との関係
公式の Vue ツール Vue のコンパイラと言語ツールにおける、本番利用の基準 Vize は独立した実験的なプロジェクトなので、これを基準点として扱う必要がある
Oxc / Oxlint JavaScript と TypeScript の汎用的な基盤 Vize は Oxc を再利用して連携しつつ、Vue 固有のセマンティクスを担う
Golar typescript-go を使った、埋め込み言語の型チェック Vize は型チェックだけでなく、Vue のツールチェーン全体を対象にしている
Verter 次世代の Vue コンパイラとツールチェーンを目指す、別の試み 目指すところは最も近いが、アーキテクチャと製品としての形が異なる
Flint 既定値が充実した、型情報を使う親しみやすい JS/TS の lint 汎用的な TS の lint を補完し合う関係で、Vue SFC のツールチェーンではない
TSSLint 言語サーバーの中で動く、TypeScript ネイティブの lint セマンティックな lint の有力な考え方だが、Vue のコンパイラ・リンター・ギャラリーまでは含まない

公式の Vue ツール

まず重要なのは、公式のスタックです。

Vue Language Tools、vue-tsc、Vue のコンパイラの各パッケージ、公式のエディター連携は、本番利用の基準です。Vize の動作が公式と食い違っているとき、それが自動的に「大胆な新しいアイデア」になるわけではありません。ほとんどの場合、それは修正が必要な箇所か、実装が不完全な箇所か、互換性についての説明をもっと明確にするべき箇所です。

だからといって、Vize に意味がないわけではありません。

公式のスタックは、守るべき契約を定めています。

Vize は、より統合された Rust ネイティブのアーキテクチャを試すことができます。それでも、実際の Vue のコード、実際のコンパイラ出力、実際の診断、エディターに対する実際の期待から目を離すことはできません。公式のスタックは、この実験を誠実なものに保つための基準点です。

Oxc と Oxlint

Oxc は、JavaScript と TypeScript のための汎用的なコンパイラ基盤のプロジェクトです。Oxlint は、その上に作られた高性能なリンターです。

Vize は、JavaScript と TypeScript の層で Oxc と競うべきではありません。それは無駄です。Oxc はすでに、高速なパーサー、セマンティック解析の基盤、フォーマッタとリンターの方向性、そして増え続ける共通の部品を、エコシステムに提供しています。

Vize が向き合う問いは、もっと範囲が狭く、Vue に固有のものです。

  • .vue ファイル全体とは何か
  • テンプレートのスコープは、script のバインディングとどうつながるのか
  • ディレクティブ、スロット、props、emits、style ブロック、コンパイラの出力は、互いにどう関係するのか
  • 診断を、人が編集している元のソースの正確な位置にどう対応付けるのか
  • そのセマンティクスを、コンパイル、lint、フォーマット、型チェック、LSP、Musea、AI のワークフローにどう活かすのか

Oxc は、JS/TS の汎用的な土台を担えます。Vize は、その土台を使いながら、Vue を「ただの script ブロック」に押し込めない、Vue 固有のツールチェーンを担えます。

Golar

Golar が興味深いのは、埋め込み言語のために typescript-go を本格的に使っている点です。

中心にあるのは、型チェック、仮想コード、tsgo との統合です。Vue に関しては、公式の language-core のモデルに自然と近い位置になります。これは実用的でよい形です。Vue の仮想コードの仕組みを再利用し、TypeScript のエンジンをより速く、より柔軟にします。

Vize は、もっと広い問題を解こうとしています。

型チェックの層は重要ですが、それがプロジェクトのすべてではありません。Vize は、パーサー、セマンティックモデル、コンパイラ、リンター、フォーマッタ、ネイティブの型チェック、LSP、コンポーネントギャラリー、AI 向けの機能が、Vue を理解する同じコアをより多く共有することを目指しています。

つまり、違いは「Golar は型チェックで、Vize はもっと速い型チェック」ということではありません。

違いは次のとおりです。

  • Golar は主に、埋め込み言語を TypeScript で処理するための取り組みです。
  • Vize は Vue のツールチェーン全体の取り組みで、型チェックは Vue の解析モデルを利用する側のひとつです。

Verter

考え方の面で最も近い比較対象は、おそらく Verter です。

Verter も大きな問いを立てています。各層を考え直すことをいとわないなら、次世代の Vue ツールチェーンはどのような姿になるのか、という問いです。

これは Vize の問いに近いものです。どちらのプロジェクトも、コンパイラの動作、言語ツール、診断を重視し、互いに無関係なプラグインの寄せ集めでは実現しにくい、より厳格な体験を目指しています。

違いは、重点の置き方にあります。

  • Verter は、最初からより厳格で、言語サービスを重視しているように見えます。
  • Vize は、コンパイル、lint、フォーマット、型チェック、LSP、Musea、AI のワークフローにまたがる、Rust ネイティブの共有コアを重視しています。
  • Vize は、コンポーネントギャラリーとデザインシステムのためのツールも、あとから足すドキュメントではなく、フロントエンド環境の重要な一部として扱っています。

Verter を敵だとは考えていません。複数の実験があってしかるべき領域での、もうひとつの本格的な実験です。

Flint

Flint は、少し種類の異なる比較対象です。

Flint は JavaScript と TypeScript のリンターで、役に立つ既定値、キャッシュ、型情報を使う lint に力を入れています。JS/TS のエコシステムには現実の問題があるので、これには価値があります。構文だけを見る lint は速い一方で不完全です。セマンティックな lint は、遅くなったり、運用のコストが高くなったりしがちです。

セマンティックなフィードバックは、実用的で、速く、気持ちよく使えるべきだ、という前提には Vize も同意します。

ただし Flint は、Vue SFC のコンパイラ、フォーマッタ、テンプレートの解析器、コンポーネントギャラリー、Vue 専用の LSP になろうとはしていません。質の高い、汎用的な lint の方向性として理解するのがよいでしょう。

補完し合う形は、次のようになります。

  • Flint は、JS/TS の lint の体験を前に進められます。
  • Vize は、Vue 固有の解析を前に進められます。
  • よいフロントエンド環境は、すべてのツールにすべての関心事を担わせるのではなく、こうした層同士を連携させるべきです。

TSSLint

TSSLint が重要なのは、TypeScript のセマンティックな lint を、TypeScript の言語サーバーの近くで動かせるものとして扱っている点です。

この考え方には説得力があります。TypeScript のチェッカーがすでにプロジェクトを開いているのに、セマンティックな問いに答えるためだけに、別のリンターのプロセスですべてを組み立て直す必要があるでしょうか。

Vize にも同じような直感があります。ただし、その対象は、複数の言語からなる成果物としての Vue です。

Vize にとっての問いは、「lint のルールは TypeScript の状態を再利用できるか」だけではありません。次のような問いです。

  • テンプレートの解析は、コンパイラと同じ Vue のセマンティックモデルを再利用できるか
  • 型情報を使う Vue の lint ルールは、全体の再構築のコストを払わずに、的を絞った問い合わせができるか
  • エディターの診断、一括チェック、AI による修正のループは、同じソースの対応付けで一致できるか
  • 処理のコストを回収できるだけの時間、プロジェクトのセッションを維持できるか

TSSLint は、セマンティックな lint が、すでにある言語の状態の近くへ移っていこうとしていることを示す、強い兆しです。Vize は、その直感を Vue 固有の構造にまで広げます。

Vize が担おうとしているもの

Vize は、すべてを担うべきではありません。

担うべきなのは、Vue 固有の知識に一貫性が必要な部分です。

  • SFC のパースとブロック構造
  • テンプレートのセマンティクス
  • ディレクティブとコンポーネントの解析
  • コンパイラの出力に関する判断
  • Vue を理解した lint の診断
  • 生成物から .vue へのソースの対応付け
  • Musea のためのコンポーネントのメタデータ
  • AI のワークフローのための、機械が読み取れる診断

それ以外の部分では、連携するべきです。

  • JavaScript と TypeScript のパースには、可能な限り Oxc を使う
  • 動作を公式の Vue ツールと比較する
  • 型情報を使うフィードバックループについて、Golar、TSSLint、Flint から学ぶ
  • ツールチェーン全体を対象にしたもうひとつの実験として、Verter の動向を追う

製品としての位置づけ

最もすっきりした位置づけは、次のとおりです。

Vize は、独立した、実験的な、Rust ネイティブの Vue ツールチェーンです。コンパイラ、リンター、フォーマッタ、型チェッカー、LSP、コンポーネントギャラリー、AI 向けの診断が、ひとつの一貫した環境として感じられることを目指しています。

つまり、Vize は公式の答えではありません。

高速な、実験的な答えです。

今やるべきことは、その答えを実際のプロジェクトで役に立つものにすること、公式の動作との差を縮めること、そしてこの実験に価値があると言えるだけの鋭さをアーキテクチャに保ち続けることです。