🪐
Cloud Functionsはpackage.jsonをルートディレクトリと分けなくてもいい
firebase init
コマンドでFirebaseプロジェクトを作ると、package.jsonがルートディレクトリとfunctionsディレクトリにそれぞれ作られ、TypeScriptもfunctionsディレクトリだけ別プロジェクトになります。
- firebase.json
- package.json
- tsconfig.json
- src/
- functions/
- src/
- index.ts
- package.json
- tsconfig.json
この場合、こちらで指摘されているように状況によっては型検査や補完が正しく動作しないという問題があります。
解決策
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も型でガードできるのでぜひ使ってみてください
Discussion