Ember.js 从DOM中删除表可能会导致转换非常慢
我使用的是Ember JS 2.3.0、Ember Data 2.3.3和jQuery 2.1.4,当我试图从一个包含HTML表组件的页面过渡时遇到了一个问题。表格组件由来自此Ember数据调用的数据填充:Ember.js 从DOM中删除表可能会导致转换非常慢,ember.js,ember-data,ember-cli,Ember.js,Ember Data,Ember Cli,我使用的是Ember JS 2.3.0、Ember Data 2.3.3和jQuery 2.1.4,当我试图从一个包含HTML表组件的页面过渡时遇到了一个问题。表格组件由来自此Ember数据调用的数据填充: this.store.query('log', {filter: { created_at_from: moment().subtract(1, 'month').format('DD/MM/YYYY'), created_at_to: moment().format('DD
this.store.query('log', {filter: {
created_at_from: moment().subtract(1, 'month').format('DD/MM/YYYY'),
created_at_to: moment().format('DD/MM/YYYY'),
object: 'IsoApplication'
}})
在开发人员工具的“时间线”和“网络”选项卡中查看后,这些问题正及时得到解决。它没有特殊的jQuery事件等附加到它,只是一个简单的HTML表,使用Ember动态生成
但是,当单击一个“链接到”帮助器,该帮助器从包含组件的页面转移出去时,在目标页面呈现之前会有10秒的巨大延迟。在这段时间内,似乎什么都没有发生,并且使用了开发人员工具“Timeline”并深入研究,似乎在调用“removeFromListeners”函数时出现了延迟(请参见所附的Timeline屏幕截图)。在这一点上没有发生异步的事情,因此没有出现加载器,但是问题似乎在于拆下表,因为如果我从模板中删除表组件,问题就会消失。如果没有表组件,页面几乎会立即转换
我附上了时间轴截图,看看是否有人可以帮助查明这个问题的可能原因。
欢迎提出任何建议
谢谢。好的,在显著减少表中的行数后,我发现问题消失了@runspired提供了我的问题发生原因的详细且非常有用的描述,我在下面发布了这些描述,以通知可能有类似问题的其他人: 这里发生了很多事情 我已经就此做了几次演讲(包括余烬周末的两个播客(第38集和第39集)) 我希望我的芝加哥余烬演讲能被录音,但我没有 但基本上可以归结为三件事来解释为什么这是缓慢的 事实上,这并不是因为“dom很慢”,这个论点掩盖了事情的真相 1.)不要渲染宇宙,渲染场景 最简单的类比就是拿你能想到的任何一款视频游戏,尤其是一款你能快速“旋转”摄像机视角的游戏 那个轴很像卷轴 实际上,您只希望渲染当前可见的内容,并准备更接近摄影机视图的内容 但是,准备远远看不见的内容是没有意义的 这是每个本机SDK和游戏SDK都学到的一课,但JS框架尚未意识到这一点 当人们说DOM很慢时,其实是因为他们试图呈现的东西远远超过了他们应该呈现的东西 2.)是大多数浏览器中的一个bug 分配给DOM的内存始终由分配它的选项卡保留 此分配会在页面的生命周期之外持续存在 这是一个真正的漏洞,希望Chrome等能很快修复 或者基本上,为DOM所做的分配堆大小只能不断增加 您可以重用分配的内存,但不能缩减它 这意味着,如果生成大量DOM节点,即使将它们拆下,该选项卡也会有很高的内存开销 这会导致其他方面的性能问题,因为用于JS分配等的内存较少 在移动设备上,尤其是安卓系统上,这个问题比在台式机上更严重。但它也会影响桌面 与1和2齐头并进的东西 在浏览器开始运行之前,可以渲染多少DOM节点是否有明确的限制 我发现这个限制大约是40k个DOM节点,在旧的android设备上低至20k,在Safari上则超过100k 但40k似乎是一个极限,如果将其作为目标,对所有平台都适用 如果您有700-2000个表行,每行可能有3个TDs,每个TD只有一个链接、跨度或其他元素,那么其中有一些文本 6300-18000节点 或者,基本上,你要处理的是你最大预算的一半 正如行的内容一样 所以7002-20002个节点计算行数 每行9个节点的估计值可能很低 如果我们加倍的话 你超过了最大值 18个节点听起来更有可能 3.)GC事件阻止了世界 [9:28] 即使选项卡分配的内存被保留 分配已清理完毕 (这样以后可以在更多DOM中重用)(已编辑) 因此,您一次至少释放最大DOM大小(可能更大)的内存 这对浏览器来说是一个很大的问题 在这段时间内,很多阵列和阵列观测器也可能被拆除 @runspired也是该项目的作者,该项目: 通过为performant列表和苗条渲染提供组件和原语,以符合核心理念:不渲染宇宙,渲染场景,重点改进高应力情况下的初始和重新渲染性能
好的,在显著减少表中的行数之后,我发现问题消失了@runspired提供了我的问题发生原因的详细且非常有用的描述,我在下面发布了这些描述,以通知可能有类似问题的其他人: 这里发生了很多事情 我已经就此做了几次演讲(包括余烬周末的两个播客(第38集和第39集)) 我希望我的芝加哥余烬演讲能被录音,但我没有 但基本上可以归结为三件事来解释为什么这是缓慢的 事实上,这并不是因为“dom很慢”,这个论点掩盖了事情的真相 1)不要渲染t