Angular modules (ngModules) are a source of confusion for Angular developers. This short guide will clarify what they are and how to think about ngModules
in general.
Why ngModules?
Angular uses a Typescript compiler and a template compiler that turns our HTML templates into Javascript instructions to render the DOM in a browser.
The Typescript compiler knows how to compile our Typescript code (all our classes) because all dependencies have to be imported in these Typescript files:
Compiling the HTML template for the above component is a different task because *ngIf
is not imported anywhere in our Typescript code. Yet, the Angular compiler must know about all directive/component/pipe dependencies of a component’s template to turn all that HTML into DOM instructions.
The solution to that problem was the introduction of ngModules
. ngModules
expose features meant to be used by the template compiler and does so in a “global” way, in the sense that importing an ngModule
once is enough to enable all its code for all components within that module.
That’s why we rarely think twice about using ngFor
or ngIf
or any pipe: They are all part of CommonModule
, which is automatically imported into the AppModule
by default:
Do I need to create ngModules in my app?
Most likely, no. The Angular team introduced standalone components as an alternative to ngModules
. A standalone component does not need such modules because all its dependencies are listed in the Typescript code itself:
There were only two reasons why you’d need to create your own ngModules in the past:
- You needed to share many components/directives/pipes/services as a library. Packaging those in an
NgModule
was the only option. - You needed to lazy-load a bunch of features to improve performance.
That’s it. Both of these problems are solved by standalone components, which can be lazily loaded and already bring all their dependencies along, so no ngModule
is needed.
What about core, shared, and feature modules?
Those were parts of guidelines created for the sake of consistency within Angular applications. But you don’t need these modules for your application to work. You can still organize your code neatly in folders and sub-folders and not use ngModules. You can even have tidy, short import statements without having ngModules
.
Usually, the more ngModules you create, the more work and problems you’re likely to encounter (circular dependencies, anyone?), which is why the Angular team introduced standalone components and already migrated all its internal directives and pipes to standalone. In the long run, ngModules will likely disappear.