Mobile Factory Tech Blog

技術好きな方へ!モバイルファクトリーのエンジニアたちが楽しい技術話をお届けします!

NestJS 製のプロジェクトのテストを@swc/jest で高速化する

NestJS は Node.js 向けのウェブフレームワークです。その特徴として Decorator を用いてクラスやメソッドにアノテーションをする仕組みを提供しています。

例えば API のエンドポイントを定義する場合は次のようなコードを実装します。

import { Controller, Get } from '@nestjs/common';

@Controller('cats')
export class CatsController {
  @Get()
  findAll(): string {
    return 'This action returns all cats';
  }
}

高速な TypeScript のトランスパイラの実装として esbuildSWC が有名です。今回は SWC の jest binding である @swc/jestts-jest の代わりに使用して、NestJS 製のプロジェクトのテストを実行する方法を紹介します。

サンプルコードは以下のリポジトリにあります。

github.com

SWC は .swcrc ファイルで設定を管理します。デコレータを有効にしたり、NestJS の DI のためにクラス名を維持する設定をします。

{
  "jsc": {
    "parser": {
      "syntax": "typescript",
      "tsx": false,
      "decorators": true
    },
    "target": "es2017",
    "keepClassNames": true,
    "transform": {
      "legacyDecorator": true,
      "decoratorMetadata": true
    }
  },
  "module": {
    "type": "commonjs",
    "noInterop": true
  }
}

jest.config.js@swc/jest の README にある通りに設定します。

const fs = require('fs')

const config = JSON.parse(fs.readFileSync(`${__dirname}/.swcrc`, 'utf-8'))

module.exports = {
  transform: {
    '^.+\\.(t|j)sx?$': ['@swc/jest', { ...config, /* custom configuration in jest */ }],
  },
}

これで NestJS 製のプロジェクトのテストのトランスパイラに @swc/jest を使用することができるようになりました。

上記のサンプルリポジトリのテストを GitHub Actions 上で実行したときに、ts-jest だと3.42秒かかっていたのが、@swc/jest だと0.79秒に短縮されました。