版本
2.5.4
复现链接
https://codepen.io/anon/pen/KyyxKB?editors=1010
复现步骤
- 打开浏览器开发者工具
- 使用不同的MAX变量启动复现(100, 200, 500, 1000, 1500, 2000, 4000)
- 注意内存使用量随着MAX变量的增长呈二次方增长,而程序中计算属性的数量及其隐含依赖关系与MAX变量成正比。
预期结果是什么?
预期内存消耗随着MAX变量的增长呈线性(即成比例)增长。
实际发生的情况是什么?
所有 data_X
可观察对象都将其所有 computed_X
计算值作为订阅者,因此总订阅数呈二次方增长。
很难编写一个真正影响到有此bug的用户代码,但无论如何,这感觉像是响应式系统设计中的一个缺陷。
1条答案
按热度按时间ehxuflar1#
经过一些调查,我想知道这种用法是否值得在响应式系统中进行重大的重新设计。
Vue有两个底层的响应式组件,
Watcher
和Dep
。它们与Output
和Input
非常相似:Watcher
在Dep
改变时执行回调。问题是没有这样的组件像pipe
那样:既执行回调又通知观察者。所有可观察对象都有其计算值的所有订阅者
这就是我们如何使用观察者和依赖项来模拟
pipe
的方法。为了优化内存使用,我们可能需要在 https://github.com/lihaoyi/scala.rx 中创建一个新的响应式组件,如Rx
。然而,这个新类可能只优化有限的使用情况。正如 OP 已经指出的:
编写真正影响用户并受此 bug 影响的代码是非常困难的