结果出乎意外,main文件的大小比上面在prod模式下运行测试服务器大很多,达到800多K。应该是编译过程需要某些参数,或者是当前的angular-cli有什么bug。
再使用 ng build --prod --aot 编译,main文件的大小是446K。虽然小了一点,但是也不符合预期。
总结
先说延时加载,应该都知道可以减少第一次加载的文件的大小。特别是当某个模块使用了一些比较大第三方的js库,例如图形库等,那么,把这些模块独立出来,使用延时加载的方式,可以大大减少首次加载的时间。对于Angular2的应用来说,如果我们要定义 Component ,就从 @angular/core 里面引入 Component ,需要定义路由就从 @angular/router 里面引入`Router。所以,只要我们设计好了整个App的模块、组件、路由,我们就可以利用延时加载的功能使得首页文件尽可能的小。
使用模块化的开发,也能给我们的开发和维护带来很大的便利,项目越大越大,模块化和组件化带来的便利就越明显。
目前Angular2的天坑
在网上,经常可以看到一些文章说Angular1或者2的一些坑。实际上,大部分都是因为使用不当,或者没有按照最佳实践去使用,特别是Angular1。虽然Angular1有本质上的性能问题,但是,通过良好的整体设计、良好的 代码规范和质量,还是可以开发出很流畅的手机web应用。
但是,在准备这篇文章中的实例时,却遇到了几个严重的问题,让我这个Angular2的忠实粉丝也很无奈。
Angular 2.2.2及以上版本的BUG
我在实例中使用的Angular的版本是2.2.1,如果用的版本是2.2.2 ~ 2.3.0之间,在运行或编译的时候,可能会出现如下的错误:
ngCompiler.ReflectorHost is not a constructor TypeError: ngCompiler.ReflectorHost is not a constructor
可以上Github查看该 issue 的情况。如果遇到这种问题,只能先使用2.2.1的版本。
Angular-Router
在这个实例中,延时加载的todo模块里面有一个service,我们使用Angular的依赖注入的功能自动初始化以及诸如这个服务的实例。但是,在3.1.2及以上的版本里面,这个服务会被创建多次,每次激活相关路由的时候,就会创建一次。而且,只有在延时加载的模式才会发生这种错误。相关 issue
TypeScript
在我之前的教程里,判断用户是否具有某种权限,使用了如下的方法:
hasRole(role: string): boolean { return this.account && this.account.roles.includes(role); }
但是,更新了TypeScript以后,该方法就不存在了,原因可以查看 这个 .
所以改成了用 indexOf(role) > 0 来判断列表里是否存在一个字符串。
虽然目前Angular还不是十分稳定,有一些Bug,甚至TypeScript也不稳定,但是,相信这些问题都能够很快解决。而且随着框架越来越成熟,也会越来越稳定。
而且,Angular2+Typescript的开发方式也十分便利,Typescript的强类型检查能够帮助我们减少编码的错误,提高效率。而且,我们也可以很方便的查看框架的API,能省去很多查资料的时间。
Angular2的很多思想非常适用于开发大型的应用。如果开发过大型的Java项目,就会发现学习Angular2是一件非常容易的事情。Angular2引入了很多面向对象的框架的思想,而这些,都是在面向对象领域开发大型项目的多年开发经验。这些经验应用到前端开发,也能帮助我们更方便的开发和维护大型的前端项目。
虽然,Angular2的应用最终的打包文件非常大(我们这个实例即使压缩完后也有70K左右,但是如果用VUE的话会比这个小很多),但是随着Angular2的越来越稳定,各种开发工具越来越成熟,相信文件大小的问题也能够有一个比较好的解决方案。因为Angular2的AOT、Tree Shaking的特性,为解决大小的问题提供了前提。