javascript - 无需编译即可访问闭包库中的 `goog.require` d 对象

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

我正在试验谷歌闭包库,并且正在研究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.modulegoog.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/

相关文章:

javascript - Selenium page_source 不返回修改后的 DOM 树

javascript - 如何在 Closure Compiler 中将 node_modules 定义为 extern?

javascript - 闭包编译器 - 包含目录中的所有 .js 文件

javascript - 使用 Closure Library 构建库

javascript - Jssor for jssor slider 用户是否可以制作带有动态图像的 jssor slider

javascript - 如何在快速工作区中转换简单的 react 组件

javascript - 将 Unicode 转换为 UTF8

javascript - 关闭编译器。基于 JSF 的页面中的单/双引号优化

javascript - 让一个类成为 goog.events.EventHandler 和 goog.events.EventTarget

javascript - 如何通过外部 Javascript 库(例如 jQuery)使用 Google Closure 样式表重命名?