访问“ goog.require”在封闭库中无需汇编的对象



我正在尝试使用Google Closure库,并且正在通过Xhrio官方指南。我在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行中实例化。我想理想的解决方案是通过关闭编译器运行我的所有代码,但是我只是试验和其他部分文档暗示我的工作流程是可以接受的。

我可以在html中手动源来消除这一点问题?我还应该采用其他方法吗?

自上次闭合已经玩了几年,但我认为您不能只使用依赖编译器就可以使用。

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

如果deps.js首先出现,则goog.net将在获得您的代码时加载。目前将忽略第1行的代码goog.require('goog.net.XhrIo')

根据文档,goog.require将在执行当前<script>之后插入<script> TAG 。因此,如果您要跳过使用deps.js的步骤,则必须将所有内容都包装在文档中,或者Manaully将goog.require添加到在代码之前已加载的JavaScript文件中。

我认为不值得付出努力,只使用封闭依赖作者创建deps.js文件。

这里有一个快速教程:

https://www.safaribooksonline.com/library/view/clusion-the-definistion/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

对于未编译的模式,必须预先加载所需的文档。因此,在您的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>

任何依赖项都必须加载到单独的脚本标签中。然后,您的代码样本应起作用。

最新更新