移行手順
今回は以下の手順で移行できました。
1. tsconfigの修正
以下3点を修正した。
2. Aのビルドコマンドの修正(CLI)
2-1. ビルド時のエントリポイントについて
esbuildでは、TypeScriptを標準サポートしているため、直接エントリポイントにtsファイルを指定した。
(webpackでもbabel-loaderなど設定すれば可能だが、元はtscでトランスパイルしていた)
2-2. オプションの置き換え
今回の記事のメインです。
A.は、webpack.config.jsを使う代わりにesbuild CLIでのビルドになった。
元のwebpack.config.jsは以下。
...
const server = {
  entry: './dist/path/to/entrypoint.js',
  target: 'node',
  mode: 'production',
  output: {
    path: path.join(__dirname, 'dist/server'),
    filename: 'handler.js',
    libraryTarget: 'commonjs2'
  },
};
...
esbuild CLIに書き直した結果、以下となった。
esbuild ./src/path/to/entrypoint.ts --platform=node --bundle --outfile=./dist/server/handler.ts --target=node14
以下のようにwebpackのプロパティをesbuild CLIの設定に置き換えた。
- entryプロパティ →- esbuildコマンドのパラメータ
- targetプロパティ →- --platformオプション
- outputプロパティ→- --outfileオプション
- babel-loader等の実行環境設定→ --targetオプション
その他、今回は動作確認していないが、以下も代替できる模様。
- productionプロパティによる最適化は- --minifyオプション
- devtoolプロパティによるソースマップ設定は- --sourcemapオプション
2-3. ビルドプロセスの修正
tscを行ってからesbuildするように修正した。
esbuildは型チェックをしないため、TypeScriptの型チェックによるコンパイルエラーの恩恵を受けるためには、tscする必要がある。
(tscが無駄にjsファイルを出力しないため、手順1.でcompilerOptions.noEmitを設定した)
3. Bのビルドスクリプトの修正(JavaScriptAPI)
3-1. ビルドスクリプトの作成
冒頭述べたように、(将来)動的に複数ファイルをエントリポイントとしてビルドできるように、JavaScriptAPIを使って記述。
esbuildのJavaScriptAPIは扱いやすく、async/awaitも用いて以下のようにTypeScriptから扱うことができた。
※移行元のwebpackは割愛
// build-trigger.ts
import { build } from "esbuild";
const triggerNames = ["triggerA", "triggerB", "triggerC"];
const buildPromises = triggerNames.map(async (name) => {
  const sourcePath = `./src/trigger/${name}/handler.ts`;
  const destPath = `./dist/trigger/${name}/handler.js`;
  await build({
    entryPoints: [sourcePath],
    bundle: true,
    outfile: destPath,
    platform: "node",
    target: "node14",
  });
});
Promise.all(buildPromises)
  .then(() => {
    console.log("done trigger build");
  })
  .catch((reason) => {
    console.log(reason);
  });
3-2. ビルドプロセスの修正
手順2-3. 同様、tscコマンドをesbuildの前に実行するように修正。