nx/docs/angular/guides/misc-lazy-loading.md
Kristopher Betz 1edb44af90 docs(nx): fix lazy loading command
The command to create a lib with lazy loading incorrectly had the tribute --router instead of --routing
2019-09-25 09:25:06 -04:00

150 lines
4.1 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Lazy Loading Libraries
You can use libraries across the app using two strategies:
1. **Eager Loading**: Loads libs when the app is bootstrapped.
2. **Lazy Loading**: Loads libs when the app needs them.
### Lazy Loading
Even a medium size application has code that doesn't need to load until later. Lazing loading this code help with the bundle size, as a a result, with the startup time of your application.
To learn how to use lazy loading, run `ng g @nrwl/angular:lib todo-list-shell --routing --lazy --parentModule=apps/todos/src/app/app.module.ts`.
_**Explanation**_
- **--routing**: Add router configuration.
- **--lazy**: Add `RouterModule.forChild` when set to true, and a simple array of routes when set to false.
- **--parentModule**: Updates the parent module.
```treeview
myorg/
├── apps/
│   ├── todos/
│   ├── todos-e2e/
│   └── api/
├── libs/
│ └── todo-list-shell/
│      ├── jest.conf.js
│      ├── src/
│      │   ├── lib/
│      │   │ ├── todo-list-shell.module.spec.ts
│      │   │ └── todo-list-shell.module.ts
│      │   └── index.ts
│      ├── tsconfig.app.json
│      ├── tsconfig.json
│      ├── tsconfig.spec.json
│      └── tslint.json
├── nx.json
├── package.json
├── tools/
├── tsconfig.json
└── tslint.json
```
`todo-list-shell.module.ts`:
```typescript
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule } from '@angular/router';
@NgModule({
imports: [
CommonModule,
RouterModule.forChild([
/* {path: '', pathMatch: 'full', component: InsertYourComponentHere} */
])
]
})
export class FeatureShellModule {}
```
### Add Component
Now add a component to the newly created todo-list-shell library:
```bash
ng g component main --project=todo-list-shell
```
```treeview
myorg/
├── apps/
│   ├── todos/
│   ├── todos-e2e/
│   └── api/
├── libs/
│ └── todo-list-shell/
│      ├── jest.conf.js
│      ├── src/
│      │   ├── lib/
│ │ │ ├── todo-list/
│ │ │ │ ├── todo-list.component.css
│ │ │ │ ├── todo-list.component.html
│ │ │ │ ├── todo-list.component.spec.ts
│ │ │ │ └── todo-list.component.ts
│      │   │ ├── todo-list-shell.module.spec.ts
│      │   │ └── todo-list-shell.module.ts
│      │   └── index.ts
│      ├── tsconfig.app.json
│      ├── tsconfig.json
│      ├── tsconfig.spec.json
│      └── tslint.json
├── nx.json
├── package.json
├── tools/
├── tsconfig.json
└── tslint.json
```
Next, update the `TodoListShellModule` to use the component:
```typescript
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule } from '@angular/router';
import { TodoListComponent } from './todo-list/todo-list.component';
@NgModule({
imports: [
CommonModule,
RouterModule.forChild([
{ path: '', pathMatch: 'full', component: TodoListComponent }
])
]
})
export class TodoListShellModule {}
```
### Changes in AppModule
The schematic already modified `app.module.ts` by adding a lazy route with the loadChildren property.
```typescript
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
// You can add multiple routes as your needs
const routes: Routes = [
{
path: 'list',
loadChildren: () =>
import('@myorg/todo-list-shell').then(m => m.TodoListShellModule)
}
];
@NgModule({
declarations: [AppComponent],
imports: [BrowserModule, RouterModule.forRoot(routes)],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule {}
```