1つのプロジェクト成り立たせるためにGCPのApp EngineとCloud Functionsで動作させています。App Engine、Cloud Functions両方共通のコードがあります。この共通コードをどこに置くかで小一時間悩みました。

結論から言うと共通コードはリポジトリを分けて、git submoduleで取り込むことにしたのですが、その経緯を書きます。

最初は以下のようにしようと思いました。
common
└ **/*.js
appEngine
├ package.json
├ node_modules/**
└ **/*.js
cloudFunctions
├ package.json
├ node_modules/**
└ **/*.js

そしてappEngine、cloudFunctions以下のjsファイルから相対パスでcommon以下のjsをimport。

[appEngine/index.js]
import "../common/hoge.js"

しかし、common以下にはnode_modulesがない。appEngineやcloudFunctions以下のnode_modulesにあるモジュールをcommon以下のjsでimportすると、そんなものはないと怒られる。

[common/hoge.js]
import {Request, Response} from "express" -> expressはないとエラーになる

common以下にpackage.jsonを置いてnpm install, yarn installでcommon/node_modulesを作ると動くけど、common、appEngine、cloudFunctionsそれぞれのnode_modules以下のモジュールのバージョンが食い違うと上手く動作しなくなることがある。

というわけで以下のようにcommonは別リポジトリにして、それぞれgit submoduleで取り込むのが良いと判断しました。
appEngine
├ package.json
├ node_modules/**
├ common/**/*.js <- commonはgit submodule
└ **/*.js
cloudFunctions
├ package.json
├ node_modules/**
├ common/**/*.js <- commonはgit submodule
└ **/*.js

appEngineとcloudFunctionsが同じリポジトリで、異なるディレクトリでcommonを別々にgit submodleで取り込むこともできます。が、結局、appEngine、cloudFunctionsもリポジトリ分けましたけどね・・・