3

有什么方法可以使用 Google Closuregoog.require来管理 JS 依赖项,而不必在 dependencies.js 文件中显式注册每个命名空间?

我喜欢将编译器用于生产的想法,但对于开发,我想要命名空间到 JS 文件夹/路径的某种约定优于配置的转换,以便在开发模式下goog.require('myapp.module')自动导入myapp/module.js(如果尚未导入),在生产中,它们都被编译成一个文件。

我似乎记得以dojo.require这种方式工作的旧版本。知道 Google Closure 是否可以做同样的事情吗?

4

3 回答 3

2

有什么方法可以使用 Google Closuregoog.require来管理 JS 依赖项,而不必在 dependencies.js 文件中显式注册每个命名空间?

最简洁的答案是不。在未编译的JavaScript 代码中,goog.require()依赖于调用生成的依赖图goog.addDependency(relativePath, provides, requires).

DepsWriter文档中:

但是闭包库如何知道哪些文件提供了哪些命名空间?闭包库中包含一个名为deps.js的默认依赖文件。该文件包含库中每个 JavaScript 文件的一行,每个都指定文件位置(相对于base.js)、它提供的命名空间以及它需要的命名空间。

在调试模式下,一条goog.require()语句查看是否指定了 require 命名空间,如果是,则获取提供它的文件及其所有依赖项。

但是,闭包库仅附带库中命名空间的依赖文件。如果您计划编写自己的名称空间(并且您可能会),您可以使用depswriter.py为您创建的名称空间创建一个依赖文件。

话虽如此,您可以使用诸如plovr 之类的工具,它提供了一种“RAW”模式来连接您的 JavaScript 源代码而无需编译。这避免了生成deps文件的需要,但也意味着在浏览器中调试代码时,确定包含代码的原始文件更具挑战性。

于 2012-10-14T22:28:09.010 回答
2

在 Closure 工具中有一个名为 calcdeps.py 的 Python 脚本,它可以准确生成您想要的内容。

goog.provide/goog.require 入门:

  • 将您的文件组织到一个目录结构中以匹配您想要的命名空间。ie 如果你声明命名空间'grantys.awesome.lib.Math',你的目录结构应该类似于grantys/awesome/lib/Math.js。

  • 在您作为依赖项添加的每个文件中,第一个 javascript 函数调用应该是 goog.provide('grantys.awesome.lib.Math')。要依赖另一个文件或多个文件,请使用 goog.require('grantys.awesome.lib.Constants') 声明需求。*这很重要,goog.provide 是 calcdeps.py 用来确定每个文件可以提供什么的 -未编译它绝对零保证您说您提供的命名空间就是您在该文件中构建的内容。

  • 使用正确的参数运行 calcdeps.py(搜索可能包含或不包含 goog.provide('some.library') 的文件的路径、要写入的文件名等)。这将生成一个文件,其中包含您需要手动编写的任何 goog.addDependency 语句。另请注意, calcdeps 生成的 deps 文件使用相对路径,从您正在编写输出文件的目录中可以看出(并不总是您运行命令的目录)

calcdeps.py 的输出示例:

goog.addDependency("../site/ui/MurphyBed.js", ['site.ui.MurphyBed', 'site.ui.MurphyBed.State', 'site.ui.MurphyBed.EventType', 'site.ui.MurphyBed.Error'], ['goog.dom', 'goog.object', 'goog.events', 'goog.events.EventTarget', 'site.fx.easing', 'goog.fx.dom', 'goog.fx.AnimationSerialQueue']);
goog.addDependency("../site/ui/SliderButton.js", ['site.ui.SliderButton'], ['goog.ui.CustomButton', 'site.ui.SliderButtonRenderer', 'goog.fx.dom', 'site.fx.easing']);
  • 在您的 html 中,包含 google 的 base.js 脚本。这声明了 goog 对象。在 base.js 脚本标签之后,添加一个标签,该标签引用您使用上面的 calcdeps.py 生成的 deps.js 文件。

  • 使用 goog.require('grantys.awesome.lib.Math') 加载您的依赖项。

注意:如果更改依赖项,则必须重新运行 calcdeps.py。我自己的解决方案是使用正确的 args 将其包装在 shell 脚本中,因此当我进行需要重新扫描文件的更改时,我只需运行 ./calcdeps.sh

于 2012-10-25T05:14:14.367 回答
1

base.js文件定义了函数goog.require()。函数调用goog.require('goog.dom')加载定义goog.dom命名空间中函数的 JavaScript 文件,以及这些函数需要的来自闭包库的任何其他文件。

于 2012-10-13T18:06:48.817 回答