Paepoi

Paepoi » Gjs Tips » Gjs とは

Gjs とは

最終更新日 2023.11.19

概要
Gjs は GObjectIntrospection の JavaScript バインディングです。
スクリプト言語用は Runtime 版、つまりダイナミックリンクライブラリを使う。
略して Gir と呼ばれます。

Gir に対応した他のスクリプト言語 (PyGObject 等) とできることはほぼ同様。
Python や bash 同様に一行目にシバンを表記して実行スクリプトとしても利用できます。
GNOME3 基本部品の一つなので GNOME3 には必ず入っています。

JavaScript エンジンは Spidermonkey を使います。
同様なものに JavaScriptCore を使う seed がありましたが現在は更新停止状態です。
GTK2 時代に乱立した Python バインディングが PyGtk に一本化されたのと同様。

このページでは Fedora 39 での GNOME 45 にて標準の gjs 1.78 を基に作成しています。
ES2019 をフル対応版です、古いバージョンでは動かない場合があります。
バージョンの確認は以下のコマンドで。
gjs --version

基本機能
基本的に ECMA Script に準拠しています、まあ Spider Monkey ですから。
Math 等も利用できますしテンプレートリテラルや Promise 等も使えます。
Web API ではないので document オブジェクトみたいなものはありません。
#!/usr/bin/gjs

print('はろーわーるど');
print(`円周率は ${Math.PI} です`);
Promise.resolve(null)
    .then((value)=> {
        print('非同期だ!');
    });
print('いくぞー');

ファイル分割
ファイル分割は Web 標準と同様に import と export を使うようになりました。
Gjs にて扱うには -m オプションが必要です。
#!/usr/bin/gjs -m

import Exp from './exp.js';

let exp = new Exp();
exp.printLine('カメラはやっぱり OM SYSTEM');
imp.js

export default class Exp {
    constructor() {
        print('Exp が作成されました');
    }
    printLine(text) {
        print(`☆☆☆${text}☆☆☆`);
    }
}
exp.js

デフォルト import で変数に入るのはモジュールではなくクラスであることに注意。
もちろん名前付き import や名前空間 import も利用できます。
Gjs で扱う GLib や Gtk はデフォルト import なので合わせたほうが吉。

Gir を使う
Gir の import は GVFS URI にて指定します。
バージョンは指定しなくても最新版で動きますが警告が出ますので注意。
下記は GtkApplicationWindow を作る最小限コードです。
#!/usr/bin/gjs -m

// 複数バージョンが混在する場合に指定
import 'gi://Gtk?version=4.0';

import GObject from 'gi://GObject';
import Gtk from 'gi://Gtk';

export const Win = GObject.registerClass({
    GTypeName: 'Win'
}, class Win extends Gtk.ApplicationWindow {
    _init(a) {
        super._init({application: a});
    }
});

const app = new Gtk.Application();
app.connect('activate', ()=> {new Win(app).present();});
app.run(null);

古いインポート
imports を使う古い手段もまだ動作しますので覚書に残しておきます。
こちらは当然 -m オプションは不要です。
#!/usr/bin/gjs

/**
 * imports.searchPath 配列で指定されているパスを参照する
 */
for (let s of imports.searchPath) print(s);

/**
 * 同一ディレクトリを参照に加える場合 bash 等と同様にドットが使える
 * 配列の先頭から順に探すので push, unshift にて都合の良い順番にする
 * 同一ディレクトリの mytool.js なら以下のように拡張子を外して
 */
imports.searchPath.unshift('.');
const Tool = imports.mytool;

/**
 * リソースからも普通に取り込める
 * Gir は gi を挟む
 */
const System = imports.system;
const Gio = imports.gi.Gio;

参考
GNOME / gjs · GitLab GitHub はミラーページ
GNOME JavaScript Docs URL が変わりました
GTK4 + GJS Book · Learn to build a GTK4 application with GJS GTK4 チュートリアル

Copyright(C) sasakima-nao All rights reserved 2002 --- 2024.