Safari 中混合 AngularJS 和 Angular 应用程序性能低下
Slow performance in hybrid AngularJS and Angular application in Safari
我最近开始使用升级模块将 AngularJS 应用程序迁移到 Angular 4。
我的一个 AngularJS 指令使用第三方库 (ngFlow) 使用 XMLHttpRequest.send()
上传文件。当 运行 处于混合模式时,上传在 Chrome 和 Firefox 中都可以正常工作。但是,在 Safari 中,应用程序在上传过程中变得非常慢,并且浏览器进程达到 100% CPU 已使用。
使用 Safari 网络工具,我发现 zone.js 对 globalZoneAwareCallback
有很多调用。
我的印象是,Angular 区域会针对上传期间发生的每个 XMLHttpRequest
进度事件启动更改检测。
我知道我可以使用 NgZone
中的 runOutsideAngular
来避免这种情况,但我不知道如何在第三方发生异步调用的情况下使用它AngularJS 库或是否有任何其他解决方案来解决此问题。
最后我设法使用 runOutsideAngular
解决了这个问题。
首先,我降级了 NgZone 模块以在我的 AngularJS 代码中使用它:
factory('ngZone', downgradeInjectable(NgZone));
然后我在上传指令中注入了服务,并用它来 运行 文件上传到 Angular 区域之外:
ngZone.runOutsideAngular(() => $flow.upload());
为了避免 $digest
和性能的所有问题,我建议使用 downgradeModule - 它在 Angular 区域之外引导 AngularJS 并保留两个变化检测系统分开。
我最近开始使用升级模块将 AngularJS 应用程序迁移到 Angular 4。
我的一个 AngularJS 指令使用第三方库 (ngFlow) 使用 XMLHttpRequest.send()
上传文件。当 运行 处于混合模式时,上传在 Chrome 和 Firefox 中都可以正常工作。但是,在 Safari 中,应用程序在上传过程中变得非常慢,并且浏览器进程达到 100% CPU 已使用。
使用 Safari 网络工具,我发现 zone.js 对 globalZoneAwareCallback
有很多调用。
我的印象是,Angular 区域会针对上传期间发生的每个 XMLHttpRequest
进度事件启动更改检测。
我知道我可以使用 NgZone
中的 runOutsideAngular
来避免这种情况,但我不知道如何在第三方发生异步调用的情况下使用它AngularJS 库或是否有任何其他解决方案来解决此问题。
最后我设法使用 runOutsideAngular
解决了这个问题。
首先,我降级了 NgZone 模块以在我的 AngularJS 代码中使用它:
factory('ngZone', downgradeInjectable(NgZone));
然后我在上传指令中注入了服务,并用它来 运行 文件上传到 Angular 区域之外:
ngZone.runOutsideAngular(() => $flow.upload());
为了避免 $digest
和性能的所有问题,我建议使用 downgradeModule - 它在 Angular 区域之外引导 AngularJS 并保留两个变化检测系统分开。