有没有什么方法可以使用Google Closuregoog.require
来管理JS依赖项,而不必在dependencies.JS文件中显式注册每个命名空间?
我喜欢编译器在生产中的想法,但在开发中,我希望在命名空间到JS文件夹/路径的配置转换上有某种约定,这样像goog.require('myapp.module')
这样的东西会在开发模式下自动导入myapp/module.js
(如果还没有导入的话),而在生产中,它会全部编译到一个文件中。
我似乎记得dojo.require
的旧版本是这样工作的。你知道谷歌关闭是否也能做同样的事情吗?
有没有任何方法可以使用Google Closure
goog.require
来管理JS依赖项,而不必在dependencies.JS文件中显式注册每个命名空间?
简短的答案是否定的。在未编译的JavaScript代码中,goog.require()
依赖于调用goog.addDependency(relativePath, provides, requires).
生成的依赖图
来自DepsWriter文档:
但是闭包库如何知道哪些文件提供了哪些命名空间?闭包库中包含一个名为deps.js的默认依赖文件。该文件为库中的每个JavaScript文件包含一行,每行都指定文件位置(相对于base.js)、它提供的名称空间以及它所需的名称空间。
在调试模式下,
goog.require()
语句查看是否指定了require命名空间,如果指定了,则获取提供该命名空间及其所有依赖项的文件。但是,ClosureLibrary只附带了库中命名空间的依赖文件如果您计划编写自己的名称空间(而且您很可能会这样做),您可以使用
depswriter.py
为您创建的名称空间创建一个依赖文件
也就是说,你可以使用像plovr这样的工具,它提供了一个"RAW";模式连接您的JavaScript源代码而不进行编译。这避免了生成deps文件的需要,但也意味着在浏览器中调试代码时,确定包含代码的原始文件更具挑战性。
在闭包工具中有一个名为calcdeps.py的python脚本,它可以生成您想要的内容。
开始使用goog.provide/goog.require:
-
将文件组织到一个目录结构中,以匹配所需的命名空间。即,如果您声明的名称空间是grantys.真棒.lib.Math',那么您的目录结构应该类似grantys/真棒/lib/Math.js.
-
在您添加为依赖项的每个文件中,第一个javascript函数调用应该是goog.provide('grantys.真棒.lib.Math')。要依赖另一个或多个文件,请用goog.require('grantys.真棒.lib.Constants')声明需求。*这很重要,goog.provide是calcdeps.py用来计算每个文件可以提供什么的东西——解压缩它绝对不能保证你所说的提供的命名空间就是你在该文件中构建的命名空间
-
使用适当的参数(搜索可能包含或不包含goog.provide('some.library')的文件的路径、要写入的文件名等)运行calcdes.py。这将生成一个文件,其中包含您手动编写的任何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中,包括谷歌的base.js脚本。这声明了goog对象。在base.js脚本标记之后,添加一个标记,该标记引用您使用上面的calcdes.py生成的deps.js文件。
使用goog.require('grantys.真棒.lib.Math').加载依赖项
注意:如果更改依赖项,则必须重新运行calcdeps.py。我自己的解决方案是用正确的args将其封装在shell脚本中,因此当我进行需要重新扫描文件的更改时,我只需运行/calcdes.sh
base.js
文件定义函数goog.require()
。函数调用goog.require('goog.dom')
加载定义goog.dom
命名空间中函数的JavaScript文件,以及闭包库中这些函数所需的任何其他文件。