Angular路由配置是怎样,预加载和懒加载有何用
Admin 2022-05-20 群英技术资讯 855 次浏览
这篇文章主要介绍“Angular路由配置是怎样,预加载和懒加载有何用”,有一些人在Angular路由配置是怎样,预加载和懒加载有何用的问题上存在疑惑,接下来小编就给大家来介绍一下相关的内容,希望对大家解答有帮助,有这个方面学习需要的朋友就继续往下看吧。
NgModule作为Angular模块的核心,下面首先就来讲一讲。
1、@NgModule的作用:
2、@NgModule结构说明:
@NgModule({
declarations: [], //属于当前模块的组件、指令及管道
imports: [], //当前模板所依赖的项,即外部模块(包括httpModule、路由等)
export:[],//声明出应用给其他的module使用
providers: [], //注入服务到当前模块
bootstrap: []//默认启动哪个组件(只有根模块才能设置bootstrap属性)
})3、懒加载说明
(1)RouterModule对象提供了两个静态的方法:forRoot()和forChild()来配置路由信息。
forRoot()//在主模块中定义主要的路由信息forChild()``//应用在特性模块(子模块)中(2)懒加载:loadChildren
此处并没有将对应的模块加入到AppModule中,而是通过loadChildren属性,告诉Angular路由依据loadChildren属性配置的路径去加载对应的模块。这就是模块懒加载功能的具体应用,当用户访问 /xxx/** 路径的时候,才会加载对应的模块,这减少了应用启动时加载资源的大小。 loadChildren的属性值由三部分组成:
(3)预加载
在使用懒加载的情况下,路由第一次加载某个模块时,有时反应有延迟。这时就可以用预加载策略来解决这个问题。
Angular提供了两种加载策略,
PreloadAllModules-预加载NoPreloading-没有预加载(默认)。RouterModule.forRoo()的第二个参数可以添加配置选项,配置选项中就有一个是preloadingStrategy配置,这个配置是一个预加载策略配置。
//使用默认预加载-预加载全部模块
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { routes } from './main.routing';
import { RouterModule } from '@angular/router';
import { PreloadAllModules } from '@angular/router';
@NgModule({
declarations: [AppComponent],
imports: [ BrowserModule, RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules }) ],
providers: [],
bootstrap: [AppComponent] })
export class AppModule { }但是,我们更喜欢自己去控制对模块的预加载,这时就需要自定义预加载策略
A、自定义-5秒后加载所有模块
在app组建的同级新建一个custom-preloading-strategy.ts文件
import { Route } from '@angular/router';
import { PreloadingStrategy } from '@angular/router';
import { Observable } from 'rxjs/Rx';
export class CustomPreloadingStrategy implements PreloadingStrategy {
preload(route: Route, fn: () => Observable<boolean>): Observable<boolean> {
return Observable.of(true).delay(5000).flatMap((_: boolean) => fn());
}
}在app.modules.ts的providers中注入
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { HomeComponent } from './home/home.component';
import { routes } from './main.routing';
import { RouterModule } from '@angular/router';
import { CustomPreloadingStrategy } from './preload';
@NgModule({
declarations: [
AppComponent,
HomeComponent
],
imports: [
BrowserModule,
RouterModule.forRoot(routes, { preloadingStrategy: CustomPreloadingStrategy })
],
providers: [CustomPreloadingStrategy ],
bootstrap: [AppComponent]
})
export class AppModule { }B、自定义-指定模块预加载
在app组建的同级新建一个selective-preloading-strategy.ts文件(需要在app-routing.module.ts中的providers注入,然后在路由中定义的data通过附加参数来设置是否预加载)
import { Injectable } from '@angular/core';
import { PreloadingStrategy, Route } from '@angular/router';
import { Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/of';
@Injectable()
export class SelectivePreloadingStrategy implements PreloadingStrategy {
preloadedModules: string[] = [];
preload(route: Route, load: () => Observable<any>): Observable<any> {
if (route.data && route.data['preload']) {
return load();
} else {
return Observable.of(null);
}
}
}app-routing.module.ts(此文件懒加载与预加载相结合)
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { CanDeactivateGuard } from './guard/can-deactivate-guard.service';
import { SelectivePreloadingStrategy } from './selective-preloading-strategy'; // 预加载
import { PageNotFoundComponent } from './not-found.component';
const appRoutes: Routes = [
{ path: '', redirectTo: 'home', pathMatch: 'full'},
{ path: 'mian', loadChildren: './main/mian.module#MainModule' }, // 懒加载(在这个层级的router配置文件及module文件都不需要引入该组建)
{ path: 'home', loadChildren: './home/home.module#HomeModule', data: { preload: true } }, // 懒加载 + 预加载
{ path: '**', component: PageNotFoundComponent } // 注意要放到最后
];
@NgModule({
imports: [
RouterModule.forRoot(appRoutes,{
enableTracing: true, // <-- debugging purposes only
preloadingStrategy: SelectivePreloadingStrategy // 预加载
})
],
exports: [
RouterModule
],
providers: [
CanDeactivateGuard,
SelectivePreloadingStrategy
]
})
export class AppRoutingModule { }4、子路由创建步骤(没有靠指令创建,直接手动)
(1)新建主文件夹
目录main
main.component.html
main.component.scss
main.component.ts
main.module.ts
main-routing.module.ts
main.service.ts
比如在上面main.component.html有个区域用于放子视图(以下我都先讲思路,再放关键代码,其他不赘述)
<div>下面的区域是另一个路由出口</div> <router-outlet></router-outlet><!--此处依照下面的路由配置,默认显示AComponent组件的内容-->
(1)、在main-routing.module.ts里面配置文件夹main下的路由,需要引用各组件的component(需要配置路由的组件)
import {NgModule} from '@angular/core';
import {RouterModule, Routes} from '@angular/router';
import {MainComponent} from './main.component';
import{AComponent} from './A/A.component';
import{BComponent} from './B/B.component';
const mainRoute: Routes = [
{
path: '',
component: MainComponent,
data: {
title: '面试预约',
},
children: [
{
path: '',//path为空表示默认路由
component: AComponent,
data: {
title: '大活动',
}
},
{
path: 'activity',
component: BComponent,
data: {
title: '中活动',
}
}
]
}
];
@NgModule({
imports: [
RouterModule.forChild(mainRoute)
],
exports: [
RouterModule
]
})
export class MainRoutingModule{
}(2)、main.service.ts一般用于放http请求
import { AppService } from './../../app.service';
import { Observable } from 'rxjs/Observable';
import { Injectable } from '@angular/core';
import { HttpParams } from '@angular/common/http';
import { PageData, ActivitysManage } from './model/activitys-manage';
import { BehaviorSubject } from 'rxjs';
import {PageDataBig, ActivitySmall, PageDataSmall } from './model/activitys-manage';
@Injectable()
export class MainService {
}main文件夹下的组件如要调用MainService,需要在组件的ts文件引入MainService
(3)、在main.module.ts中引入各组件(包括自身、路由配置文件所用到的所有组件以及路由的module)
import { FormsModule } from '@angular/forms';
import { CommonModule } from '@angular/common';
import { MainComponent } from './interview-appointment.component';
import { AComponent } from './A/A.component';
import { BComponent } from './B/B.component';
import { NgModule } from '@angular/core';
import { CoreFrameCommonModule } from '../../common/common.module';
import { MainRoutingModule } from './main-routing.module';
import { NgZorroAntdModule } from '../../zorro/ng-zorro-antd.module';
import { MainService } from './interview-appointment.service';
@NgModule({
imports: [FormsModule,CoreFrameCommonModule, CommonModule, MainRoutingModule,NgZorroAntdModule],
exports: [],
declarations: [MainComponent,AComponent,BComponent],
providers: [MainService],
})
export class MainModule{ }
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
在vue开发中,难免遇到各种表单校验,下面这篇文章主要给大家介绍了关于vue表单验证rules及validator验证器使用的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
假设是使用nodejs+express3这个经典的组合。那么有一种非常方面的处理回调函数异常的方法:1.安装模块:express-domain-middleware2.增加例如以下的代码:app.use(require('express-domain-middleware'));app.use(functionerrorHandler(err,req,res,next){
这篇文章主要介绍如何实现vue打开新窗口并传参,实现的具体功能就是打开一个新的窗口展示页面,同时需要传参数,但是参数不能显示在地址栏,而且刷新页面后,传的参数不会丢失。下面通过图文形式给大家分享一下如实现上述操作。
本篇文章给大家带来了关于javascript的相关知识,其中主要整理了Number对象的相关问题,Number 对象是原始数值的包装对象,Number 创建方式 new Number(),下面一起来看一下,希望对大家有帮助。
这篇文章主要介绍了解决js中的setInterval清空定时器不管用问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008