Comment puis-je charger certaines routes uniquement en mode développement. Lorsque je construis avec le mode production activé, je souhaite que ces routes soient désactivées.
Quelqu'un a-t-il de bonnes recommandations sur la façon de réaliser cette fonctionnalité? Par exemple, masquez le composant route2 ci-dessous si vous êtes en mode développement.
const routes: Routes = [ { path: '', component: AdminComponent, canActivate: [AuthGuard], runGuardsAndResolvers: 'always', data: { allowedRoles: ['Role1','Role2'] }, children: [ { path: '', redirectTo: 'dashboard/main', pathMatch: 'full' }, { path: 'route2', loadChildren: './theme/route2/route2.module#route2Module' } ] }
3 Réponses :
Puisque vous utilisez des modules différés , utilisez un guard
(où vous pouvez vérifier l'environnement réel) à l'intérieur du canActivate
.
Puisqu'il s'agit d'un tableau, vous pouvez définir le tableau en fonction de l'environnement dans votre fichier environment.ts.
const routes = [...production route set]; if (!environment.production) { routes.push(...dev route set); }
Lors de l'importation, utilisez simplement le fichier environment.ts car le fileRepleacements
dans angular.json
gérera cela pour vous prêt à l'emploi.
... "configurations": { "production": { "fileReplacements": [ { "replace": "src/environments/environment.ts", "with": "src/environments/environment.prod.ts" ...
Votre implémentation pourrait donc être similaire à:
//environment.ts export const environment = { production: false }; //environment.prod.ts export const environment = { production: true };
Selon le code de votre routeur angulaire:
const routes: Routes = [ { path: '', component: AdminComponent, canActivate: [AuthGuard], runGuardsAndResolvers: 'always', data: { allowedRoles: ['Role1','Role2'] }, children: [ { path: '', redirectTo: 'dashboard/main', pathMatch: 'full' }, { path: 'route2', loadChildren: './theme/route2/route2.module#route2Module', // Don't want to load this module canLoad: [DevEnvGuard] } ] } @Injectable() class DevEnvGuard implements CanLoad { constructor() {} canLoad(route: Route, segments: UrlSegment[]): Observable<boolean>|Promise<boolean>|boolean { return !environment.prod; // if prod = false it will load module } }
Vous essayez d'obtenir un chargement paresseux en utilisant un routeur et vous avez également activé le chargement de modules spécifiques uniquement pour l'environnement de développement (si ma compréhension est correcte). pour ce routeur angulaire fourni un Guard appelé CanLoad . CanLoad est venu jouer lorsque vous ne voulez pas charger des modules spécifiques sur la route pour des raisons de chargement paresseux. Si CanActivate est utilisé pour le Guarding au niveau des composants, mais dans ce cas, il charge le module dans le navigateur.
Modifiez donc le code de cette manière:
const routes: Routes = [ { path: '', component: AdminComponent, canActivate: [AuthGuard], runGuardsAndResolvers: 'always', data: { allowedRoles: ['Role1','Role2'] }, children: [ { path: '', redirectTo: 'dashboard/main', pathMatch: 'full' }, { path: 'route2', loadChildren: './theme/route2/route2.module#route2Module' } ] }
Je pense que c'est l'approche. S'il me manque quelque chose, faites-le moi savoir dans les commentaires.
peut-être que vous pouvez ajouter un autre service à
canActivate
et désactiver l'itinéraire en fonction du modeAjoutez également
AuthGuard
pour le composant enfant. LeAuthGuard
doit être activé en mode Dev.