Angular 4 系列(一)初识 Angular

5,267 阅读9分钟

本文是 Angular 系列的第一篇,只是站在一个更高的视角来对 Angular 做一些说明和对比,文章不会涉及到任何编码(下一篇才会涉及到编码),只是让各位初学者先对 Angular 有一个基本的认识,比如 Angular 是什么?Angular 的架构是什么样的?Angular 提供了哪些特性等等。如有说得不对的地方欢迎大家指正。

Angular 目前有两个比较大的版本,一个是 1.5,一个是 4.0,对于 2.0 以下的版本统称为 AngularJS,从 2.0 版本开始称为 Angular。

谈谈 AngularJS

先从 AngularJS 说起,AngularJS 是 Google 在 2012 年发布的一个MVVM框架,提供了非常多的特性,这些特性在在当时来说是相当酷,并且大胆的,也是 AngularJS 流行的原因。

  • AngularJS 优点
  1. 双向数据绑定
    AngularJS 提供了强大的数据双向绑定功能,再也不需要使用 JS 或者 jQuery 来操作 DOM 元素,大大减少了前端的代码量。
  2. 完善的体系,提供一整套 WEB 开发的解决方案
    包括模板、数据双向绑定、路由、指令、过滤器、模块化、服务(可复用)等特性,基本上前端需要用的东西都可以从这个框架里面找到,减少选择性疲劳。
  3. 引入后端语言的一些概念
    单元测试、依赖注入等等
  • AngularJS一些问题
  1. 性能
    导致这个问题的主要原因是 AngularJS 的“双向数据绑定”,也是很多人吐槽的一个点,“双向数据绑定”是一把”双刃剑“,在 AngularJS 作用域里面的任何修改都会触发“脏值检测”,比如$scope.name = 'AngularJS'这段代码会触发“脏值检测”,AngularJS 会遍历作用域里面的所有变量,每一个变量都会被检测是否发生改变,有变化就会把值从视图同步到模型,或者模型到视图的同步,如果页面使用大量的双向数据绑定,页面就会可能出现卡顿现象,这个是历史遗留的原因,这样的做法的好处是可以兼容低版本浏览器,比如 IE8,不过 AngularJS 1.3 开始就不再支持 IE8;双向数据还会导致另一个问题,就是数据的流向很模糊,比如你就想把数据单向的从view同步到model,除非自己加注释明确说明,不然关从代码层面是看不出,这使得代码的后期维护成本非常高。
  2. 作用域
    什么是作用域?如果我把它说成是“上下文”不知道会不会好理解一点,用过 AngularJS 的人就会发现,AngularJS 几乎封装了所有原生的 JS API,使用它封装后的 API 才会触发“脏值检测”,比如使用原生setInterval(callback, time)定时器,不会触发“脏值检测”,导致开发者需要手动调用 AngularJS 底层的接口触发“脏值检测”,比如$scope.$apply()或者 $scope.digest(),这两个都是一样的,$scope.$apply()会调用 $scope.$digest(),因此 AngularJS 封装了$interval服务来解决这个问题,使用原生 JS 事件,都需要这么做。鉴于作用域的各种问题,在新版的 Angular 中,作用域($scope)这个东西已经不复存在。
  3. 低配版路由
    页面只能配置一个 ng-view,这让 AngularJS 路由使用起来非常局限,导致很多人都使用第三方路由组件 ui-route 来替代官方的 ng-route,ui-route 通过嵌套视图来复用一些通用的部件,而第三方的 ui-route 个人觉得也不是很好用,别人的东西用起来就是不爽。新版 Angular 的路由已经解决了这个问题。
  4. JS 语言本身
    灵活又有很多坑的语言,又爱又恨难舍难分,网上有很多人讨论过 JavaScript,口水战也不少;Angular 选择使用微软的 TypeScript,TypeScript 是 JavaScript 的超集,是 JavaScript 的强类型版本,可以编译成 JavaScript,编译器将会去掉 JavaScript 本身没有的东西,所以 TypeScript 并不依赖于浏览器的支持,也并不会带来兼容性问题。与 TypeScript 结合之后,使 Angular 更加适合开发大型项目。
  5. 表单
    AngularJS 对于表单的校验和错误消息提示能力非常薄弱,Angular 提供了非常完善的表单校验和消息提示功能,比如 Angular 提供了响应式表单。
  6. 学习成本
    AngularJS 存在非常多的概念,模块、控制器、模板、过滤器、服务、组件、指令、双向数据绑定、作用域、依赖注入等,这些对于初学者很不友好,而且你还很难准确指出 AngularJS 的核心是什么,如果谈到 React 的核心是什么,很多人很容易就会想到“虚拟 DOM”、“组件”。新版的 Angular 的核心就是组件,语法上使用一种更加优雅的装饰器注解来整合代码。

Angular 特性

  1. AngularCLI命令行工具
    开发者可以使用这个工具来快速搭建一个项目的脚手架,熟悉 Vue 的人就会知道 vue-cli,功能类似,只不过 AngularCLI 做得更加彻底,AngularCLI 创建的代码骨架包办了项目的运行、构建、打包、代码风格检测、测试等,统一约定所有的配置,而 vue-cli 在这一方面会比较灵活,不能说 AngularCLI 这种方式不好,这取决不同人对不同事情的考虑。
  2. 服务端渲染
    可以针对每个视图做 SEO 优化。
  3. 移动和桌面应用兼容
    可以借助 NativeScript、ReactNative 之类的框架,可以很容易地使用 Angular 开发出跨平台的手机应用,Angular 还提供了一个官方的 UI 库 Angular Material,可以在移动应用和桌面应用使用 Google Material 风格通用的 UI 组件。

前面已经对 AngularJS 和 Angular 做了很多对比,介绍了 Angular 的很多特性,并且针对 AngularJS 的一些问题,介绍了 Angular 的一些改进,那些特性都被之后的 Angular 继承下来,新版的 Angular 语法更加优雅,功能更加强大。

AngularJS 与 Angular架构

前面我们已经从特性的角度对 AngularJS 和 Angular 做了很多对比了,接下来我们从架构的角度来对比。

  • AngularJS 架构

    AngularJS 架构

    AngularJS 是一个典型的 MVC 架构,用户通过点击按钮,输入框等操作与视图进行交互,这些操作会被视图通知到控制器,控制器会修改或者查询底层的数据模型,数据模型可能会跟服务器产生一些交互来获取或修改资源,最后数据模型把修改反馈到视图,用户可以立刻看到自己所做的这些操作和视图反馈的结果,这就是 AngularJS 的基本架构。

  • Angular 架构

    Angular 架构

    Angular 采用了完全不同的架构,Angular 整个应用就是一颗组件树,用户看到的是这颗组件树上某几个被激活的组件视图,用户可以通过一些操作,从一个页面路由到另一个页面,用户还可以跟视图进行交互,这些交互由组件本身提供,组件通过依赖注入来引入一些服务来做一些操作,或者跟服务端产生一些通信。

通过这两张图相信大家应该对 Angular 应用有了一个基本认识。

与其它流行框架进行对比

与 React 对比

  • 速度
    提到 React 的第一反应就是快,因为 React 采用了一种特别方式来操作 DOM,也就是虚拟 DOM;在性能方面,React 只会在 setStaus 的时候才会去更新 DOM,而且 React 是先修改虚拟 DOM,然后再与实际的 DOM 进行对比,最后再修改真实 DOM,一个是修改的内容少,一个是修改 DOM 的次数少,所以速度特别快;Angular 也实现了一个类似的变更检测机制算法,速度已经跟 React 不相上下。
  • FLUX 架构
    React 提出了 FLUX 架构 这个概念,使 React 更加专注于组件化和数据单向流更新,单向数据流使得数据的流向非常清晰,降低代码维护成本,而且还可以直接使用ES6语法,通过 Webpack 这样的打包工具编译成兼容性更好的 ES5。这些以前 AngularJS 是没有的,不过现在Angular已经全部支持了,比如数据单向绑定、组件化。
  • 服务器端渲染
    SPA 的一个缺陷是对 SEO 不友好,因为搜索引擎的爬虫依赖的是服务端响应的内容,不会去解析 JS 再爬取页面的内容,而 React 是可以支持服务器端渲染,通过服务端预渲染机制动态生成页面再返回到客户端,这个 Angular 以前是没有的,现在也已经支持服务端渲染。

React 的定位是一个 UI 组件库,相当于 MVC 里面的 V,它并不是 WEB 的解决方案,React 专注于代码结构和组件间通信,开发大型项目通常需要搭配其它一些库来使用,比如 Redux,Redux 适合多交互,多数据源的应用场景,不然只会增加应用的复杂性,即使配套 Redux 也不能完全说是一个框架,类似 Promise 这样的东西还需要自己找第三方实现,而 Angular 提供了一整 WEB 套解决方案,基本上不需要为了某一功能模块而去使用第三方实现,而如果你只需要专注于 UI层,那么 React 是一个非常好的选择。

与 Vue 对比


Vue 是由国内的大牛 尤雨溪 开发,并由 Vue 团队维护的一个框架,中文文档支持完善;Vue 官网已经有与 Angular2 对比的介绍,无论从文件大小、上手难度、执行效率,Vue 都略优于 Angular, 还有人已经在 Github 基于一些基准,测试了很多主流 JavaScript 框架的操作时间 ,这里我只是针对个人主观的想法来对于这两个框架的对比,很多优势随着时间推移会被削弱,也可能距离会被拉大。

  • 简单
    Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件,而且 Vue 是由国内的大牛尤雨奚开发的,Vue 官方中文文档 完善,这一点 Angular 直到 2.0 才慢慢完善中文文档,目前 Angular 官网中文文档 覆盖率已经超过80%,而且还支持中英文对照。
  • 性能
    最新版本的 Vue 更加优越,根据上面提供的对比数据来看,Angular4 稍稍比 Vue 慢了一点点。
  • 个人主导
    Vue 是由国内的大牛尤雨奚主导,Angular 是由 Google 主导,个人主导的项目,对于今后项目的维护和经费开销还有有点担心,而这对于 Google 来说完全不是事。
  • 社区
    Angular 在世界上有庞大的开发者社区和配套的生态环境,Vue 目前跟 Angular 相比还是有一些差距。

Angular 和 Vue 都是非常棒的框架,都非常值得去学习的框架,虽然我很佩服 Vue 的“模仿能力“。

总结


到这里,我们已经对比了 AngularJS 和 Angular 的特性以及阐述 Angular 针对 AngularJS 的问题做的一些改进,紧接着我们还了解了 AngularJS 和 Angular 的基本架构,最后通过与一些流行的组件库(React)和 MVVM 框架(Vue)进行对比,来了解 Angular 的现状,相信读者此时已经对Angular的整体架构和特性有一个基本了解,在接下来的系列文章中,会逐渐剖析 Angular 的知识点,跟大家一起学习 Angular 4。