我是 Angular 11 中企业应用程序的一部分。我们大量使用 NgRx 存储,我想知道我们是否可以通过优化订阅来改善我们的应用程序内存占用(目前内存占用约为200-220 MB和实时 JS Heap大小〜76-85 MB)。
对我们来说,性能优化非常重要,因为我们的客户不会全天刷新或关闭浏览器窗口,而且由于我们有足够的订阅服务来为我们的客户服务,我需要帮助以将内存占用保持在可接受的限制以下并且不影响我们的客户。
我们以下列方式使用订阅:
private destroyed$: ReplaySubject <boolean> = new ReplaySubject(1);
ngOnInit(): void {
this.accountProgress$ = this.store.pipe(select(appState => appState.account.accountProgress), takeUntil(this.destroyed$));
...
...
this.accountProgress$.subscribe(() => {...})
}
ngOnDestroy(): void {
this.destroyed$.next(true);
this.destroyed$.complete();
}
同样,我们还有许多其他可观察的订阅来监听 App State 的不同部分。我有几个疑问:
- 订阅
this.accountProgress$.subscribe(() => {...})还会导致内存泄漏吗?如果在同一个组件中多次使用它以不同的方法获取数据?我们是否也应该使用takeUntil()或take(1)使用这种订阅(我们在少数地方有这种订阅,但我不确定它是否有帮助)?或者使用共享运算符,例如publish() + refCount()orshare({refCount: true})withthis.store.pipe(select(appState => appState.account.accountProgress))? - 有时我们需要
dispatch根据我们在订阅中收到的值来执行操作,我知道这是一种反模式,我们不应该dispatch在订阅中执行操作,但是可以做什么,因为很少有商店依赖 API 响应,并且不确定何时返回将决定业务逻辑进一步执行的数据 - 还有其他优化方法吗?(请注意,我们在组件中任何需要的地方都遵循上述语法,
takeUntil()在处理 NgRx 存储、效果和 Observables 时是否有任何其他方法可以防止内存消耗)