我正在试验谷歌闭包库,并且正在研究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);
}
运行时,我收到错误:
Uncaught TypeError: Cannot read property 'XhrIo' of undefined
如果我将事件监听器和 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 中手动获取的内容来消除这个问题 问题?我还应该采取其他方法吗?
最佳答案
自从我上次使用闭包以来已经有几年了,但我认为你不能只使用 require 而无需依赖编译器。
闭包的工作原理是扫描 JavaScript 文件 goog.module
和goog.require
写一个deps.js
文件。该文件必须在 JavaScript 文件之前首先加载。它列出了代码使用的所有模块并以正确的顺序加载它们。
如果deps.js
首先出现,然后 goog.net
将在到达您的代码时加载。代码goog.require('goog.net.XhrIo')
第 1 行此时将被忽略。
根据文档 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
关于javascript - 无需编译即可访问闭包库中的 `goog.require` d 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43739008/