定期実行するバッチ的な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
を一緒に使うように、とのこと。
以上!! これでサーバ以外でもビルドができるように(*´ω`*)