作成者: BlinkGTK Project
バージョン: 1.2.0-build2
GTK4 のアプリに Web エンジンを組み込むとき、選択肢はおおむね 3
つです。
この文書は、その 3
つが構造としてどう違うかを整理したものです。
はじめにお断りしておきます。他エンジンの性能数値は載せていません。
公平に
測るには同じ条件で同じ内容を描かせる必要があり、それを継続的に維持できて
いないためです。推定値を並べるより、載せないほうが誠実だと考えました。
BlinkGTK
自身の数値は、測ったものだけを測った条件とともに書いています。
| CEF | WebKitGTK | BlinkGTK | |
|---|---|---|---|
| エンジン | Blink (Chromium) | WebKit | Blink (Chromium) |
| JavaScript | V8 | JavaScriptCore | V8 |
| GTK との関係 | 独自のウィンドウ管理。GTK とは別世界 | GTK ネイティブのウィジェット | GTK4 ネイティブのウィジェット |
| ライセンス | BSD-3-Clause | LGPL-2.1 / BSD-2-Clause | BSD-3-Clause |
| 対応 OS | Linux / Windows / macOS | Linux ほか | Linux (Wayland) |
読み方はこうです。
BlinkGTK は「Chromium の描画」と「GTK
ネイティブの扱いやすさ」を同時に取りに
いった、という位置にあります。逆に言えば、Linux/Wayland
に絞ることでそれを
成立させています。複数 OS に配りたいなら CEF、WebKit
の描画で構わないなら
WebKitGTK のほうが素直です。
同じ「ウィンドウに Web を出す」でも、書き方の重さが違います。
BlinkGTK — GTK ウィジェットなので、窓に入れるだけです。
GtkWidget *view = blink_web_view_new();
gtk_window_set_child(GTK_WINDOW(window), view);
blink_web_view_load_uri(BLINK_WEB_VIEW(view), "https://example.com/");WebKitGTK — ほぼ同じ形です。関数名と型が違うだけです。
GtkWidget *view = webkit_web_view_new();
gtk_window_set_child(GTK_WINDOW(window), view);
webkit_web_view_load_uri(WEBKIT_WEB_VIEW(view), "https://example.com/");CEF — アプリ側にハンドラのクラス群を用意し、CEF
のメッセージループに
制御を渡す形になります。C++ で数十行から始まり、GTK
のウィジェット階層とは
別系統でウィンドウを扱います。
移行を検討されている場合、WebKitGTK
からの移行はほぼ機械的です。
対応表は WebKitGTK
からの移行
にあります。
| CEF | WebKitGTK | BlinkGTK | |
|---|---|---|---|
| Wayland | 対応 (X11 も) | 対応 (X11 も) | Wayland 専用 |
| GObject Introspection | なし | あり | あり |
| Python / Rust から | 別途バインディングが要る | GI 経由で直接 | GI 経由で直接 |
BlinkGTK が X11
を切っているのは割り切りです。現在の主要デスクトップは
既定で Wayland なので実害は小さい一方、経路を 1
本に絞れる利点が大きいと
判断しました。X11 環境が要件なら BlinkGTK は選べません。
GObject Introspection に対応しているので、Python からはこう書けます。
import gi
gi.require_version('BlinkGTK', '0.1')
from gi.repository import BlinkGTK
view = BlinkGTK.WebView.new()
view.load_uri('https://example.com/')Chromium を抱える以上、小さくはありません。BlinkGTK
1.2.0-build2 の
実測値です。
| 実測 | |
|---|---|
| tarball (tar.gz) | 約 220 MB |
| 展開後 | 約 749 MB |
| 共有ライブラリ | 537 本 / 合計 約 710 MB |
libblinkgtk-0.1.so 単体 |
約 10 MB |
組み込み機器を検討されている場合は、この数字を先にご確認ください。
容量が厳しいなら、WebKit 系のほうが現実的です。Chromium
ベースである以上、
CEF も同じ桁になります。
メモリも同様で、Chromium がプロセスを分けて動くため WebView 1
つあたり
数百 MB を見込む必要があります。
配布形態は RPM (Fedora) / DEB (Debian・Ubuntu) / tarball
を用意しています。
tarball は展開したその場で動きます。
主要な機能はおおむね揃っています。BlinkGTK 側の詳細は各リファレンスへ。
| できること | BlinkGTK での入口 |
|---|---|
| ページを開く・戻る・進む | ナビゲーション API |
| JavaScript の実行とメッセージ交換 | アプリ連携 API |
| 独自 URL スキームでアプリ内配信 | 同上 |
| Cookie の読み書き | C API リファレンス |
| DevTools を繋ぐ | DevTools API |
| PDF 出力・スクリーンショット | C API リファレンス |
| コピー・保存・印刷の禁止 | 設定 API |
デバッグ手段はエンジンの系統で分かれます。BlinkGTK と CEF は
Chrome
DevTools がそのまま使えます。WebKitGTK は Web Inspector
です。
ここは BlinkGTK が意識的に力を入れている領域です。
縦書き・ルビ・圏点・縦中横・禁則処理に対応し、JLReq
(日本語組版処理の要件)
に沿った組版を目指しています。見つけた問題は Chromium
本体にも修正を
提案しており、その成果は Blink を使う他のエンジンにも及びます。
電子書籍リーダーのように日本語組版の質が製品価値に直結する用途では、
ここが選定理由になり得ます。
| こういう場合 | 向いているもの |
|---|---|
| Windows / macOS にも配る | CEF |
| 容量・メモリを切り詰めたい | WebKitGTK |
| X11 環境が要件 | CEF / WebKitGTK |
| Chrome と同じ描画がほしい | CEF / BlinkGTK |
| GTK ウィジェットとして自然に扱いたい | WebKitGTK / BlinkGTK |
| Chrome DevTools でデバッグしたい | CEF / BlinkGTK |
| 日本語縦組みの質が要件 | BlinkGTK |
| WebKitGTK から移りたい | BlinkGTK (移行はほぼ機械的) |
「どれが優れているか」ではなく、何を諦められるかで決まります。
BlinkGTK は容量と対応 OS を諦めるかわりに、Chromium の描画と GTK
の
扱いやすさを取りました。
| 版 | 変更 |
|---|---|
| 1.2.0-build2 | 全面的に書き直し。旧版は CEF 127 / WebKitGTK 2.44 / BlinkGTK v1.0.0-rc2 (Chromium 146) を前提としており、4 か月以上そのままだった。配布サイズも「約 65-80MB」と実際 (tarball 220MB / 展開後 749MB) から大きく外れていた。他エンジンの性能推定値は、公平に測り続けられないため削除 |