摘要:面对如何在现有的低版本的框架服务上,运行新版本的前端服务问题,华为云前端推出了一种融合方案,该方案能让独立的Angular项目整体运行在低版本的框架服务上,通过各种适配手段,让Angular项目也能获取到外层框架服务的资源。

华为云前端服务前期采用AngularJs作为框架技术栈,技术较为老旧,性能较差,在华为云快速发展的今天,显然不能满足要求。因此我们必须要升级前端技术栈,使用Angular2+来承载我们的前端服务。GeminiDB作为新服务,也是数据库乃至华为云未来的重点服务,作为前端部分,必须在技术上使用最前沿的框架,以最大地提高用户体验。

但是技术栈的升级不是一蹴而就的,尤其是在华为云,所有的云服务必须在框架服务的底座上运行,而框架服务承载了所有的云服务,如果要进行技术栈升级,必然是一个缓慢的过程。GeminiDB作为华为云服务里的一员,也不可能脱离框架服务而存在。因此存在一个问题,就是如何在现有的低版本的框架服务上,运行新版本的前端服务。

为了解决以上问题,华为云前端推出了一种融合方案,该方案能让独立的Angular项目整体运行在低版本的框架服务上,通过各种适配手段,让Angular项目也能获取到外层框架服务的资源。

底层项目

底层项目使用webpack打包,打包后通过在index.html里引入businessAll.js文件,以该文件为入口启动整个框架服务。

<script type="text/javascript" src="businessAll.js"></script>

在底层框架服务启动后,再渲染出具体云服务内容。

<div class="service-content-view" ui-view ng-animate="{enter:'fade-enter'}"></div>

Angular项目

Angular项目支持独立运行,有单独的index.html,也有单独的main.ts入口。但是如果希望Angular项目运行在底层框架服务上,就必须把Angular项目看作是一个独立的模块,把项目整体引入到底层项目中。因此,我们可以预先把Angular项目编译好,放到底层项目的一个目录下。在运行底层项目时,在index.html里将Angular项目引进来,独立运行。

<link rel="stylesheet" type="text/css" href="{底层项目中Angular项目的路径}/styles.css" />
<script type="text/javascript" src="{底层项目中Angular项目的路径}/runtime.js"></script>
<script type="text/javascript" src="{底层项目中Angular项目的路径}/polyfills.js"></script>
<script type="text/javascript" src="{底层项目中Angular项目的路径}/main.js"></script>

项目融合

底层项目和Angular项目均能独立,但是要让两者融合起来,会遇到以下几个问题:

1.底层项目中如何渲染出Angular项目。

2.Angular项目依赖底层项目的资源,如何保证Angular项目在底层项目运行起来后再运行。

3.如何解决底层项目和Angular项目的路由冲突问题。

渲染Angular项目

底层项目分为两部分,一部分是底层框架服务,另一部分是具体云服务。现在我们要做的是把老的云服务项目替换成新的Angular项目,因此我们可以直接在渲染老的云服务的地方替换成新的Angular项目的渲染容器。

<div class="service-content-view" ui-view ng-animate="{enter:'fade-enter'}"></div>
<app-root></app-root>

底层框架服务对页面渲染上做了一些体验上的优化,因此必须保留原模板中的ui-view,使底层项目正常运行起来,实际上老的云服务项目的渲染内容已经转发到新的Angular项目上面。

Angular项目对底层项目的依赖

底层框架服务给云服务提供了很多公共变量与服务,这些变量和服务是各个云服务必须要使用的,否则云服务将不能正常运作。

启动顺序问题

对于Angular项目来说,要使用底层框架服务提供的内容,首先要求Angular项目在底层项目运行起来之后再运行。这里采用Augular中的APP_INITIALIZER令牌来解决这个问题。APP_INITIALIZER是一个函数,在程序初始化的时候被调用。这里在根模块的providers中以factory的形式来配置。

import { BrowserModule } from "@angular/platform-browser";
import { NgModule } from "@angular/core"; import { AppInitService } from './services/app-init.service';
import { AppComponent } from "./app.component"; @NgModule({
declarations: [AppComponent],
imports: [BrowserModule],
providers: [
AppInitService,
{
provide: APP_INITIALIZER,
useFactory: initializeApp,
deps: [AppInitService],
multi: true
}
],
bootstrap: [AppComponent]
})
export class AppModule {} export function initializeApp(appInitService: AppInitService) {
return (): Promise<any> => {
return appInitService.Init();
};
}

在appInitService里,先获取到底层框架的资源,再进行Angular项目的初始化。

import { Injectable } from '@angular/core';

@Injectable()
export class AppInitService {
constructor() {} Init() {
return new Promise<void>((resolve, reject) => {
// 获取到底层框架服务的资源
resolve();
});
}
}

资源依赖问题

底层项目使用的是AngularJs,Angular项目获取底层框架服务提供的资源不能通过Angular的方式引入,因此需要借助AngularJS的注入器获取在底层框架中注册的服务组件:

static get(inject: string): any {
return (window as any).angular.element('html').injector().get(inject);}
如,要获取 $rootScope:
rootScope = (window as any).angular.element('html').injector().get(‘$rootScope’);

路由冲突问题

Angular项目本身有自己的路由,但是Angular项目是运行在底层框架之上的,Angular项目的路由将会被底层框架所拦截。因此,我们也需要在底层框架的项目中配置相同的路由,以免Angular项目中的有效路由被底层框架识导向为404。

Angular项目路由:

{
path: '',
redirectTo: 'ng2app1',
pathMatch: 'full'
},
{
path: 'ng2app1',
loadChildren: './ng2app1/ng2app1.module#Ng2app1Module',
},
{
path: 'ng2app2',
loadChildren: './ng2app2/ng2app2.module#Ng2app2Module',
} 底层框架路由:
var configArr = [
{
name: 'ng2app1',
url: '/ng2app1'
},
{
name: 'ng2app2',
url: '/ng2app2'
}
];

另外,由于底层项目使用的是hash路由,Angular项目中也要做相应的配置,默认是使用的是PathLocationStrategy,需要切换到hash模式。

import { LocationStrategy, HashLocationStrategy } from '@angular/common';

...
providers: [
{
provide: LocationStrategy,
useClass: HashLocationStrategy
}
]

总结

以上方案是在底层框架升级周期长的前提下的一个临时方案,实际上还是存在着不少的问题。比如底层框架对于老的云服务容器是有统一管理的,老的云服务容器会针对不同的场景能够自适应,而融合方案中的Angular项目则不能;每次启动整个项目时,必须要预先编译好里面的Angular项目,再去启动外层的底层框架,开发效率比较低。因此,后续GeminiDB服务应该在底层框架升级后,尽快适应到新的底层框架体系中,提高服务的可用性和稳定性。

点击关注,第一时间了解华为云新鲜技术~

专家解读:利用Angular项目与数据库融合实例的更多相关文章

  1. 利用angular结合translate为项目实现国际化

    前言 利用H5项目第一版本已经上线,话说有了第一期就有了第二期,这不要为第二期做准备了,老大发话第一件事就要利用Angular JS实现项目的国际化以及后续要借助这个框架来实现其他功能,好吧我表示没怎 ...

  2. [转帖]“剖开” LinuxONE 和 Exadata,架构专家解读里面到底有什么

    “剖开” LinuxONE 和 Exadata,架构专家解读里面到底有什么 http://server.zhiding.cn/server/2018/0914/3111044.shtml    说起I ...

  3. 个人从源码理解angular项目在JIT模式下的启动过程

    通常一个angular项目会有一个个模块(Module)来管理各自的业务,并且必须有一个根模块(AppModule)作为应用的入口模块,整个应用都围绕AppModule展开.可以这么说,AppModu ...

  4. Android(java)学习笔记193:利用谷歌API对数据库增删改查(推荐使用)

    接下来我们通过项目案例来介绍:这个利用谷歌API对数据库增删改查 1.首先项目图: 2.这里的布局文件activity_main.xml: <LinearLayout xmlns:android ...

  5. 专家解读Linux操作系统内核中的GCC特性

    专家解读Linux操作系统内核中的GCC特性   Linux内核使用GNU Compiler Collection (GCC)套件的几个特殊功能.这些功能包括提供快捷方式和简化以及向编译器提供优化提示 ...

  6. spring+mybatis利用interceptor(plugin)兑现数据库读写分离

    使用spring的动态路由实现数据库负载均衡 系统中存在的多台服务器是"地位相当"的,不过,同一时间他们都处于活动(Active)状态,处于负载均衡等因素考虑,数据访问请求需要在这 ...

  7. Angular20 nginx安装,angular项目部署

    1 nginx安装(Windows版本) 1.1 下载安装包 到官网下载Windows版本的nginx安装包 技巧01:下载好的压缩包解压即可,无需安装 1.2 启动nginx 进入到解压目录,点击 ...

  8. Android(java)学习笔记136:利用谷歌API对数据库增删改查(推荐使用)

    接下来我们通过项目案例来介绍:这个利用谷歌API对数据库增删改查 1. 首先项目图: 2. 这里的布局文件activity_main.xml: <LinearLayout xmlns:andro ...

  9. angular项目国际化配置(ngx-translate)

    原文 https://www.jianshu.com/p/7d1da3098625 大纲 1.认识ngx-translate 2.ngx-translate的配置步骤 3.ngx-translate的 ...

随机推荐

  1. Android_适配器(adapter)之ArrayAdapter

    ArrayAdapter是一个很简单的适配器,是BaseAdapter的子类. ArrayAdapter绑定的数据是集合或数组,比较单一.视图是列表形式,ListView 或 Spinner. Arr ...

  2. [JavaWeb基础] 013.Struts2 自定义类型转换器

    很多时候,我们在做web开发的时候经常要用到时间的转换器,Struts2给我们提供了一种类型转换器的接口.下面我们讲讲怎么实现吧. 1.首先我们要定义一个类型转换的类,继承自com.babybus.s ...

  3. [Objective-C] 005_Category(类别)

    Category的实际作用就是为已有的类来添加方法.为现有的类添加的方法可以先不用实现,在需要的时候再实现也是可以的.在我们的实际代码中如何来实现Category的呢?我们上篇的Person 类为例. ...

  4. MVC案例之新增与修改Customer

    新增Customer 添加的流程Add New Customer 超链接连接到 newcustomer.jsp新建 newcustomer.jsp: 在 CustomerServlet 的 addCu ...

  5. java方法句柄-----5.Method Handles in Java

    Method Handles in Java 目录 Method Handles in Java 1.介绍 2.什么是MethodHandle 3. Method Handles vs Reflect ...

  6. Linux (五) VIM编辑器

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.简介 ​ Linux系统环境下的一款非常重要的文本编辑工具,我们在Linux环境下几乎所有的文本文件 ...

  7. Java实现 蓝桥杯VIP 算法训练 开心的金明

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元钱 ...

  8. Java实现 蓝桥杯VIP 算法提高 贪吃的大嘴

    算法提高 贪吃的大嘴 时间限制:1.0s 内存限制:256.0MB 问题描述 有一只特别贪吃的大嘴,她很喜欢吃一种小蛋糕,而每一个小蛋糕有一个美味度,而大嘴是很傲娇的,一定要吃美味度和刚好为m的小蛋糕 ...

  9. Java实现 洛谷 P1009 阶乘之和

    import java.util.Scanner; public class 阶乘之和 { public static void main(String[] args) { Scanner sc = ...

  10. java实现第三届蓝桥杯地址格式转换

    地址格式转换 [编程题](满分21分) Excel是最常用的办公软件.每个单元格都有唯一的地址表示.比如:第12行第4列表示为:"D12",第5行第255列表示为"IU5 ...