0

我正在使用 Google Closure,并且正在尝试制作 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;
  }
};

Google Closure 是否与 Google Chrome 打包应用不兼容?Closure 对于大型 Javascript 项目有很多好处,很难放弃这样一个有价值的工具。

编辑:我知道如果除了 Closure 库之外还使用 Closure Compiler,则没有 goog.require,但这显然会使开发和调试变得更加困难。

4

1 回答 1

1

关闭开发模式和 Chrome 打包应用程序 -- “document.write() 在打包应用程序的沙箱中不可用”

只要您未编译运行它或不使用高级编译进行编译,您就必须使用 document.createElement("script"); 重新编写 doc.write;

因此,将 doc.write 行替换为:

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

高级编译代码不需要这个,因为它将所有使用的代码放在一个文件中。

于 2013-06-06T08:06:18.040 回答