我正在尝试使用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.module
和goog.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>
任何依赖项都必须加载到单独的脚本标签中。然后,您的代码样本应起作用。