🪐

Cloud Functionsはpackage.jsonをルートディレクトリと分けなくてもいい

2021/04/13に公開

firebase init コマンドでFirebaseプロジェクトを作ると、package.jsonがルートディレクトリとfunctionsディレクトリにそれぞれ作られ、TypeScriptもfunctionsディレクトリだけ別プロジェクトになります。

- firebase.json
- package.json
- tsconfig.json
- src/
- functions/
  - src/
    - index.ts
  - package.json
  - tsconfig.json

この場合、こちらで指摘されているように状況によっては型検査や補完が正しく動作しないという問題があります。

https://blog.ojisan.io/monorepo-cloud-functions

解決策

functionsのプロジェクトを分けずに1つにまとめるとこの問題を解決できます。

- firebase.json
- package.json
- tsconfig.json
- tsconfig.server.json
- src/
- functions/
  - index.ts

tsconfig.json / tsconfig.server.json

clientとserver(functions)でnoEmitやtargetなどの設定が一部異なるため分けています。

{
  // ...
  "include": ["**/*.ts", "**/*.tsx"],
  "exclude": ["node_modules", "dist"]
}

firebase.json

functionsのsourceディレクトリを . に変更します。

{
  // ...
  "functions": {
    "source": ".",
    "ignore": [".git", ".next", "node_modules", "out", "tmp"],
    "predeploy": "yarn build"
  }
}

package.json

functions/index.ts は dist/functions/index.js にコンパイルされるのでそれを参照します。

clientで使うパッケージもfunctionsで使うパッケージもここに追加します。

{
  "main": "dist/functions/index.js",
  "scripts": {
    "build": "tsc -P tsconfig.server.json",
    "next:build": "next build"
    // ...
  }
}

さいごに

型安全なFirestoreフレームワーク「Fireschema」を使うとCallable Functionのリクエスト・レスポンスやFirestore Triggerのsnapshotも型でガードできるのでぜひ使ってみてください

https://zenn.dev/yarnaimo/articles/516478067f4b85

Discussion