🔖

quickjs(Go binding)を試してみた

2022/12/02に公開

この記事はCyberAgent AI tech studio | Go Advent Calendar 2022 2日目の記事です。

quickjs

先日ぼーっとTwitterを見ていたらこのようなツイートを見かけました

https://twitter.com/__syumai/status/1596488652942544897?s=20&t=wcjC924gb4Sn9ZSwZCdYYA

https://twitter.com/__syumai/status/1596524176398958592?s=20&t=ykQ6eoi87kSl2IWoFABZ6A

どうやらJavaScriptのbindingsをGoでできるものらしく、Goの関数でJavaScriptをラップしていることもあり、wasmのように実行環境に依存せず、簡単にjsのコードを使えそうです。

syumaiさんはday.jsをラップしており、手元で触ってみたところ、普段とGoを書くときの体験そのままに使えたため自分でも何か作ってみたいと思い作ったのが以下のライブラリになります。

https://github.com/sivchari/go-momentjs

day.js同様に日時操作周りを作ってみたいと思い、moment.jsをラップしました。

使い方は非常にシンプルで以下のように使います。

package main

import (
	"log"

	"github.com/sivchari/go-momentjs"
)

func main() {
	m, err := momentjs.New()
	if err != nil {
		panic(err)
	}
	const format = "YYYY年MM月DD日 HH:mm:ss"
	m.Global.Set("fmt", m.QjsCtx.String(format))
	defer m.ClearGlobal("fmt")
	result, err := m.QjsCtx.Eval("moment().format(fmt)")
	if err != nil {
		panic(err)
	}
	resultDate := result.String()
	result.Free()
	log.Println(resultDate)
}

このコードを実行すると

2022/12/02 11:47:59 2022年12月02日 11:47:59

という出力が得られるので、期待通りにmoment.jsを使えることがわかります。

まとめ

最後までお読みいただきありがとうございました。基本的に標準パッケージや3rd packageを組み合わせるとGoで書けるものが多いですが、部分的にJavaScriptを使いたいときに効果的だなという印象です。
またES2020のインタプリタのため、何かしらの大きなOSSをラップしたりして面白いこともできそうだなという印象です。

Discussion