I like the concept of feature modules since it usually nicely
encapsulates things. So let’s say we have a PrivacyModule
that contains a component PrivacyStatementComponent and a
PrivacyPageComponent. When going to the privacy page I’d
want to lazily load the privacy module since it’s not needed everywhere.
But when I then also want to use the
PrivacyStatementComponent in another place (e.g. on the
SignUpPage) I cannot just import PrivacyModule
in the SignupModule since it has attached to it the
routing.
Here’s an example of the problem: https://stackblitz.com/edit/reuse-lazy-loading-fail .
So what can you do to solve this problem?
It is not directly possible to reuse components from
lazy loaded modules that are used with
RouterModule.forChild(routes). By simply moving those
components to another module which is not directly used for routing you
can solve the problem. Here are two flavours of how to structure
this.
Option 1: SharedModule
An often suggested option is to move components that are reused by
different modules to a so called SharedModule. This shared
module is then usually imported in all feature modules.
Option 2: Make a dedicated module for routing
If you want to preserve the “feature scoping” and not just stuff everything into a shared module, you can make two modules: One that does the routing and a second one that exports the reusable components.
PrivacyRoutingModule # Does the lazy loading for `/privacy`
PrivacyModule # Exports the PrivacyStatementComponent so it can be reused
Working example: https://stackblitz.com/edit/reuse-lazy-loading-success
On the plus side you won’t have an ever-growing
SharingModule, on the other hand you’ll start introducing
quite a few modules if you always have 2 modules for every lazy loaded
route.
Conclusion
While you cannot reuse components from a module that includes a
RouterModule.forChild(routes), you can always resort to
just moving those components into their own module. There are different
possibilities to structure those non-routing modules, we’ve covered the
SharedModule and more feature oriented modules here.