使用Angular cli升级AngularJS项目——(一)引导Angular混合应用
栏目: JavaScript · 发布时间: 5年前
内容简介:都9102年了,笔者所在的公司的主要项目还是用AngularJS 1.6这种史诗的框架进行开发的。另外由于历史的原因,代码的凌乱程度早已超越想象。为此,笔者决定痛下决心把整个项目重构了一遍...从此踏上了Angular升(跳)级(坑)之路。先说说升级前后的变化:项目管理:gulp -> gulp + Angular CLI
都9102年了,笔者所在的公司的主要项目还是用AngularJS 1.6这种史诗的框架进行开发的。另外由于历史的原因,代码的凌乱程度早已超越想象。为此,笔者决定痛下决心把整个项目重构了一遍...从此踏上了Angular升(跳)级(坑)之路。
先说说升级前后的变化:
项目管理:gulp -> gulp + Angular CLI
框架:AngularJS 1.6 -> AngularJS 1.6 + Angular 7
应用结构:多个AngularJS应用 -> 主项目:Angular、卫星项目:AngularJS
这个系列文章中涉及到
- Angular与AngularJS如何共存开发
- 使用Angular Cli编译及开发Angular、AngularJS混合应用
---下面是坑,待填 - 如何在Hash模式中同步AngularJS、Angular的路由
- 在gulp或其他自动化构建 工具 中使用Angular CLI
- 在Angular中使用AngularJS的组件
- 在AngularJS中使用Angular的组件
本文使用的例子项目
AngularJS的例子项目 angular-phonecat
为什么升级为Angular框架
在笔者公司内部,大部分新项目已经开始使用Vue进行开发。笔者也更加倾向于Vue简单、优雅的开发形式,较为符合前端(浪荡)的开发模式。同时对于新手而言Vue更加容易上手。但对于笔者手上的项目而言,升级为Angular是为数不多可行的方案:
- 渐近式升级
由于项目年代久远,项目涉及到了公司各个业务的方方面面。难以在短时间内完成全部的重构工作。在重构的同时,也需要兼顾到新业务的开发。(曾经这个项目在多个大佬的带领下重构过,但无一幸免的全部夭折)。为此,选择升级为Angular的第一考量的对象就是是否可以“在原有的基础上进行重构”,而Angular官方提供的@angular/upgrade
则很好的解决了这个问题。直至完全重构为止,旧的代码仍能直接运行在项目中,不受重构的影响。 - 更加严谨的开发 在改造前的项目中包含了几个5000+行的文件,每次添加都非常“蛋疼”,出现这种问题的主要原因就是在这几年间,都没有对项目提交代码进行规范,同时也没有进行Code Review等操作。使用TypeScript可以让一部分Freshman放弃他们浪荡的代码风格。此外,对于太过烂的代码, Angular甚至不能让其编译通过 。这种框架以及语言特性决定了Angular更加擅长于开发更加严谨的项目。
当然,Vue也能使用TypeScript,经过规范的Vue编码风格也能使其变得更严谨,前提是你得忍受编辑器对vue中的ts语言的支持:)
一、前期准备
检查你的项目是否包含Angular cli无法支持的编译特性。
在笔者公司项目中,使用gulp作为项目管理工具。其中包含了 gulp-file-include
在html文件中引入其他html片段的插件,但是如果使用Angular cli(以下简述为:ng cli)作为项目编译开发工具,这些过程是不能被支持的。因此,应当先将它们去除。
安装Angular CLI
笔者使用的是yarn:
yarn global add @angular/cli 复制代码
如果你是使用npm:
npm i @angular/cli -g 复制代码
二、新建一个种子项目
Angular的迭代更新速度是有目共睹的,笔者建议直接新建一个种子项目,而非直接复制本文提及的依赖关系。
具体的使用方法见官方文档
运行完毕后,将以下文件复制到你的项目中:
- package.json
若项目中已存在package.json你可以直接复制与angular有关的依赖。"dependencies": { "@angular/animations": "~7.1.0", "@angular/common": "~7.1.0", "@angular/compiler": "~7.1.0", "@angular/core": "~7.1.0", "@angular/forms": "~7.1.0", "@angular/platform-browser": "~7.1.0", "@angular/platform-browser-dynamic": "~7.1.0", "@angular/router": "~7.1.0", "core-js": "^2.5.4", "rxjs": "~6.3.3", "tslib": "^1.9.0", "zone.js": "~0.8.26" }, "devDependencies": { "@angular-devkit/build-angular": "~0.11.0", "@angular/cli": "~7.1.2", "@angular/compiler-cli": "~7.1.0", "@angular/language-service": "~7.1.0", "typescript": "~3.1.6" } 复制代码
- tsconfig.json。typescript配置文件
- angular.json。angular配置文件
- src 目录。angular源码文件夹,你可以将其放到你的项目中适当的地方。
三、添加升级依赖
在种子项目中,是不包含AngularJS升级模块的,你需要手动添加该模块。
yarn add @angular/upgrade 复制代码
四、将AngularJS的js、style交给angular cli管理
AngularJS的引入方式一般有两种形式
-
使用了模块化的 如果本身已经使用了模块化的编程,那么你要做的就是移除原本的模块引导器(如SystemJs等)、在index.html中移除ng-app。并在main.ts中import AngularJS入口文件即可。
注意:你或许还需在
tsconfig.json
中加入:"compilerOptions": { ... "allowJs": true, ... } 复制代码
-
一般引入形式的 如果项目中使用的是传统引入形式,你需要将他们全部删除掉,并在angular.json中
projects -> porjectName -> architect -> build
中的styles
、scripts
属性添加相应的样式、js文件。在此添加的文件,angular cli会在编译、开发过程中,进行合并压缩操作。然后在index.html中将ng-app
移除。
添加assets文件夹
在AngularJS中,存在一些如 templateURL
等,需要从服务器加载的内容。因此,我们需要在angular.json中映射源代码文件夹,使它能在 serve
的过程中,能被访问到。
具体路径:angular.json projects -> porjectName -> architect -> build -> assets
五、在index.html中添加angular的入口
<app-root></app-root>
是angular的入口标记,你可以将其添加至index.html中合适的位置,一般为了结构一致,会放在与AngularJS相邻的地方。
六、引导AngularJS模块
到这里,你已经可以使用 ng serve
进行开发了。但实际上,如果此时开始运行的话,在页面中只会有Angular模块的内容,没有AngularJS模块的内容。
实际上,js的脚本已经通过ng cli进行处理,并合并为scripts.js,但由于在此前的操作中,我们将AngularJS的ng-app指令移除了。为此我们需要在angular加载过程中手动加载AngularJS模块。
app.module.ts
import { BrowserModule } from '@angular/platform-browser'; import { NgModule, DoBootstrap, ApplicationRef } from '@angular/core'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { UpgradeModule } from '@angular/upgrade/static'; @NgModule({ declarations: [ AppComponent ], entryComponents: [AppComponent], imports: [ BrowserModule, AppRoutingModule, UpgradeModule ], providers: [], }) export class AppModule implements DoBootstrap { constructor(private upgrade: UpgradeModule){} // 手动接管加载进程 ngDoBootstrap(appRef: ApplicationRef) { this.upgrade.bootstrap(document.documentElement, ['phonecatApp']); // 引导AngularJS模块 appRef.bootstrap(AppComponent) // 引导Angular模块 } } 复制代码
七、大功告成
现在运行 ng serve
就可以看到同时运行Angular、AngularJS的页面了!
(未完待续)
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
python学习手册(原书第5版)
马克·卢茨 / 机械工业出版社 / 2018-10 / 219
如果你想动手编写高效、高质量并且很容易与其他语言和工具集成的代码,本书将快速地帮助你利用Python提高效率。本书基于Python专家的流程培训课程编写,内容通俗易懂。本书包含很多注释的例子和插图,以帮助你开始使用Python2.7和3.3。每章都包含关于Python语言的重要组成部分的一节课。本书主要内容:了解Python的主要内置对象类型,如数字、列表和字典;创建和处理对象的Python语句,......一起来看看 《python学习手册(原书第5版)》 这本书的介绍吧!