👀

Javaなしで安全に使えるPlantUMLビューア「pumlv」

に公開

はじめに

こんにちは、rin2yhです!

Javaに依存せずローカルで完結するPlantUMLビューア「pumlv」を作りました。特徴は次の3点です。

  1. Java不要: PlantUML公式のJavaScript版をブラウザで動かすため、Javaランタイムを必要としません
  2. 単一バイナリで完結: Releasesまたはmiseから取得した1ファイルだけで起動できます
  3. 外部送信ゼロ: レンダリングはすべてブラウザ側で行い、デフォルトは127.0.0.1にバインドします

pumlvの画面(クラス図)

本記事ではpumlvを作った経緯と、構成・使い方を紹介します。

作るに至った経緯

PlantUMLを既存ツールでプレビューしようとすると、VSCode拡張やNeovimプラグインのようなエディタ拡張はいずれもJavaランタイムのインストールが前提でした。私は普段Javaを使う機会がないため、このためだけにJavaを入れるのは手間に感じました。

オンラインエディタも考えましたが、業態の特性上、業務で扱う情報を外部サーバに送るわけにもいきません。

そんな中、k1Lowさんk1LoW/moというマークダウンビューアに着想を得て、PlantUMLでも同じことができそうだと考えました。さらに調査を進めると、PlantUMLにはJavaScript版[1]があり、これを軸にすればJavaも外部送信も避けられると気づきました。

pumlvはk1LoW/moと同様に、Goでサーバを書きフロントエンドをgo:embedで同梱することで、配布もインストールも単一バイナリで完結する構成にしました。

構成

pumlvの構成は以下のとおりです。

Goプロセスは次の3つの役割を持っています。

  1. 監視対象をRegistryで管理し、fsnotifyで監視する
  2. HTTPサーバとしてフロントエンド資材(React + plantuml.js)を配信する
  3. 変更検知時にHub(接続中のブラウザ全てへイベントを配信する仕組み)からSSE[2]でブラウザへ通知する

PlantUMLのレンダリング自体は完全にブラウザ側で行われます。Goプロセスは.pumlの本文をHTTPで返すだけで、外部のサーバへ送る経路はありません。デフォルトのバインド先も127.0.0.1としているため、同一マシン外からはアクセスできない構成です。

使い方

macOS / Linux(いずれも amd64 / arm64)で動作確認しています。Releasesのバイナリ、またはmiseGitHub backend)で導入できます。

# miseで入れる場合
mise use -g github:rin2yh/pumlv

# ディレクトリ監視(再帰)
pumlv ./docs

# 単一ファイル
pumlv ./design/seq.puml

# 複数引数も可
pumlv ./docs ./design/seq.puml

主なフラグは次のとおりです。

フラグ デフォルト 説明
--port 0(自動割当) バインドするTCPポート
--host 127.0.0.1 バインドホスト
--no-open false 起動時にブラウザを自動で開かない
--ext .puml,.plantuml,.iuml,.wsd 監視対象の拡張子

シーケンス図もそのまま扱えます。

pumlvの画面(シーケンス図)

業務では2000行規模のER図をプレビューする用途でも問題なく動作することを確認しています。大きめのファイルでも実用に耐えます。

既存ツールとの比較

経緯で触れた既存ツールとpumlvの差分を整理すると、次のとおりです。

ツール Java 外部送信 エディタ依存
PlantUML(VSCode拡張) 必要 なし VSCode
nvim-plantuml 必要 なし Neovim
PlantUML Web Server 不要 あり なし
pumlv 不要 なし なし

pumlvはこの3軸(Java要否・外部送信・エディタ依存)をすべてクリアすることを目的にしています。

おわりに

同じようにJavaを入れたくない・ソースを外に出したくない制約のある方にとって、PlantUMLをプレビューする選択肢の一つになれば嬉しいです。

お忙しい中ご覧いただき、ありがとうございました!

参考文献

脚注
  1. Java バイトコードを JavaScript / WebAssembly にトランスパイルするツールチェインです。PlantUML 公式の js 版はこの TeaVM 経由でビルドされており、ブラウザ上で Java の PlantUML 本体がそのまま動作します。 ↩︎

  2. Server-Sent Events の略です。サーバからクライアントへの一方向ストリーミングを HTTP の上で行うための仕組みで、WebSocket よりも実装が単純です。pumlv ではファイル変更通知のみを送る用途のため SSE で十分でした。 ↩︎

Discussion