🍞

最近作ったBun向けの小さいツール(+alpha)たちの紹介 [自己満記事]

2024/08/22に公開

最近いくつか Bun 向けに小さいツールをいくつか作ったので紹介します。

bun-plugin-isolated-decl

https://github.com/ryoppippi/bun-plugin-isolated-decl

Bun には Bun.build という Bundler 備わっています。

https://bun.sh/docs/bundler

とても速くて、プラグインを書くのも簡単なので、個人的にも気に入ってよく使ってます(ただし、tree-shaking が甘いという問題がある)。

しかし、Bun.build には現在のところ、型定義ファイルを生成する機能がありません。
Issueも立っているのですが、まだ実装されていません。

https://github.com/oven-sh/bun/issues/5141#issuecomment-1719218286

bun-plugin-isolated-decl は、Bun のプラグインとして、型定義ファイルを生成する機能を提供します。

使い方は簡単で、build.ts のオプションに plugin として追加するだけです。

import isolatedDecl from 'bun-plugin-isolated-decl';
await Bun.build({
	entrypoints: ['./index.ts'],
	outdir: './dist',
	plugins: [isolatedDecl()],
	// ... other configuration options
});

内部では oxc-transformer を用いています。
oxc-transformer は rust で書かれた oxc を用いて型定義を生成するツールです(ただし、 isolated declarationstsconfig.json で有効にする必要があります)。
これにより、tsc を用いるよりも圧倒的に高速に型定義ファイルを生成することができます。

自分はしばらくこの Bun.build + bun-plugin-isolated-decl の組み合わせでライブラリのビルドを行ってています。
高速にビルドが完了するので、とても便利です。

とはいえ、ここ1ヶ月くらいでrolldown が比較的実用的になってきたこと、rolldown の出力の方が綺麗で tree-shaking もよくできていること (rollup の出力に近い)、 rolldown のラッパーである tsdown がそこそこ使い物になってきたことから、今後は rolldown をメインに使っていくかもしれません。

bunpare

Bun の Lockfile は、bun.lock というファイル名で保存されます。
この Lockfile はバイナリ形式です。
Bun install の高速さはこのバイナリ形式によるものですが、テキストファイルではないため git での管理が難しいという問題があります。

Bun 公式では、git の textconv を設定することで git diff で差分を見ることができるような方法を紹介しています。

https://bun.sh/docs/install/lockfile

ただ、この設定を一々行うのは面倒です。
また、チームでの利用を考えると、これらの設定は自動的に行われるべきです。

そこでこれらの設定を自動で行ってくれる小さなコマンド、bunpare を作りました。

https://github.com/ryoppippi/bunpare

中身はとてもシンプルで、 公式の紹介している方法を index.ts に書き下した(コマンドの実行には bun shell を使用) だけです。

便利な使い方としては、bunpareprepare スクリプトに登録しておくことです。

{
"scripts": {
    "prepare": "bun x bunpare",
}

これにより、git clone したときに、bun install するだけで、git diff で Lockfile の差分を見ることができるようになります。
自分はこの bunpare を Bun を使っている全てのプロジェクトに導入しています。

pkg-to-jsr

https://github.com/ryoppippi/pkg-to-jsr

このツールは Bun 特有ではないのですが、流れで紹介します。

pkg-to-jsr は、package.json から jsr.json を生成するツールです。

JSR とは、Deno が提供しているJS/TS用のレジストリです。
Denoだけでなく、Node.js のプロジェクトを アップロードすることもできます。

JSRの動作のイメージは以下の記事が参考になるので、あわせて読んでみてください!

https://zenn.dev/kesin11/articles/20240530_publish_jsr

JSR は個人的には

JSR に Node のパッケージをアップロードするためには、jsr.json というファイルを package.json とは別に用意する必要があります。
jsr.json には

  • name
  • version
  • publis.include/ publish.exclude
  • exports

などを記述する必要があります。

しかし、ある程度このファイルを手で書くのは面倒です。
package.json と共通の情報が多いため、package.json から jsr.json を生成するツールがあれば便利だと思い、作りました。

pkg-to-jsrの使い方

pkg-to-jsr は、zero config を謳っています。

たとえば、以下のような package.json からは

{
  "name": "example",
  "jsrName": "@scope/example",
  "version": "1.0.0",
  "main": "dist/index.js"
}

以下のような jsr.json が生成されます。

{
  "name": "@scope/example",
  "version": "1.0.0",
  "exports": {
    ".": "dist/index.js"
  }
}

また、JSR 向けの exports の設定、package.jsonnameauthor から自動的に scoped package name を生成するなど、いくつかの機能があります。

そのため、以下のような比較的複雑な package.json からは、

{
    "name": "example",
    "author": "ryoppippi",
    "version": "1.0.0",
    "exports": {
        ".": {
            "import": "./dist/index.js",
            "require": "./dist/index.js",
            "types": "./dist/index.d.ts",
            "jsr": "./src/index.ts"
        }
    }
}

以下のような jsr.json が生成されます。

{
    "name": "@ryoppippi/example",
    "version": "1.0.0",
    "exports": {
        "." : "./src/index.ts"
    }
}

詳しい使い方は README.md を参照してください。

まとめ

以上、最近作った Bun 向け(+ alpha) の小さいツールたちを紹介しました。
ぜひ使ってみてください!

Discussion