2013-06-06 42 views
0

我正在使用Google Closure,并试图制作Chrome打包的应用程序。谷歌关闭和Chrome打包的应用程序:兼容性?

我对goog.require调用会导致错误:

Uncaught document.write() is not available in packaged apps. 

罪魁祸首是base.js

goog.writeScriptTag_ = function(src) { 
    if (goog.inHtmlDocument_()) { 
    var doc = goog.global.document; 

    // If the user tries to require a new symbol after document load, 
    // something has gone terribly wrong. Doing a document.write would 
    // wipe out the page. 
    if (doc.readyState == 'complete') { 
     // Certain test frameworks load base.js multiple times, which tries 
     // to write deps.js each time. If that happens, just fail silently. 
     // These frameworks wipe the page between each load of base.js, so this 
     // is OK. 
     var isDeps = /\bdeps.js$/.test(src); 
     if (isDeps) { 
     return false; 
     } else { 
     throw Error('Cannot write "' + src + '" after document load'); 
     } 
    } 

    doc.write(
     '<script type="text/javascript" src="' + src + '"></' + 'script>'); 
    return true; 
    } else { 
    return false; 
    } 
}; 

是谷歌关闭谷歌浏览器打包应用程序不兼容? 关闭对于大型Javascript项目有很多好处,因此很难放弃这样一个有价值的工具。

编辑:我知道,如果除了Closure库使用Closure编译器,没有goog.require,但这显然使开发和调试更困难。

回答

1

Closure Dev Mode & Chrome Packaged App -- "document.write() is not available in the sandbox of packaged apps"

只要你运行它未编译或不符合你必须重新编写使用了document.createElement(“脚本”)的doc.write高级编译编译;

因此,与替代TE doc.write行:

var script = document.createElement('script'); 
    script.src = src; 
    script.type = 'text/javascript'; 
    goog.global.document.getElementsByTagName("head")[0].appendChild(script); 
    return true; 

提前编译代码不应该需要这个,因为它在一个文件中把所有的代码使用起来。

+0

它保证工作?看起来,当我尝试在另一个项目上动态加载Javascript时,脚本以不确定的顺序异步执行。 –

+0

我证实了这一观察。它可能适用于小文件或其他内容,但是JavaScript是非顺序加载和评估的。 –

+0

这必须是谷歌使用document.write的原因。您可以尝试calcdeps.py并为所需的所有文件创建<脚本标记。您可以使用输出列表来获取列表,然后创建<脚本标记以在使用它们之前加载所有需要的js文件。 goog.require应该检测到文件已经加载并且不会执行document.write。 https://developers.google.com/closure/library/docs/calcdeps#opts – HMR