资讯专栏INFORMATION COLUMN

angular1.x和angular2+并行,angular1.x 升级 angular2+方案

Olivia / 2062人阅读

摘要:可以在不必打断其它业务的前提下,升级应用程序,因为这项工作可以多人协作完成,在一段时间内逐渐铺开,下面就方案展开说明主要依赖提供模块。在混合式应用中,我们同时运行了两个版本的。这意味着我们至少需要和各提供一个模块。

angular1.x 升级 angular2+ 方案

我给大家提供的是angular1.x和angular5并行,增量式升级方案,这样大家可以循序渐进升级自己的应用,不想看文字直接demo入手migration-from-angular1.x-to-angular2Plus

方案1:主体为angular1.x,逐步将angular1.x当中service、component、filter、controller、route、dependencies升级为angular5

方案2: 主体为angular5,将项目所有js文件先进行一次加工,采用ES6的方式将每个js文件module
export出来,再逐步将内容向angular5靠近

我建议选择方案1增量式升级,通过在同一个应用中一起运行这两个框架,并且逐个把AngularJS的组件迁移到Angular中。 可以在不必打断其它业务的前提下,升级应用程序,因为这项工作可以多人协作完成,在一段时间内逐渐铺开,下面就方案1展开说明

Hybrid APP主要依赖Angular提供upgrade/static模块。后面你将随处可见它的身影。以下手把手教你将angular1.x迁移到angular2+

1、调用 UpgradeModule 来引导 AngularJS

在AngularJS中,我们会把AngularJS的资源添加到angular.module属性上。 在Angular中,我们会创建一个或多个带有NgModule装饰器的类,这些装饰器用来在元数据中描述Angular资源。在混合式应用中,我们同时运行了两个版本的Angular。 这意味着我们至少需要AngularJS和Angular各提供一个模块。要想引导混合式应用,我们在应用中必须同时引导 Angular 和 AngularJS。要先引导 Angular ,然后再调用 UpgradeModule 来引导 AngularJS。

从HTML中移除ng-app和ng-strict-di指令, 创建一个app.module.ts文件,并添加下列NgModule类:

import { UpgradeModule } from "@angular/upgrade/static";
@NgModule({   
  imports: [  
    UpgradeModule
  ]
})
export class AppModule {
  constructor(private upgrade: UpgradeModule) { }    
  ngDoBootstrap() {
    this.upgrade.bootstrap(document.body, ["yourAngularJsAppName"], { strictDi: true });
  }
}

用AppModule.ngDoBootstrap方法中启动 AngularJS 应用,现在我们就可以使用 platformBrowserDynamic.bootstrapModule 方法来启动 AppModule 了。

main.ts:

import {AppModule} from "./app/app.module";
import { platformBrowserDynamic } from "@angular/platform-browser-dynamic";

platformBrowserDynamic().bootstrapModule(AppModule)
  .catch(err => console.log(err));

我们就要开始运行AngularJS+5的混合式应用程序了!所有现存的AngularJS代码会像以前一样正常工作,但是我们现在也同样可以运行Angular代码了

2、将项目中的services逐步升级为angular5

我们将username-service.js里面的内容升级为username-service.ts:

import { Injectable } from "@angular/core";
@Injectable() 
export class UsernameService {
  get() {
    return "nina"
  }
}

要在angular1.x中使用UsernameService,先创建一个downgrade-services.ts文件,这里将会存放所有angular5服务降级后在angular1.x中使用的服务

downgrade-services.ts:

import * as angular from "angular";
import { downgradeInjectable } from "@angular/upgrade/static";
import { UsernameService  } from "./services/ username-service "; 
angular.module("yourAngularJsAppName")
  .factory("UsernameService", downgradeInjectable(UsernameService));

完成这两步之后UsernameService就可以在angular1.x controller component service等注入使用了,在angular5中的使用方法这里就不举例了,按照angular5的使用方法来就行

3、项目中的filter逐步升级为angular5的pipe,同时angular1.x的filter依然保留

由于filter的性能问题angular2中已经将filter改为pipe,angular团队没有提供filter升级为pipe,或者pipe降级为filter的module,所以angular1.x中使用filter,angular中使用pipe,filter的升级放在component之前,因为component的template可能会用到

username-pipe.ts:

import { Pipe, PipeTransform } from "@angular/core";
Pipe({
  name: "username"
})
export class usernamePipe implements PipeTransform { 
  transform(value: string): string {
    return value === "nina" ? "张三" : value;
  }
}

4、将项目中的component逐步升级为angular5的component

我们将hero-detail.js里面的内容升级为hero-detail.ts:

import { Component, EventEmitter, Input, Output, ViewContainerRef } from "@angular/core";
import { UsernameService } from "../../service/username-service";
@Component({
  selector: "hero-detail",
  templateUrl: "./hero-detail.component.html"
})
export class HeroDetailComponent {
  Public hero: string;
  
  constructor(private usernameService: UsernameService) {
      this.hero = usernameService.get()
  }
}

要在angular1.x中使用hero-detail component,先创建一个downgrade-components.ts文件,这里将会存放所有angular5组件降级后在angular1.x中使用的组件

downgrade-components.ts:

import * as angular from "angular";
import { downgradeComponent } from "@angular/upgrade/static";
import { HeroDetailComponent } from "./app/components/hero-detail/hero-detail.component";
angular.module("yourAngularJsAppName")
  .directive("heroDetail", downgradeComponent({ component: HeroDetailComponent }) as angular.IDirectiveFactory)

现在你可以在angular1.x中的template中使用hero-detail组件了,组件之间通讯的问题按照angular5的接口写

5、将angular1.x controller改成angular5 component

现在就剩下controller了,angular2已经取消了controller,controller可以把它当成一个大的component,所以我们按照component的方法重构controller,并且对新的component降级,controller重构之后我们需要修改路由,我们现在使用的还是angular1.x的路由,基本上一个路由对应的是一个controller,这个时候路由可以这样修改:

假设有个TestContentCtrl,对应的路由是test

.state("test", {
  url: "/test",
  controller: "TestContentCtrl",
  controllerAs: "vm",
  templateUrl: "./src/controllers/test-content-ctrl.html"
 })

在TestContentCtrl改成test-content component后

.state("test", {
  url: "/test",
  template: ""
 })

6、第三方插件或者库解决方案

关于项目中引用基于angular1.x的插件或者库,基本都能找到angular2+的版本,可以将angular2+的版本引入进行降级处理就可以在angular1.x中使用了,但是~~~, angular2+的版本很多API都改了,angular1.x中的对应使用方法可能不存在了,这里有两种解决方案

引入angular2+的版本,删除angular1.x版本,降级后在angular1.x应用中用到该插件的都检查一次,运用angular2+的版本的API使用该插件

引入angular2+的版本,保留angular1.x版本,angular1.x应用使用angular1.x版本插件,
angular5应用使用angular2+版本插件,

方案2增加了项目的体积,相同的插件引用了两个版本。在不影响首屏加载时间的情况下方案2是不错的选择,因为一次性将所有插件或者库的API全部过一遍,工作量比较大容易出错,也不符合我们增量式升级的初衷

现在项目中所有的内容基本都升级为angular5了,我们可以删除downgrade-services.ts和downgrade-components.ts这两个文件了,同时将路由升级为angular5,删除angular1.x相关的库和插件,一个完整的angular5应用就诞生了

如果不是很明白直接看demo:migration-from-angular1.x-to-angular2Plus,喜欢点个赞哟~~~

分享个问题:

如果import angular保错了,你可以考虑引入@types/angular

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107203.html

相关文章

  • Angular1.x + TypeScript 编码风格

    摘要:组件还包含数据事件的输入与输出,生命周期钩子和使用单向数据流以及从父组件上获取数据的事件对象备份。 说明:参照了Angular1.x+es2015的中文翻译,并将个人觉得不合适、不正确的地方进行了修改,欢迎批评指正。 架构,文件结构,组件,单向数据流以及最佳实践 来自@toddmotto团队的实用编码指南 Angular 的编码风格以及架构已经使用ES2015进行重写,这些在Angul...

    ytwman 评论0 收藏0
  • Angular 2 快速上手

    摘要:为了简单起见,在本文中将会使用。已经实例化了并且将它的模板载入到了元素中。中的依赖注入发生在该类的构造函数中,因此我们将在构造函数中注入。 国内 Angular2 资料比较少,这里看到一篇不错的入门文章就分享过来了 —— Angular 2 快速上手,这里面还有很多有关于 Angular2 的文章,感兴趣的朋友可以去看一看 目前angular2已经来到了beta版,这意味着它已经做好了...

    singerye 评论0 收藏0
  • 使用 ES2015 开发 Angular1.x 应用指南

    摘要:他们即不是指令,也不应该使用组件代替指令,除非你正在用控制器升级模板指令,组件还包含数据事件的输入与输出,生命周期钩子和使用单向数据流以及从父组件上获取数据的事件对象。 showImg(https://segmentfault.com/img/bVynsJ); 关键词 架构, 文件结构, 组件, 单向数据流以及最佳实践 来自 @toddmotto 团队的编码指南 Angular 的编码...

    Andrman 评论0 收藏0
  • webpack 教程资源收集

    学习的过程中收藏了这些优秀教程和的项目,希望对你有帮助。 github地址, 有不错的就更新 官方文档 中文指南 初级教程 webpack-howto 作者:Pete Hunt Webpack 入门指迷 作者:题叶   webpack-demos 作者:ruanyf 一小时包教会 —— webpack 入门指南 作者:VaJoy Larn   webpack 入门及实践 作者:...

    Backache 评论0 收藏0
  • angular 1.x多项目共享子项目实践之路

    摘要:可发布这一部分会在下一章管理对子项目引用中详细说明。总结本文总结了多项目共享子项目工程化方面的一些实践,并不涉及到复杂的代码,主要涉及到的概念,使用进行包管理,使用作为自动化工具等工程化的知识。 背景 公司的产品线涵盖多个产品,这些产品中会有一些相同的功能,如登录,认证等,为了保持这些功能在各个产品中的一致性,我们在各个产品中维护一份相同的代码。这带来了很大的不便:当出现新的需求时,不...

    mist14 评论0 收藏0

发表评论

0条评论

Olivia

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<