くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

esbuildでNode.jsアプリをビルドする

定期実行するバッチ的なNodejsアプリをビルドしたいと思い、
いろいろ調べてみたときの備忘録(*´ω`*)

Viteも試したけど、
ブラウザ用の設定などが組み込まれているので、
esbuildを使うようにした

vite-plugin-nodeもあるけど、
SSRなどのサーバ用のものしかないっぽい。。

esbuildでのビルドスクリプト

ディレクトリ構成はこんな感じ。

./
  src/       ... ソースのファイル
    index.ts
  dist/      ... ビルド後のファイル
    index.js
build.ts     ... ビルドスクリプト

ビルドスクリプト(build.ts)の中身はこんな感じ。

// ./build.ts
import { context } from "esbuild";
import { existsSync, rmSync } from "fs";
import { resolve } from 'path';

async function main() {
  const rootDir = resolve(__dirname, './');
  
  // 出力先のディレクトリ
  const outDir = resolve(rootDir, "dist");
  const isExist = existsSync(outDir);
  if (isExist) {
    // すでにディレクトリが存在したら削除する
    rmSync(outDir, { recursive: true, force: true });
  }

  // exbuildの設定
  const ctx = await context({
    // Nodejs用の設定
    platform: "node",
    // ビルドするソースのパス
    entryPoints: [
      resolve(rootDir, 'src/index.ts'),
    ],
    // 出力先のディレクトリのパスs
    outdir: outDir,
    // パッケージも出力ファイルにまとめる
    bundle: true,
    // minifyの有効化
    minify: true,
    // minify時に名前を維持するよう設定
    keepNames: true,
    // treeShakingの有効化
    treeShaking: true,
    // minify時に特定の関数の削除
    pure: ["console.log", "console.debug"]
  });

  // ビルドの実行
  await ctx.rebuild();
}

main().then();

あとは、実行すればOK

$ pnpx jiti ./build.ts
$ ls dist
> dist/index.js

バンドル/minify

bundle: trueを設定しているため、
minifyIdentifiers: trueにすると、
パッケージの変数もminifyされ、実行時エラーになる。。

これを回避するために、keepNames: trueにしている。

コンソールログの削除

コンソールログなど削除には、Pureを利用。

Dropでもできる(drop: ["console"])が、
ドキュメントにもあるとおり、すべてのログ出力を削除する形になるので、
おすすめされているPureを使う形に。

複数のエントリポイントを指定する

こんな感じで複数のエントリポイントを指定できる。

entryPoints: [
  resolve(rootDir, 'src/index.ts'),
  resolve(rootDir, 'src/main.ts'),
],
$ pnpx jiti ./build.ts
$ ls dist
> dist/index.js
> dist/main.js

TypeScriptは型チェックしてくれない

構文解析とかはesbuild出やってくれるが、type checkingはしてくれないっぽい。
tsc -noEmitを一緒に使うように、とのこと。


以上!! これでサーバ以外でもビルドができるように(*´ω`*)

参考にしたサイトさま