BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Angular AOT编译大型项目出现内存溢出瓶颈

| 作者 周元昊 关注 0 他的粉丝 发布于 2017年8月10日. 估计阅读时间: 2 分钟 | QCon北京2018全面起航:开启与Netflix、微软、ThoughtWorks等公司的技术创新之路!

亲爱的读者:我们最近添加了一些个人消息定制功能,您只需选择感兴趣的技术主题,即可获取重要资讯的邮件和网页通知

自2.0版本起,Angular就已支持了AOT(Ahead-of-time)编译,该功能在服务器端对代码进行编译,这可以免去标准的JIT(Just-in-time)方式每次都在浏览器运行时进行编译的消耗,优化了客户端的渲染速度及代码的网络传输效率。同时谷歌还推出了Angular-cli工具,进一步简化了Angular项目的管理、编译过程。

然而,在今年年初,有用户指出在使用Angular-cli对大型项目进行AOT编译时遇到内存溢出(OOM)的情况,导致编译失败。谷歌的Angular-cli工程师Hans表示,问题的原因是,在Angular-cli使用的Webpack插件中,路径解析没有很好地处理递归问题,从而导致大量内存占用,目前还没有找到很好的解决方案。

Angular的AOT编译会进行代码静态分析、无用代码及依赖的剪枝、缩小代码体积等一系列优化,这个过程势必会消耗一定时间。该功能在带来运行时性能提升的同时,拖慢了编译速度,从而遭到不少用户的吐槽。官方也建议,在开发过程中使用JIT的编译方式,而只在正式发布时使用AOT编译。

目前能够暂时缓解内存溢出这一问题的方法是为其分配更多可用的内存,使编译器能够完成编译,但这毕竟治标不治本,随着项目的不断增长,在可预见的将来还是会遇到同样的问题。将独立应用拆分成小型的模块会是一个不错的选择,同时也有人提出投奔Vue、Ember或React等其他框架。

社区中已有不少用户遇到了这个内存溢出的问题,并能够成功将其重现,然而目前谷歌官方并没有对该问题提出明确的解决方案,值得注意的是AngularDart并没有出现类似情况。社区对该问题的出现产生了些许担忧,Angular将来是否能很好地支持大型应用?谷歌最终会不会更倾向于推广AngularDart?现在只能希望Angular在后续版本中针对该问题进行更好的性能优化。


感谢薛命灯对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(微信号:InfoQChina)关注我们。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT