loading...
Cover image for Exploring NestJS Workspace

Exploring NestJS Workspace

santoshyadav198613 profile image Santosh Yadav Updated on ・2 min read

20daysofNestJS (6 Part Series)

1) Getting Started With NestJS 2) Exploring NestJS Workspace 3 ... 4 3) NestJS Controllers Deep Dive 4) Introduction to NestJS Services 5) A Deep Dive Into the NestJS Injection Scope 6) Using in-memory-db With NestJS

In the previous article, we saw why and how to use NestJS, in this article we will go through the NestJS workspace.

NestJS Workspace

NestJS supports 2 modes:

  • Standard Mode
  • monorepo mode

Standard Mode

When we create a new Application using nest new we are using standard mode. In standard mode Typescript's tsc will be used as the compiler. Below is how our App looks like in Standard Mode.

monorepo mode

A monorepo mode is where we have more than one application, generally, it's one App and one Library, we already have App, let's add a Library by using the below command. It will add a new Library project.

nest generate lib shoppingLib

Now as we are in monorepo mode, rather than tsc webpack will be used as a build tool. You can open the nest-cli.json and notice below lines of code being added. compilerOptions has webpack value to true.

{
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "projects": {
    "shopping-lib": {
      "type": "library",
      "root": "libs/shopping-lib",
      "entryFile": "index",
      "sourceRoot": "libs/shopping-lib/src",
      "compilerOptions": {
        "tsConfigPath": "libs/shopping-lib/tsconfig.lib.json"
      }
    }
  },
  "compilerOptions": {
    "webpack": true
  }
}

And After adding a Library the App structure will look like below

Let's go through some important files:
tsconfig.json: The configuration file to be used while running tsc to transpile your files.

  • nest-cli.json: The Nest CLI config file, has a list of projects when we are in monorepo mode, and defines which build tool we are using webpack in monorepo and by default its tsc .
  • main.ts: This is the entry file for our NestJS application and has bootstrap() function to bootstrap our app, by default server runs on Port 3000, you can change it and while using on production we can use an environment variable.
  • app.module.ts: This is our root module, which has registered all modules, controllers, services.
  • app.controller.ts: Our application should have at least one controller defined and this is our default controller.
  • app.service.ts: We can have multiple services in our application this is a sample service added as a part of the workspace, this is optional.
  • Libraries: Libraries can have reusable code like service, pipes, guards or interceptors.

Tool for FullStack App with NestJS

If you are building FullStack Application with Angular/ReactJS and want to use NestJS as a backend you should consider Nx Dev Tools which provides a lot of features. 

Conclusion

We learned about the NestJS workspace and 2 modes which are available and how they differ, and how we can convert our workspace to monorepo mode. We also saw different files are which important and why they are useful. In the next post, we will discuss Controllers and how we can create and configure endpoints.

20daysofNestJS (6 Part Series)

1) Getting Started With NestJS 2) Exploring NestJS Workspace 3 ... 4 3) NestJS Controllers Deep Dive 4) Introduction to NestJS Services 5) A Deep Dive Into the NestJS Injection Scope 6) Using in-memory-db With NestJS

Posted on by:

santoshyadav198613 profile

Santosh Yadav

@santoshyadav198613

GDE Angular and Web Technologies,Open source contributor, Mentor and author for Dotnettricks, Writer AngularInDepth.

Discussion

markdown guide
 

Seems a pity that just because you're adding a library to your project you now suddenly need Webpack and its complexities, instead of just simply TSC. Why?

 

Let me try to explain why it is needed, when we create monorepo these are 2 separate workspaces, both having there own tsconfig so they will be compiled separately, so when build is created the final main.js has to know both or multiple files which are included via a library this is where webpack is required.

 

Right, this is what you would probably solve in Express.js with a separate npm component. But that's arguable more hassle, I'll grant you that. Do you think that Nest.js also has advantages for devs who don't have a background in Angular and or .Net/Java and so on?

Every framework requires has some learning curve, what I like about NestJS is for large enterprise application it provides a clean architecture, you don't have to think which code needs to be added where. While using other frameworks with JavaScript developers do it as per there convenience, every organization may have different way to architect your app, which is challenge when you change the job.

Makes total sense! So, it might be more useful/compelling in a corporate setting than for a solo dev/hobbyist or small scale project. (but maybe even there)