🐳

Dockerで動くNestJSのbuildをSWCを使って速くする

2024/07/22に公開

概要

  • DockerでNestJSを動かしています。ホットリロードが重いので、SWCを導入してbuildを速くしたいと思います。

設定内容

  • 基本的にNestJS公式(下記参考に記載)と同じやり方です。
    • SWCのインストールは公式を参照してください。
  • 各種ファイル設定は以下です。
package.json
"scripts": {
    "build": "npx swc src -d dist",
    "start:dev": "nest start -b swc -w",
}
nest-cli.json
{
  "$schema": "https://json.schemastore.org/nest-cli",
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "compilerOptions": {
    "deleteOutDir": true,
    "builder": {
      "type": "swc",
      "options": {
        "swcrcPath": ".swcrc"
      }
    },
    "typeCheck": true
  }
}
.swcrc
{
  "$schema": "https://json.schemastore.org/swcrc",
  "sourceMaps": true,
  "jsc": {
    "parser": {
      "syntax": "typescript",
      "decorators": true,
      "dynamicImport": true
    },
    "transform": {
      "legacyDecorator": true,
      "decoratorMetadata": true
    },
    "baseUrl": "./"
  },
  "minify": false,
  "module": {
    "type": "commonjs"
  },
  "sourceMaps": true
}

詰まった所

  • 以下のようにエラーになりました。dockerコンテナ内にコンパイル後のファイル達が存在しないようです。
    api-1       | Error: Cannot find module '/app/dist/main'
    api-1       |     at Function.Module._resolveFilename (node:internal/modules/cjs/loader:1028:15)
    api-1       |     at Function.Module._load (node:internal/modules/cjs/loader:873:27)
    api-1       |     at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    api-1       |     at node:internal/main/run_main_module:22:47
    

解消方法

  • dockerのbuild時にRUNコマンド(Dockerfile)でnpm run buildを指定してもうまくいきませんでした。
  • dockerの立ち上げ時にentrypoint(docker-compose.yml)で指定するとうまくいきました。
    • dockerコンテナが立ち上がった後でコンパイルするイメージかと思います。
    docker-compose.yml
    # 一部抜粋
    service:
      api:
        entrypoint: ['sh', '-c', 'npm run build && npm run start:dev']
    

参考

https://docs.nestjs.com/recipes/swc

Discussion