返回顶部
首页 > 资讯 > 前端开发 > html >分析Angular中的预加载配置、懒加载配置
  • 816
分享到

分析Angular中的预加载配置、懒加载配置

2024-04-02 19:04:59 816人浏览 八月长安
摘要

本篇内容主要讲解“分析angular中的预加载配置、懒加载配置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分析Angular中的预加载配置、懒加载配置”吧!N

本篇内容主要讲解“分析angular中的预加载配置、懒加载配置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分析Angular中的预加载配置、懒加载配置”吧!

分析Angular中的预加载配置、懒加载配置

NgModule作为Angular模块的核心,下面首先就来讲一讲。

1、@NgModule的作用:

  • NgModule 最根本的意义是帮助开发者组织业务代码,开发者可以利用 NgModule 把关系比较紧密的组件组织到一起,这是首要的。

  • NgModule 用来控制组件、指令、管道等是否可以使用,处于同一个 NgModule 里面的组件默认互相可见,而对于外部的组件来说,只能看到 NgModule 导出( exports )的内容,也就是说,如果你定义的 NgModule 不 exports 任何内容,那么外部使用者即使 import 了你这个模块,也没法使用里面定义的任何内容。

  • NgModule 是打包时候用到的最小单位,打包的时候会检查所有 @NgModule 和路由配置,Angular底层是使用webpack打包。因为Angular已经帮我们配置好了WEBpack,所以开发者轻松很多,否则就需要自己配置环境。

  • NgModule 是 Router 进行异步加载的最小单位,Router 能加载的最小单位是模块,而不是组件。当然,模块里面只放一个组件是允许的,很多组件库都是这样做的。【相关教程推荐:《angular教程》】

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的属性值由三部分组成:

  • 需要导入Module的相对路径

  • #分隔符

  • 导出模块类的名称

(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

    • B.component.ts

    • B.component.scss

    • B.component.html

    • A.component.ts

    • A.component.scss

    • A.component.html




    • 目录B




    • 目录A

比如在上面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{ }

到此,相信大家对“分析Angular中的预加载配置、懒加载配置”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 分析Angular中的预加载配置、懒加载配置

本文链接: https://lsjlt.com/news/85161.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 分析Angular中的预加载配置、懒加载配置
    本篇内容主要讲解“分析Angular中的预加载配置、懒加载配置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分析Angular中的预加载配置、懒加载配置”吧!N...
    99+
    2024-04-02
  • Angular中模块和懒加载的示例分析
    这篇文章主要介绍Angular中模块和懒加载的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、Angular 内置模块二、Angular 自定义模块当我们项目比较小的时候可以不用自定义模块。但是当我们项目非...
    99+
    2023-06-06
  • webpack的懒加载和预加载详解
    目录正常加载懒加载预加载没有使用预加载使用预加载总结正常加载 为了看的方便,index.js中的代码非常简单 console.log('index.js执行了') import ...
    99+
    2024-04-02
  • SpringBoot配置的加载流程详细分析
    在上一篇Springboot启动流程解析中我们没有张开对配置的解析,因为篇幅过大,需要单独在起一篇文章来讲。 且看一下两行代码: ApplicationArguments appli...
    99+
    2023-01-06
    SpringBoot配置加载流程 SpringBoot配置加载原理SpringBoot配置加载
  • python加载properties配置
    参考来源:http://blog.csdn.net/bobzhangshaobo/article/details/47617107 我们都是在java里面遇到要解析properties文件,在python中基本没有遇到这中情况...
    99+
    2023-01-31
    加载 python properties
  • Android APN的配置和加载
    APN简介 APN指一种网络接入技术,是通过手机上网时必须配置的一个参数,它决定了手机通过哪种接入方式来访问网络。对于手机用户来说,可以访问的外部网络类型有很多,例如:Internet、WAP网站,集团企业内部网络、行业内部专用网络。而不...
    99+
    2023-09-06
    java 网络 数据库 android
  • Springboot自动加载配置的原理解析
    目录1、springboot自动配置的原理初探2. 补充扩展(解释为什么引用的包都报红错了,项目还能启动)3、又一个问题总结1、springboot自动配置的原理初探 以下注解都在...
    99+
    2024-04-02
  • Spring 加载多个xml配置文件的原理分析
    目录示例spring-configlication.xml:spring-config-instance-factory.xmljava示例代码实现AbstractRefreshab...
    99+
    2024-04-02
  • Angular2中模块懒加载的示例分析
    这篇文章主要介绍了Angular2中模块懒加载的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。当项目变得复杂庞大以后,如果所有页面都...
    99+
    2024-04-02
  • Hibernate中怎么加载配置文件
    本篇文章给大家分享的是有关Hibernate中怎么加载配置文件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在向大家详细介绍Hibernate加载配置文件之前,首先让大家了解下...
    99+
    2023-06-17
  • Spring加载加密的配置文件详解
    本文实例为大家分享了Spring加载加密的配置文件,供大家参考,具体内容如下一、继承并实现自己的属性文件配置器类public class EncryptPropertyPlaceholderConfigurer extends Proper...
    99+
    2023-05-31
    spring 加载 加密
  • vue项目常用加载器及配置的示例分析
    这篇文章主要介绍了vue项目常用加载器及配置的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:1.安装sass:1.1 由于...
    99+
    2024-04-02
  • SpringBoot加载读取配置文件过程详细分析
    目录配置文件的读取顺序多坏境的配置文件个性化配置自定义配置文件名称和路径加载yml文件springboot默认读取的配置文件名字是:“application.proper...
    99+
    2023-01-28
    SpringBoot加载配置文件 SpringBoot读取配置文件
  • Django加载配置的过程详解
    目录一. Django服务启动 manage.py二. 引入配置三. 加载配置一. Django服务启动 manage.py os.environ.setdefault("DJANG...
    99+
    2024-04-02
  • MyBatis实现配置加载的步骤
    目录前言正文总结前言 在原始MyBatis的使用中,使用MyBatis时会先读取配置文件mybatis-config.xml为字符流或者字节流,然后通过SqlSessionFacto...
    99+
    2023-05-19
    MyBatis 配置加载
  • Windows配置文件加载失败
    有几个常见的原因可能导致Windows配置文件加载失败:1. 配置文件损坏:配置文件可能因为病毒感染、硬件故障或错误的操作而损坏。在...
    99+
    2023-09-12
    Windows
  • @ConfigurationProperties加载外部配置方式
    目录@ConfigurationProperties加载外部配置@ConfigurationProperties与@EnableConfigurationProperties总结@C...
    99+
    2023-03-13
    @ConfigurationProperties @ConfigurationProperties配置 @ConfigurationProperties加载外部配置
  • @Scheduled fixedDelayString 加载properties配置方式
    目录@Scheduled fixedDelayString 加载properties配置@Scheduled执行原理解析一:前言二:@Scheduled使用方式三:@Schedule...
    99+
    2024-04-02
  • SpringCloudAlibabaNacosConfig加载配置详解流程
    目录1、加载节点2、NacosPropertySourceLocator的注册3、加载3.1、加载share3.2、加载extention3.3、加载主配置文件1、加载节点 Spri...
    99+
    2024-04-02
  • @ConfigurationProperties加载外部如何配置
    这篇文章主要介绍了@ConfigurationProperties加载外部如何配置的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇@ConfigurationProperties加载外部如何配置文章都会有所收获,...
    99+
    2023-07-05
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作