¿Cuál es la diferencia entre canLoad
y canActivate
?
export interface Route {
path?: string;
pathMatch?: string;
matcher?: UrlMatcher;
component?: Type<any>;
redirectTo?: string;
outlet?: string;
canActivate?: any[];
canActivateChild?: any[];
canDeactivate?: any[];
canLoad?: any[];
data?: Data;
resolve?: ResolveData;
children?: Routes;
loadChildren?: LoadChildren;
}
¿Cuándo debería cuál de ellos?
canActivate
en el escenario anterior, ¿cuál será la diferencia?canActive
módulo (F12> Fuentes - en Chrome). Puede ver los archivos .js allí.ConcanLoad
estos módulos (archivos .js) no se cargarán :) Verifique mi respuesta anterior donde lo expliqué mejorcanLoad
devuelve verdadero y luego cierra la sesión de la aplicación? Ahora, un usuario que no es administrador inicia sesión en el mismo navegador, ¿cómo funciona? ¿El módulo cargado fue desalojado o eliminado de la caché?Esta es una prueba que hice en ambos guardias con un módulo de funciones que se carga de forma diferida:
1. Prueba CanActivate Guard
Notará en la parte inferior de la página de Red que realizó 24 solicitudes con un tamaño de 9.5 MB transferidas terminando en 3.34 segundos y completamente cargadas en 3.47 segundos.
1. Prueba CanLoad Guard
aquí verá la gran diferencia cuando usamos CanLoad Guard ya que el navegador hizo solo 18 solicitudes con un tamaño de 9.2 MB transferidas terminando en 2.64 segundos y completamente cargado 2.59 segundos.
CanLoad Guard nunca carga los datos del módulo si el usuario no está autorizado y eso le da más rendimiento ya que el tiempo de carga disminuyó casi 1 segundo y eso es un tiempo enorme en la carga de páginas web, sin duda depende del tamaño del módulo.
fuente
Con respecto a la pregunta de los comentarios en otra publicación "Si uso canActivate en el escenario anterior, ¿cuál será la diferencia?"
En realidad, para el usuario no habrá diferencia, no tendrá acceso a la página en ambos casos. Aunque hay una diferencia oculta . Si presiona F12 y se mueve a Fuentes (en Chrome) donde están los archivos de descarga. Luego puede ver que en caso de que se haya descargado el archivo canActive con código ( chunk.js ). Incluso si no tiene acceso a la página.
Pero en el caso de canLoad, no habrá ningún archivo chunk.js con código fuente.
Como puede ver, esto tiene un gran impacto en la seguridad.
Y, por supuesto, no olvide que canLoad solo se puede usar para módulos LazyLoaded .
fuente
debugger;
declaración en el constructor para uno de los componentes de ese módulo. Luego puede ver si se cargó como un fragmento separado o se incluyó en un módulo como main. Si tiene referencias a componentes en un módulo diferido que no están aislados de ese módulo, es posible que se cargue de todos modos. Si ve esto, sugiere que está filtrando por algo que no sea archivos JS, o necesita dividir su módulo perezoso en partes comunes y 'verdaderamente perezosas'.loadChildren
propiedad como parte de la ruta a su módulo perezoso.canActivate se utiliza para evitar que un usuario no autorizado
canLoad se utiliza para evitar que todo el módulo de la aplicación
Ejemplo de canActivate :
Ejemplo de canLoad :
fuente
loadChildren
. Además, una versión reciente de angular es ..loadChildren: () => import('./user/user.module').then(m => m.UserModule)
El CanLoad Guardia evita que la carga del módulo cargado perezoso. Generalmente usamos esta protección cuando no queremos que un usuario no autorizado navegue a alguna de las rutas del módulo y también se detenga y luego incluso vea el código fuente del módulo.
El Angular proporciona canActivate Guard, que evita que usuarios no autorizados accedan a la ruta. Pero no impide que se descargue el módulo. El usuario puede utilizar la consola de desarrollo de Chrome para ver el código fuente. CanLoad Guard evita que se descargue el módulo.
En realidad, CanLoad protege la carga de un módulo, pero una vez que se carga el módulo, CanLoad guard no hará nada. Supongamos que hemos protegido la carga de un módulo utilizando CanLoad guard para usuarios no autenticados. Cuando el usuario inicie sesión, ese módulo será aplicable para ser cargado y podremos navegar por las rutas secundarias configuradas por ese módulo. Pero cuando el usuario cierra la sesión, aún el usuario podrá navegar por esas rutas secundarias porque el módulo ya está cargado. En este caso, si queremos proteger las rutas de los niños de los usuarios no autorizados, también necesitamos utilizar CanActivate guard.
Utilice CanLoad antes de cargar AdminModule:
Después de cargar AdminModule, en el módulo AdminRouting podemos usar CanActive para proteger a los niños de usuarios no autorizados como a continuación:
fuente
canActivate si un usuario no autorizado ingresa aún carga ese módulo. necesita canLoad para juzgar si es necesario cargarlo.
fuente
Es importante notar que canLoad no impedirá que alguien obtenga su código fuente. El .js no se descargará mediante el navegador a menos que el usuario esté autorizado, pero puede forzar una descarga manual emitiendo una importación ('./ xxxxx.js') en la consola del navegador.
El nombre del módulo se puede encontrar fácilmente en main.js en la definición de rutas.
fuente