在没有编译的情况下访问闭包库中的`goog.require`d对象

时间:2017-05-02 13:20:19

标签: javascript google-closure-compiler google-closure-library

我正在尝试使用Google封闭库,正在使用the official XhrIo guide。 我在xhr-quick2.js示例中遇到了一些麻烦,转载如下:

goog.require('goog.net.XhrIo');

var xhr = new goog.net.XhrIo();

goog.events.listen(xhr, goog.net.EventType.COMPLETE, function(e) {
  obj = this.getResponseJson();
  log('Received Json data object with title property of "' +  
      obj['title'] + '"'); 
  alert(obj['content']);
});

function getData(dataUrl) {
  log('Sending simple request for ['+ dataUrl + ']');
  xhr.send(dataUrl);
}

运行时,我收到错误:

  

未捕获的TypeError:无法读取未定义的属性“XhrIo”

如果我将事件监听器和xhr实例移动到getData内 函数(在正文的onload中调用),一切都很好。

goog.require('goog.net.XhrIo')

function getData(dataUrl) {
  var xhr = new goog.net.XhrIo()

  goog.events.listen(xhr, goog.net.EventType.COMPLETE, function(e) {
    obj = this.getResponseJson()
    log(`Received Json data object with title property of "${ obj["title"] }"`)
    alert(obj["content"])
  })

  log(`Sending simple request for [${ dataUrl }]`)
  xhr.send(dataUrl)
}

function log(msg) {
  document.getElementById('log').appendChild(document.createTextNode(msg));
  document.getElementById('log').appendChild(document.createElement('br'));
}

我认为这是因为goog.require还没有完成导入net goog.net.XhrIo在第一个代码示例的第3行实例化。我想 理想的解决方案是通过闭包编译器运行我的所有代码,但我是 只是试验和other parts of the documentation 意味着我的工作流程可以接受开发。

我可以在我的html中手动输入任何可以消除此内容的内容 问题?我还有其他方法吗?

2 个答案:

答案 0 :(得分:2)

自从我上次使用闭包以来已经过了几年,但我不认为你可以在没有依赖编译器的情况下使用require。

Closure通过扫描goog.modulegoog.require的JavaScript文件来编写deps.js文件。必须先在JavaScript文件之前加载此文件。它列出了代码使用的所有模块,并以正确的顺序加载它们。

如果deps.js首先出现,那么goog.net将在到达您的代码时加载。第1行的代码goog.require('goog.net.XhrIo')此时将被忽略。

根据文档,goog.require会在正在执行的当前<script>之后插入<script>代码。因此,如果您想跳过使用deps.js的步骤,那么您必须将所有内容包装在文档就绪回调中,或者将goog.require添加到代码之前加载的JavaScript文件中。

我认为使用闭包依赖编写器创建deps.js文件并不容易,也更容易。

这里有一个快速教程:

https://www.safaribooksonline.com/library/view/closure-the-definitive/9781449381882/ch01.html

这是用于编写deps.js文件的CLI:

python ../closure-library/closure/bin/calcdeps.py \
    --dep ../closure-library \
    --path my_stuff.js \
    --output_mode deps > deps.js

答案 1 :(得分:0)

对于未编译模式,必须预先加载所需文档。所以在你的html文档中你会有:

<!DOCTYPE html>
<html>
  <head>
    <script src="path/to/closure/base.js"></script>
    <script>
      goog.require('goog.net.XhrIo');
    </script>
    <script src="mysource.js"></script>
  </head>
</html>

必须在单独的脚本标记中加载任何依赖项。那么上面的代码示例应该有效。