A while back, a client asked me “how can I share business logic between services in a Node.js monorepo?”. The TL;DR of it is:
- Encapsulate the shared business logic into modules, and put them in a separate folder.
- In the Lambda handler functions, reference the shared modules using relative paths.
- Use webpack to resolve and bundle them into the deployment package. If you use the Serverless framework, then check out the serverless-webpack plugin. For example:
(if webpack is not your thing then also check out the newer serverless-esbuild plugin which can achieve the same thing)
- Deploy every service on every commit. You can do this with a simple script like the following.
To see how everything fits together, check out this demo repo. It has CI/CD set up already through drone.io and you can see a recent deployment of all the services in the monorepo here.
But wait! How do I choose between having a monorepo vs a repo per service?
Don’t worry, I’ve got you covered for that too ;-) You can read about my thoughts on the two approaches here.