几年前,我听说了一个不错的404页和实现了一个副本。
在使用ReactJS时,同样的想法是打算实现的,但是它的动作缓慢而不稳定,过了一段时间,Chrome给它一个“无响应的脚本”警告,该警告指向第1226行,"var position = index % repeated_tokens.length;",在连续调用之间有几百毫秒的延迟。脚本不断地超越一个没有响应的页面,让一台计算机屈服。
显然,它们不是相同的实现,尽管ReactJS版本是从"I not not‘re“版本派生出来的。但除此之外,它为什么会陷入困境?我是不是做了一堆很深的闭包?为什么ReactJS端口比裸JavaScript原版慢
在这两种情况下,工作都是由次要的算术驱动的,并且没有什么特别有趣的代码或它正在做的事情。
-更新--
我看到我被否决了三票.
这似乎得到了一些人的回应,他们(a)说了一些明智的话,(b)反驳了皮特·亨特( Pete )和其他人的说法。
亨特和Facebook的ReactJS视频宣称,合成DOM的速度非常快,足以在非JIT iPhone上以每秒60帧的速度运行。他们留下了一个优化钩子,可以说“在快速比较中忽略DOM的这一部分”,我在其他地方使用它来拒绝对非ReactJS小部件的管辖权。
@EdBallot的建议是,“创建和呈现一个元素,并完成一个document.getElementById,这是一项极端(且不必要的)工作。现在,我将最后一点考虑在内;DOM操作很慢。但这里的反应很难与Facebook关于表演家ReactJS的说法相一致。这里有一种”你想做的事情;我们会做出更多“的态度,(理论上)扔掉DOM,做出一个新的DOM,这是闪电--因为它是在记忆中完成的,而不需要与真正的DOM对话。
在很多情况下,我想要一些更外科的东西,并且可以尝试改变尽可能小的区域,但是我看到的ReactJS视频的文字和精神完全符合“缩窄你想要的,我们会做更多”的精神。
去试着建议编辑看看他们会做什么.
发布于 2015-08-21 01:56:50
我没有看过所有的代码,但首先,这是相当低效的。
var update = function() {
React.render(React.createElement(Pragmatometer, null),
document.getElementById('main'));
for(var instance in CKEDITOR.instances) {
CKEDITOR.instances[instance].updateElement();
}
save('Scratchpad', document.getElementById('scratchpad').value);
};
var update_interval = setInterval(update, 100);
它是做了一个极端(和不必要的)工作量和它是做每100毫秒。除其他外,它呼吁:
React.createElement
React.render
document.getElementById
随着创建和释放JS对象的数量,您的update
函数加上垃圾收集所花费的时间可能会超过100 is,从而有效地降低了计算机的运行速度。
至少,我建议在间隔回调之外尽可能多地缓存。也不需要多次调用React.render
。将其呈现到dom中后,使用setProps
或forceUpdate
使其呈现更改。
下面是我的一个例子:
var mainComponent = React.createElement(Pragmatometer, null);
React.render(mainComponent,
document.getElementById('main'));
var update = function() {
mainComponent.forceUpdate();
for(var instance in CKEDITOR.instances) {
CKEDITOR.instances[instance].updateElement();
}
save('Scratchpad', document.getElementById('scratchpad').value);
};
var update_interval = setInterval(update, 100);
除此之外,我还建议将setInterval代码移到任何React组件正在呈现的东西中( Scratchpad
组件?)。
最后一条评论:使用setInterval
的缺点之一是,它不会等到回调函数完成后再排队等待下一个回调。另一种方法是在回调设置下一个setTimeout
时使用setTimeout
,如下所示
var update = function() {
// do some stuff
// update is done to setup the next timeout
setTimeout(update, 100);
};
setTimeout(update, 100);
https://stackoverflow.com/questions/32126566
复制相似问题