Packaging NestJS Modules for NPM Installs
Create and package NestJS modules and push them to the npm registry. Now you can npm install them anywhere and start using them straight away!
We've been using NestJS for a long time at Entrostat, and we've found that there is base functionality that we like to share between projects. Some of this functionality is specific to our company, so it's not as simple as running
npm install --save [package name]... or is it?
This article runs through the creation of a NestJS module that you can install and import into your project and start using it in the same way that you'd use any other
npm installs. I've also added a more advanced example when you need to inject a service that needs configuration options because I didn't see that in the official docs.
For the simple example, I'm going to create a Random Number module where it provides a service that returns a random number between
y (specified on the initialisation of the module).
Once that example has been implemented, I'm going to make a more advanced example where I send in parameters that are used in a second service that reuses the first service but modifies the output. In this more advanced example, I'm going to show how to construct a service that requires dependency injection and additional configuration options that cannot be injected in.
Random Number Module
Let's create a new project from scratch and run through the structure from scratch,
tsconfig.json file has been created in your root directory, paste the following
json data into the file,
Now that the project has been created and configured, let's create a
src folder and add our files,
Cool, so let's add code to each of these files,
You're now nearly ready to publish your first
npm package! We just need to edit our
package.json to make sure that the library gets pushed to the right place,
Now if you run
npm run build, it should create a
dist folder with a number of
.js files in it.
You're ready to publish :)!!! So the next step is to log in to
npm using the
npm login command and after that run
Installing and Using Your Module
Now that the new
nestrand module has been created on
npm, we can import it into an existing application and use it, imagine we're editing an
AppModule in another project. We'd first run
npm install --save nestrand and once that's added our import would look as follows,
It's as easy as that, you can now inject the
RandomNumberService into any of your services and controllers and call the
The More Advanced Example
The above example is quite simple because the
RandomNumberService does not require any dependency injection, so it was easy to make in the
forRoot(...) function in the module. However, what do we do when a service does require dependency injection as well as configuration options?
We're going to modify the project a bit to make this example work. Let's add a
Logger service to the
Okay so we need to pass the
Logger service into the
RandomNumberService when we call the
forRoot function, but where do we get the
We can use a factory to create and inject the correct services and we can wrap the factory in a function to add additional options during runtime,
So here you can see that calling the function
randomNumberServiceFactory returns a factory that creates the
RandomNumberService, but it constructs the service with the
options object. When the module is initialised, the service is created using these options, and everything works as expected.
I hope this shows everything you need to know around creating a NestJS module and publishing it to
npm. The simple example has covered all of the details around publishing the package and the configurations required. The advanced example should also help you when you're in a jam where you'd like to initialise services with certain configuration values, but they also require dependency injection.
So get publishing :)!
There are existing projects out there that you can use to start developing faster and more efficiently! Take a look at https://github.com/nestjsx/package-starter for a great example. Once you understand the example I gave, I'd suggest that you use this package starter because they've added a lot of additional functionality that is very useful.