Angular - (lazy-loading) dynamicznie doładowywane moduły

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 3071 razy

W Angularze możliwe jest tworzenie modułów dynamicznie doładowywanych. Takie rozwiązanie jest dobre, gdy np. dany użytkownik ma dostęp tylko do jednego modułu (z podmodułami włącznie) zaś do innych nigdy nie będzie mógł zajrzeć. Wtedy to pobieranie modułów, które i tak nie będą wykorzystywane mija się z celem. W Angulrze 9 można wykorzystać jedynie najnowszy sposób dynamicznego doładowania modułów, którego przykład wygląda następująco:

const routes: Routes = [ { path: 'customers', loadChildren: () => import('./customers/customers.module').then(mod => mod.CustomersModule) // dynamiczne ładowanie modułu },

Starszy sposób już nie obsługiwany przez Angulara 9:

const routes: Routes = [ { path: 'customers', loadChildren: () => import('./lazy/lazy.module').then(m => m.LazyModule) // dynamiczne ładowanie modułu w starym stylu },

Jeżeli migrujesz z starszej wersji Angulara, to do wykorzystania nowego sposobu dynamicznego ładowania musisz być pewny, że konfiguracja pliku tsconfig.json pola module jest ustawiona na wartość esnext:

{ "compileOnSave": false, "compilerOptions": { "baseUrl": "./", "outDir": "./dist/out-tsc", "sourceMap": true, "declaration": false, "module": "esnext", // ta wartość powinna być ustawiona na esnext "moduleResolution": "node", "emitDecoratorMetadata": true, "experimentalDecorators": true, "importHelpers": true, "target": "es2015", "typeRoots": [ "node_modules/@types" ], "lib": [ "es2018", "dom" ] } }

Jest to spowodowane tym, że do działania nowszego sposobu dynamicznego doładowywania modułu potrzebna jest obsługa nowszego standardu ES. Po zmianie tego pola konieczne będzie przeinstalowanie projektu:

npm i

W przypadku dynamicznego doładowywania nie należy importować takich modułów w innych modułach. Import odbywa się bowiem w pliku routingu. Sam dynamicznie doładowywany moduł może wyglądać np. tak:

const routes: Routes = [ { path: '', component: CustomerListComponent, children: [ { path: 'View-1', component: View1 }, { path: 'View-2', component: View2 }, { path: '**', redirectTo: 'View-1' } ] } ];
Propozycje książek