Vize

アーキテクチャの概要

Vize の JavaScript パッケージと Rust のコンパイラ・開発ツールのつながりを説明します。 連携の不具合を調べたり修正を提案したりする前に、どの部分が動作を担当するか確認したいときに使ってください。 アプリへの導入は Getting Started から始められます。

関係図 で、@vizejs/vite-plugin などの入口から担当クレートをたどってください。 実装ファイルは ソースガイド、公開 API の役割は クレートリファレンス で確認できます。

図は crates/ にある既存製品の処理経路を表しています。実験段階のレベル構造は davinci/ にあり、 移行の順序と条件は レベル再編の決定記録 に記載されています。 内部構造は引き続き変更されます。

プロジェクト関係マップ

JavaScript の連携パッケージはネイティブバインディングを呼び出し、コンパイラと開発ツールは 共通の構文解析・意味解析を利用します。利用しているパッケージから矢印をたどってください。

Vue apps
real projects

@vizejs/vite-plugin

@vizejs/nuxt

vize CLI

Editors

vize_maestro
LSP

Playground & docs

@vizejs/wasm

Musea gallery

@vizejs/vite-plugin-musea

Oxlint

oxlint-plugin-vize

vize_vitrine
NAPI bridge

Rust workspace

vize_armature
parser

vize_relief
AST

vize_croquis
semantic sketch

Atelier compilers

vize_atelier_dom

vize_atelier_vapor

vize_atelier_ssr

vize_atelier_sfc

vize_canon
type checking

vize_patina
linting

vize_glyph
formatting

vize_musea
gallery core

OXC

corsa-bind

Lightning CSS

この図は、各機能の担当と共通基盤の利用関係を示しており、すべての呼び出し経路を表すものではありません。 パーサー、AST、意味解析を共有し、その共通の言語モデルを中心に、コンパイラのバックエンドや開発ツールを 置き換えられる構造にすることが基本方針です。

コンパイルの流れ

Source .vue

Armature
Parser

Relief
AST

Croquis
Semantic Analysis

Atelier

VDOM Compiler

Vapor Compiler

SSR Compiler

Output JS

各段階の役割

  1. ソース — <template>、<script>、<style> ブロックを含む .vue ファイルです。
  2. Armature(パーサー) — ソースをトークン列に分け、構造化した AST に解析します。字句解析では、ディレクティブ (v-if、v-for、v-bind)、式の補間 ({{ }})、SFC ブロックの境界など、Vue 固有の構文を扱います。
  3. Relief(AST) — 後続の段階が利用する共通の中間表現です。構文木を共有して、同じ構文の解析を重複させないようにします。
  4. Croquis(意味解析) — テンプレートの式の解決、変数スコープの追跡、バインディングの種類(setup・data・props・inject)の検出、式の妥当性の確認を行います。JavaScript・TypeScript の AST の解析には OXC を使います。
  5. Atelier(コンパイル) — 解析済みの AST を JavaScript に変換します。出力先に応じて、次の三つのバックエンドを使います。
    • VDOM (vize_atelier_dom) — パッチフラグによる最適化や静的な要素の巻き上げを使い、createVNode・h の呼び出しを生成します。
    • Vapor (vize_atelier_vapor) — VDOM を使わず、DOM を直接操作する細粒度のリアクティブコードを生成します。
    • SSR (vize_atelier_ssr) — ハイドレーション用のマーカーを含む、文字列を連結するコードを生成します。
  6. 出力 — ソースマップを含む JavaScript コードです。

開発ツールの流れ

コンパイルに加えて、同じ構文解析・意味解析の基盤を利用する開発ツールがあります。

Source .vue

Armature
Parser

Relief
AST

Croquis
Analysis

Atelier
Compiler

Patina
Linter

Glyph
Formatter

Canon
Type Checker

Musea
Art & Docs Core

Maestro
LSP

構文解析と AST の共通化により、言語処理の重複を減らせます。コンパイラや各ツールの互換性は、 それぞれのフィクスチャと連携テストで確認します。

型チェックでは、vize_canon が Vue SFC から仮想 TypeScript を生成します。 corsa-bind を通じて Corsa のプロジェクトセッションにネイティブ診断を依頼し、 結果を元のファイルの位置に対応付けます。

実装を変更する際に必要な検証は、言語工学の実践 にまとめています。 パーサー、コンパイラ、解析器、型チェッカー、フォーマッタ、LSP、リリースの変更に対して、 フィクスチャ、スナップショット、互換性、ベンチマーク、利用準備状況をどう確認するかが分かります。

クレートの役割

層 クレート 役割
共通基盤 vize_carton 共通のユーティリティ、アリーナアロケーター、文字列のインターン
AST vize_relief AST ノードの定義、エラーの型、コンパイラのオプション
構文解析 vize_armature 字句解析器と再帰下降パーサー
意味解析 vize_croquis 意味解析、スコープの追跡、バインディングの検出
コンパイル vize_atelier_core 共通の変換処理、コード生成のユーティリティ、ソースマップ
コンパイル vize_atelier_dom VDOM のコード生成
コンパイル vize_atelier_vapor Vapor モードのコード生成
コンパイル vize_atelier_sfc SFC 全体の処理(スクリプト・テンプレート・スタイル・HMR)
コンパイル vize_atelier_ssr サーバーレンダリング向けのコンパイル
バインディング vize_vitrine Node.js (NAPI) と WASM のバインディング
CLI vize コマンドラインインターフェース (clap・rayon)
型チェック vize_canon corsa-bind を通じたネイティブ TypeScript・Vue の診断
lint vize_patina 各言語の診断 (en・ja・zh) を提供する Vue.js のリンター
整形 vize_glyph Vue.js のフォーマッタ(テンプレート・スクリプト・スタイル)
LSP vize_maestro Language Server Protocol (tower-lsp)
Musea vize_musea art ファイルの解析、ドキュメント、パレット、自動生成、VRT の中核処理
TUI vize_fresco ターミナル UI のフレームワーク (crossterm・taffy)

Musea のギャラリー UI と開発サーバーとの連携は、JavaScript パッケージの @vizejs/vite-plugin-musea が担当します。Rust クレートは解析と生成の中核処理を担当します。

命名規則

既存製品のクレート名は、美術や彫刻の用語に由来します。それぞれが Vue のコードを整形・変換する役割に対応し、 クレート同士の関係を表しています。名前の考え方は Philosophy を参照してください。

名前 発音 美術での意味 技術上の役割
Carton /kɑːˈtɒn/ 画家の道具や作品を整理して収納するケース 共通のユーティリティ — 各クレートが利用する基盤の道具箱
Relief /rɪˈliːf/ 平面から形を浮き出させる彫刻の技法 AST — ソースコードに構造を与える表現
Armature /ˈɑːrmətʃər/ 彫刻を支える内部の骨組み パーサー — AST を支える構造の基盤
Croquis /kʁɔ.ki/ 対象の本質を素早く捉える素描 意味解析 — コードの意味を捉える下描き
Atelier /ˌætəlˈjeɪ/ 制作を行う工房 コンパイラ — コードを最終的な形に変換する場所
Vitrine /vɪˈtriːn/ 美術館のガラス展示ケース バインディング — 外部からコンパイラを利用するための透明な層
Canon /ˈkænən/ 古典彫刻における理想的な比例の基準 型チェッカー — コードが正しさの基準に合うかを確認するもの
Patina /ˈpætɪnə/ 時間の経過による表面の仕上がりで、品質や手入れを表すもの リンター — 品質に影響する問題を見つけてコードを磨くもの
Glyph /ɡlɪf/ 正確な比例を持つ、彫られた記号や文字 フォーマッタ — コードを統一された読みやすい形に整えるもの
Maestro /ˈmaɪstroʊ/ 合奏をまとめる指揮者 LSP — 言語の各機能を一つのエディター体験にまとめるもの
Musea /mjuːˈziːə/ museum の複数形。作品を展示する場所 コンポーネントギャラリー — コンポーネントを展示し、調べる場所
Fresco /ˈfrɛskoʊ/ 湿った漆喰の壁に描く絵画の技法 TUI のフレームワーク — ターミナル上にインターフェースを描くもの

名前から役割を読む

コンパイルの役割と美術の制作工程は、次のように対応しています。

  • パーサー(Armature) は内部の骨組みです。彫刻の芯材が粘土を支えるように、後続の処理が使う構造を作ります。
  • 意味解析(Croquis) は素早い下描きです。最終的な形にする前に、コードの本質的な意味を捉えます。
  • コンパイラ(Atelier) は工房です。素材を完成した作品へ変換します。
  • AST(Relief) は立体的な表現です。平面の文字列に構造を与えます。
  • バインディング(Vitrine) はガラス展示ケースです。中の実装を直接変更せず、外から結果を見たり操作したりできます。
  • リンター(Patina) は表面の仕上がりを調べます。全体の品質に影響する問題を見つけます。
  • フォーマッタ(Glyph) は比例を揃えます。文字の間隔を整えて彫るように、コードの形を統一します。

たとえば vize_atelier_dom は、VDOM 向けの出力 を生成する 工房 に当たるクレートです。 名前の由来に加えて、担当する機能は クレートリファレンス でも確認できます。

外部依存関係

専門的な処理には、Rust エコシステムのライブラリなどを利用します。

依存関係 用途 利用するクレート
OXC JavaScript・TypeScript の AST の解析 vize_croquis, vize_atelier_core
Rayon データ並列によるマルチスレッド処理 vize, vize_vitrine
bumpalo AST ノードのアリーナ割り当て vize_carton
LightningCSS CSS の解析と変換 vize_atelier_sfc
corsa-bind ネイティブ TypeScript のプロジェクトセッションと診断 vize_canon, vize_maestro, vize_patina
tower-lsp LSP サーバーのフレームワーク vize_maestro
clap CLI の引数の解析 vize
wasm-bindgen WASM と JavaScript の連携 vize_vitrine
napi-rs Node.js のネイティブアドオン用バインディング vize_vitrine