@ryoppippi

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

21 Aug 2024 ・ 7 min read


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

Note

これは​完全に​自己満足の​記事です

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 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 で​差分を​見る​ことができるような​方​法を​紹介しています。

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

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

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

https://github.com/ryoppippi/bunpare

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

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

{
"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.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) の​小さい​ツールたちを​紹介しました。 ぜひ​使ってみてください!

comment on bluesky / twitter
CC BY-NC-SA 4.0 2022-PRESENT © ryoppippi