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.
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.