使用 Object.freeze 和 object.unfreeze 来减少具有大量表数据行的响应式页面中的内存膨胀

Posted

技术标签:

【中文标题】使用 Object.freeze 和 object.unfreeze 来减少具有大量表数据行的响应式页面中的内存膨胀【英文标题】:Use Object.freeze and object.unfreeze to reduce memory bloat in reactive pages with lots of table data rows 【发布时间】:2019-09-20 06:02:36 【问题描述】:

我正在使用here 提供的方法来减少我的 Vue.js 应用程序的内存膨胀,该应用程序具有大量表/行数据。我们看到内存膨胀,尤其是在 IE 中。 前任。加载页面时,包含几行的页面可能会跳转约 100MB。

我发现,如果我冻结进入我们存储行数据的列表/数组中的每个对象,膨胀会显着下降。 100MB -> 60MB

对于我们在多个页面上有大量表数据的 Vue.js 应用程序来说,这是减少内存膨胀的最佳解决方案吗? 我注意到,如果没有发生冻结,IE 可以在点击 2-3 页并进行 1-3 次搜索后将内存跳转到 ~1GB,每次搜索会产生 50 行数据!每次我们进行搜索时,我都会尝试清除数组,以便垃圾收集器进行清理,但实际上并没有太大影响。

此外,当我们在数据表行中有需要即时更改的列(例如日期或名称)时,我应该 1.解冻对象 2.做出改变 3.再次冷冻 4. 推回数组

使用类似this package的东西

【问题讨论】:

没有unfreeze 这样的东西。你应该用它的真名来称呼它:浅拷贝。 github.com/gajus/object-unfreeze 是做什么的? Yes。文档中的示例显示它返回一个新对象,而不是“解冻”传递的对象。 (顺便说一句,如果你问我,他们的浅拷贝实现很糟糕)。 嗯,你知道更好的吗? 只需array.slice()Object.assign(Object.create(Object.getPrototypeOf(object)), object) 就足够了。它们很简单,通常不需要额外的功能,更不用说库了。如果您不关心自定义原型,请将Object.create(…) 简化为 【参考方案1】:

这可能有点晚了,但您也可以在可变变量 (let) 中创建一个对象,并在需要重置时将原始对象重新分配给该变量。

例如:

let obj =  objProp: "example" ;

if (condition) 
    Object.freeze(obj);

else 
    obj =  objProp: "example" ;

【讨论】:

以上是关于使用 Object.freeze 和 object.unfreeze 来减少具有大量表数据行的响应式页面中的内存膨胀的主要内容,如果未能解决你的问题,请参考以下文章

ES5 对象的扩展(Object.preventExtensions)密封(Object.seal)和冻结(Object.freeze)

自己封装一个Object.freeze()方法

Object.freeze

Object.freeze()

Object.freeze(); 方法冻结一个对象。

Object.Freeze Javascript [重复]