2017 年 8 月

第 32 卷,第 8 期

作者 Ted Neward | 2017 年 8 月

Ted Neward我们又见面了,MEAN 用户们。

我是在两年前开始撰写这一有关 MEAN(Mongo、Express、Angular、Node)堆栈的特殊系列专栏。正如必然要发生一样,自我开始撰写此系列专栏以来,MEAN 堆栈的各个部分都有了很大的发展。大多数更新(特别是 Node、Express 和 Mongo 版本)都是透明的,几乎不需要采取任何措施:只需升级基础部分,一切便可以正常运作。

不过,Angular 更新在一段时间内引起了 Web 前端界的一些关注,特别是因为 AngularJS (v1) 和 Angular(v2 及更高版本)之间的实质性变化造成了一些严重的向后兼容性问题。(我在本文中笼统使用“向后兼容性”一词,因为有关 v1 到 v2 的向后兼容性问题实质上可以总结为“整篇重写吧,相信我们,这会是一次很棒的体验!”)因此,Angular 的首个重大更新在 Angular 界引起了一些恐慌,当此更新作为主版本增强发布时,用户的焦虑加剧了。

这样,当我们忙于编写示例应用程序的前端时,Angular 团队做了他们应该做的事情,即向全世界发布了新版 Angular。也就是说,现在可以抽出一点时间,勇敢地承担这份艰难的工作,将应用程序升级到新版 Angular v4。(Angular 团队已决定跳过 3,直接迁移到 4。) 剧透警告:事实证明,这份工作远没有人们想象的那么痛苦,人们可以对今后发布的 Angular 更新寄予厚望。这一点很不错,因为 Angular 团队已承诺,发布节奏将会更加符合传统开放源代码项目。坦率地说,这意味着,许多小型增量升级的发布速度(每 6 个月发布一次)要比目前的常规发布速度快得多。

升级 Angular

从根本上说,升级到 Angular 4 意味着使用节点包管理器 (npm),将 npm 包更新为使用最新版本。这需要使用再熟悉不过的“npm install”命令形式,将版本标记 (“@latest”) 用于各个包,并使用“--save”参数将最新版本捕获到应用程序的 package.json 文件。对于运行 *nix 系统(通常为 Linux 或 macOS)的用户,采用以下命令形式,所有代码都应该在同一行输入:

npm install @angular/{common,compiler,compiler-cli,core,forms,http,platform-browser,platform-browser-dynamic,platform-server,router,animations}@latest typescript@latest --save

借助 *nix 命令行界面,可以在“{“/”}”对下捕获各个包,即使从技术角度来讲每个包都被命名为“@angular/common”、“@angular/compiler”等。对于运行 Windows 的用户,采用以下稍长一点的版本:

npm install @angular/common@latest @angular/compiler@latest @angular/compiler-cli@latest @angular/core@latest @angular/forms@latest @angular/http@latest @angular/platform-browser@latest @angular/platform-browser-dynamic@latest @angular/platform-server@latest @angular/router@latest @angular/animations@latest typescript@latest --save

执行完“npm install”后,从各方面来讲,升级已完成。只需使用“ng serve”再次运行应用程序,一切都应该会恢复到正常运行状态。

从 Angular 2 升级到 4 时的棘手问题

Angular 团队已承认,并不总能平稳过渡到新版本。不过,发行说明谨慎指出,主要难题(显然)在于动画的本地使用,我尚未探索过此主题。具体来说,团队从 @angular/core 中删除了动画,并将动画放入它自己的节点包 @angular/animation 中(可以参阅前面的“npm install”命令)。这样一来,如果应用程序不使用动画,核心包中就不会包含动画代码了。

Angular 4 新功能

Angular 4 发行说明完整介绍了新增功能,但有几点特别值得一提。

首先,Angular 团队将重心放在减少 Angular 库的大小/权重占地上。显然,这样做益处颇多,尤其对于与世界其他地区没有高速光纤连接的用户。Angular 团队表示,他们还没有完成,因此预计连续发布的各个 Angular 版本将会力求进一步减少占地。

同样,Angular 团队减少了视图模板的幕后生成代码的总大小,最高减少了 60%。这再一次表明,生成的应用程序将会变得更小更轻。

其次,团队改进了视图模板中分别用于分支和迭代方案的“*ngIf”和“*ngFor”指令。虽然还没见过这些不明显的指令新功能,但很快就会发觉,请坚持下去。

最后,Angular 团队还为 Angular 库引入了最新版 TypeScript (2.2),其中包括改进后的可为空检查、在一定程度上优化了对 ECMAScript (ES) 2015 式组合的类型支持,以及表示 TypeScript 中所有已声明类型的基类型的“对象”类型(类似于 System.Object 在大多数 .NET 代码中起到的作用)。这隐式地提供了对 TypeScript 2.1 的支持,它本身也具备一些有趣的功能,如“keyon”运算符、映射类型(提供实用工具类型 Partial、Readonly、Pick 和 Record),并且支持 ES 2015 中的“spread”和“rest”运算符。所有这些都远远超出了 Angular 本身的范围,但可以参阅任何精彩的 TypeScript 教程(或 TypeScript 网站本身),了解它们的用途。从根本上说,这些不会改变在编写 Angular 时写入的代码,至少不会马上改变,但随着这些功能在 Angular 库中的使用频率变高,它们可能会开始属于 Angular API 外围应用范畴。不过,这种情况暂时不会发生。所以,目前,最需要注意的是,Angula 与 TypeScript 发展步调保持一致。

总结

希望我已经帮助大家认识到,此次升级几乎不需要采取任何措施,这是最好的版本更新。更重要的是,随着 Angular 应用程序不断发展,将它们更新为最新版 Angular 需要完成的工作非常容易(从目前来看是这样)。

怎样算是 MEAN:已有两年历史

撰写这篇专栏文章时,MSDN 杂志**主编 Michael Desmond 指出,“如何成为 MEAN”系列专栏已有 2 年的历史了。为什么我还在深入探究 MEAN 领域? 部分原因是,此系列专栏针对的主题相当大,一切应有尽有,从前端到数据存储的 REST API 中间件平台,而不仅仅是库或框架。但部分原因与 MEAN 堆栈本身的性质有关。

可以发现,MEAN 平台不同于 .NET Framework 平台,不同之处并不在于提供的服务,因为两者都包含编程语言、用于接收已提交 JSON 数据的 HTTP 库/框架、用于访问数据库的驱动程序等。相反,不同之处在于它们不提供的服务。也就是说,在 Node.js 平台基础之上生成的 MEAN 平台强调“简约”,而 .NET 平台则不是。

这听起来可能有点像另一个平台:从某方面来讲,Node.js 并不是“完全定制”或 .NET“太过繁复”。 这样的价值判断并不是有意作出的。事实上,.NET 源自 Microsoft,并继续受到 .NET Framework 团队多年来生成内容的大力推动;Node.js 平台已通过数百个团队和全世界数千名开发者生成的库连接在一起。每种方法都有利有弊,但这并不是我要探究的方向。

其实,用户可以自行决定使用这两个平台中的哪一个。就在两年前,有一种想法荒唐可笑,就是将 Microsoft 打造成一个平台,供开发者使用 .NET 或 Node.js(或甚至 Java/PHP),以便在 Microsoft OS(或云平台)上或附近生成应用程序。有迹象表明,虽然 Microsoft 可能会实现这种“所有平台平等创建”的理念,但公司的历史表明,我们可能会提供 .NET 在这些平等创建的平台中成为首选的方法。

考虑一下这一点:MEAN 堆栈中的“A”表示 Angular。在我开始撰写此系列专栏时,Angular 并不是如今功能强大的富客户端单页应用程序 (SPA) 平台,只是可能会在 JavaScript 前端领域下的几个潜在赌注之一。用户对 Angular 的兴趣明显增加,本杂志页面上收录了大量 Angular 参考资料,不仅包含本专栏文章,也包含其他人撰写的功能信息。

值得注意的是,用户感兴趣的是由团队编写的开放源代码前端技术,该团队不为 Microsoft 工作,而是为 Microsoft 的竞争对手提供服务。然而,此技术使用的是 Microsoft 开发的开放源代码 TypeScript 语言。这足以让大家头昏眼花。

就很多方面而言,MEAN 堆栈和本杂志中介绍的 MEAN 清楚地阐明了“新 Microsoft”理念。 出色地演示了 Microsoft 2017 与 Microsoft 2007 或 2000 的完全不同之处。重视竞争不重视协作与社区的 Microsoft 早就不存在了。今天摆在我们面前的公司当然会竞争,但不会与社区竞争。Microsoft 2017 希望大家使用自己选择的技术堆栈,最好是在云或 OS 范围内使用,但如果有其他选择,那也需要大家自己选择。

最后要说的是,MEAN 堆栈“仅”由三个部分(MongoDB、Angular 和 Node.js/Express)组成,这三个部分可以与彼此互操作。Microsoft 对此的接受和支持,表明事物一直在发展演变,已与以往大相径庭了。

这多少会让大家好奇,接下来的几年里,我们又会看到什么,不是吗? 祝您工作愉快!


Ted Neward 是总部位于西雅图的 Polytechnology 公司顾问、讲师兼导师,目前在 Smartsheet.com 担任开发者关系主管。他写过 100 多篇文章,独自撰写并与人合著过十几本书,其工作的身影遍及全世界。可通过 ted@tedneward.com 与他联系,也可阅读他的博客 blogs.tedneward.com


在 MSDN 杂志论坛讨论这篇文章