最近作ったBun向けの小さいツール(+alpha)たちの紹介 [自己満記事]
最近いくつか Bun 向けに小さいツールをいくつか作ったので紹介します。
bun-plugin-isolated-decl
Bun には Bun.build
という Bundler 備わっています。
とても速くて、プラグインを書くのも簡単なので、個人的にも気に入ってよく使ってます(ただし、tree-shaking が甘いという問題がある)。
しかし、Bun.build
には現在のところ、型定義ファイルを生成する機能がありません。
Issueも立っているのですが、まだ実装されていません。
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 declarations
を tsconfig.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
で差分を見ることができるような方法を紹介しています。
ただ、この設定を一々行うのは面倒です。
また、チームでの利用を考えると、これらの設定は自動的に行われるべきです。
そこでこれらの設定を自動で行ってくれる小さなコマンド、bunpare
を作りました。
中身はとてもシンプルで、 公式の紹介している方法を index.ts
に書き下した(コマンドの実行には bun shell
を使用) だけです。
便利な使い方としては、bunpare
を prepare
スクリプトに登録しておくことです。
{
"scripts": {
"prepare": "bun x bunpare",
}
これにより、git clone
したときに、bun install
するだけで、git diff
で Lockfile の差分を見ることができるようになります。
自分はこの bunpare
を Bun を使っている全てのプロジェクトに導入しています。
pkg-to-jsr
このツールは Bun 特有ではないのですが、流れで紹介します。
pkg-to-jsr
は、package.json
から jsr.json
を生成するツールです。
JSR とは、Deno が提供しているJS/TS用のレジストリです。
Denoだけでなく、Node.js のプロジェクトを アップロードすることもできます。
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.json
の name
と author
から自動的に 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