GWT: Opera浏览器JavaScript错误

3

我们有一个大型的GWT应用程序。最近几天,我们在Opera浏览器中遇到了奇怪的错误,但其他浏览器都没有问题:

Syntax error at line 3739 while loading:
f+Gcd(ead)+LIf+A9c.b.b+RIf+Icd(ead)+LIf+
--------------------^
input too deeply nested

我已经谷歌搜索了“input too deeply nested”,但没有找到与我们的问题相关的内容。由于你只能使用编译后的JavaScript运行应用程序,因此很难进行调试。


在最糟糕的情况下,尝试回滚直到错误消失。至少你会知道代码中哪个改变引起了错误。 - Barth
LIf+A9c.b.b 最后一个 b 是什么?因为标记明确指向那里。你使用的 Opera 版本是什么(旧版/11.51版/alpha 12版)? - c69
@c69:不知道b是什么,因为它是编译后的代码。 - Andreas Köberle
嗯..尝试使用Opera的最新alpha版本,如果问题仍然存在 - 只需开始老式调试..通过回滚/注释代码块,直到找到罪犯。因为我甚至在谷歌上都找不到这个错误,所以你可能是第一个在互联网上提到触发它的人。 - c69
你可能想要查看PATCH-538或者Opera的Browser.js文件。这是一个预处理脚本,可以避免在qq.com上出现“输入嵌套过深”的错误,因为Opera的ES引擎内部限制太低了。(这个补丁似乎用它们的结果替换了对underscore.js的调用,因为它在页面脚本中搜索类似+_("anychar")+的模式,并将它们替换为_("anychar")操作的结果。) - c69
2个回答

2

Carakan的解析器是一个相当简单的递归下降解析器。因此,为了避免堆栈溢出,输入令牌有深度限制。嵌套的“+”表达式可能会导致这种情况,但是有一些保护措施(尽管我忘记了具体是什么,稍后会检查并编辑此内容)。


0

回复有点晚了,但可能对其他用户有帮助?

Opera(或我们的情况下是Opera Mini)仍然可能无法处理深度嵌套的表达式。Google的Closure Compiler或UglifyJS等缩小工具将重新编译JavaScript源代码,并且可能会引入比原始源代码更复杂(和更深层次)的表达式。

对于Ruby on Rails 4中的Uglifier,关闭compress.sequences通常足以解决问题。在config/environments/production.rb中:

config.assets.js_compressor = Uglifier.new(:compress => {:sequences => false})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接