ts-jestではなくesbuild-jestを試してみる
開発にgoogleapisを使っているとtscが遅くなってしまったのでテストの実行だけでも早くならないかと思い調べるとesbuild-jestとswr-jestというのがあることを知った
aws-cdkの@aws-cdk/aws-lambda-nodejs
がbuildにesbuildを使っているので、esbuild-jestを試してみた。
tl;dr
なんかesbuild-jestのpackage.jsonに書かれているパッケージが見つからなくてエラーになったりするのでまだ手出さない方がいいかもしれない。
前提
ts-jestの環境を既に構築済みの人
インストール
取ってきて、jest.config.js
を少し書き換えるだけで簡単に実行できた。
yarn add -D esbuild-jest
module.exports = { testEnvironment: 'node', testMatch: ['**/*.test.ts'], transform: { // '^.+\\.tsx?$': 'ts-jest', '^.+\\.tsx?$': 'esbuild-jest', }, }
ハマったこと
jest.mockを書くとCannot find moduleエラーが起きる
ソースコード中にjest.mock
を書くとCannot find module '@babel/plugin-transform-modules-commonjs'
というエラーが出て動かなくなる。
一応自分でyarn add -D @babel/plugin-transform-modules-commonjs
を実行してパッケージをインストールするとここは突破できる
型アノテーションをつけるとエラーになる
自分で x: number
のような型アノテーションをつけると @babel/preset-typescript
等を使って型情報を外す必要があるということが SyntaxError
と共に表示される
これは@babel/preset-typescript
を追加してプロジェクトのpackage.json
に@babel/preset-typescript
の設定を書くとエラーが消える。
感想
自分のpackage.jsonに設定書き加えたり、依存モジュールが見つけられなかったりイマイチ原因がわからないエラーに当たるのは辛いがやっぱ早いのはいい事だよなと思って、最悪esbuild-jest
と書いたところをts-jest
に戻すだけで戻れるので使ってみてる。
またハマったという事ではないけど、カバレッジをとった時にts-jestとesbuild-jestで若干値が違ってるんだけど、どっちが正しいのかよくわからないという問題があるな〜とは思うが、そこまでカバレッジを意識するところまで行ってないので一旦esbuild-jestが出す値を目安くらいの気持ちで運用することにした。
aws-cdk + localstackで定義したlambdaを実行してそのログを確認する
イマイチログの見方がわからず、今後使う時もまたハマりそうなのでメモ
想定読者
- cdkを使ってlambdaを定義できる
cdklocal deploy
を実行して定義したlambdaをデプロイできる- デプロイしたlambdaを実行できる
確認用のlambda
nodejsしか使えないのでnodejsでlambdaを定義する。logにはnode-bunyanを使用する
ログを出力してそれをレスポンスとして返す簡単なlambda関数
import type { APIGatewayProxyHandler } from 'aws-lambda' import * as bunyan from 'bunyan' const logs = bunyan.createLogger({name: 'myapp'}) export const handler: APIGatewayProxyHandler = async (event) => { logs.info({message: 'handle event.', req: event}) return { statusCode: 200, body: JSON.stringify(event) } }
ログの確認方法
# log groupを確認する aws --endpoint-url=http://localhost:4566 logs describe-log-groups --query logGroups[0].logGroupName # logをtailで表示する logGroupNameの部分を取得したものに置き換える aws logs tail {logGroupName} --follow --endpoint-url=http://localhost:4566
これでlambdaのログを追うことができるのでデバッグが捗る
typescript 4.5 betaでes modulesを試す
node.jsでes modulesがサポートされた時にやってみようと思ったがts
→mjs
に変換する方法が無くて諦めたやつができるようになったっぽいので試してみた。
一応試したコードはgithubに上げてある。
インストールと設定
beta版(4.5.0-beta)をインストールする
yarn add typescript@beta
tsconfigを作成し、module設定を変更する
yarn tsc --init
commonjs
をes2022
に
{ "compilerOptions": { "module": "es2022", } }
雑なtypescriptのコードを用意する。ts4.5では .mts
という拡張子が使える様になっている。.mts
をコンパイルすると.mjs
とes moduleを使う指定になってnode.jsが実行してくれる。
// add.mts export const add = (x: number, y: number) => x + y // index.mts import { add } from "./add.mjs"; // ここがm"js"なことに注意 console.log(add(1,2))
これでtscして実行してみる
yarn tsc -P . && node src/index.mjs
ちなみに
.mts
のような拡張子を使わず、既存の.ts
でcommonjsではなくes moduleとして実行することもできることができる。*1
type in package.json and New Extensions
実際にやってみた。ソースコードは前とほぼ同じだけど、ファイルの拡張子が違う。
// add.ts export const add = (x: number, y: number) => x + y // index.ts import { add } from "./add.js"; console.log(add(1,2))
package.jsonに以下を書き加える。設定を書くとnode.jsが.js
をes moduleとして実行する。
{ "type": "module" }
yarn tsc -P . && node src/index.js
*1:node.js v12で入った機能ですが https://nodejs.org/api/packages.html#packages_type