如何使用goog.provide和goog.require加载我自己的js模块?

Lig*_*ard 16 javascript dojo google-closure google-closure-library

我们正在尝试将我们项目的包装从dojo切换到谷歌关闭,但到目前为止我们还没有运气.这是一个简单的例子,说明了我们要完成的任务:


<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <script type="text/javascript" src="runtime/src/core/lib/goog-rev26/base.js"></script>
        <script>
            goog.require("foo.bar");
            function main() {foo.bar.echo("hello world")}
        </script>
    </head>
<body onload="main()">
</body>
</html>

然后/foo/bar.js我有:


goog.provide("foo.bar");
foo.bar.echo = function(s) {console.debug(s);}
Run Code Online (Sandbox Code Playgroud)

我在firebug中收到的错误如下:

goog.require could not find: foo.bar
foo is not defined

当我查看Net选项卡时,没有一个http请求来获取文件 - 我希望闭包库生成一个脚本标记来获取bar.js.

救命!;)

Nic*_*lay 13

我想通了,这不是很难,但有一些问题.

基本上,您可以使用以下几种模式之一使用依赖关系生成脚本calcdeps.py(您应该阅读calcdeps.py文档):

  1. 生成deps.js文件
  2. 将所有内容连接到一个文件中,可选择使用闭包编译器对其进行编译.

对于开发,您应该使用(1),因为它允许您在编辑JS源之后不运行calcdeps.py,除非您对依赖关系树进行了更改.其余的答案是这样的,我还没有尝试过另一个.

以下是我为生成它所做的事情:

#!/bin/bash
cd closure-library/closure/goog
python ../bin/calcdeps.py -p ../../../js -o deps > ../../../my-deps.js
Run Code Online (Sandbox Code Playgroud)

...假设以下目录结构:

project/
  closure-library/ (as checked out from SVN)
  js/ (my JS code)
  app.html
Run Code Online (Sandbox Code Playgroud)

(该-p参数遍历指定目录中的所有js文件,文档表示如果必须,可以指定要搜索的多个目录.)

上面的调用在主app.html旁边创建了一个my-deps.js文件,我用它来运行应用程序.创建的文件包含有关我的JS文件的信息js/,如下所示:

goog.addDependency('../../../js/controllers.js', ['proj.controllers'], []);
goog.addDependency('../../../js/ui.js', ['proj.ui'], ['proj.controllers']);
Run Code Online (Sandbox Code Playgroud)

- 第一个字符串,它是我的JS文件的路径相对于closure-library/closure/goog/base.js(这很重要!),第二个数组是goog.provide-d字符串的列表,最后一个数组是列表的goog.require-d字符串.

现在在app.html我有:

<script src="closure-library/closure/goog/base.js"></script>
<script src="my-deps.js"></script>
<script>
  goog.require("proj.ui");
</script>
<script>
  // here we can use the required objects
</script>
Run Code Online (Sandbox Code Playgroud)

注意:

  1. 除了包含closure的base.js之外,我还包括我生成的deps.js
  2. 正如本教程中所提到的,goog.require调用必须位于单独的脚本标记中,因为它附加了一个脚本标记来加载所需的脚本,并在当前脚本标记完成处理后加载它们.

陷阱:

  1. 路径相对于base.js的上述问题.goog.require通过将base.js基本URL(即没有base.js leafname)和第一个参数连接到deps.js中的goog.addDependency来创建要加载的脚本URL.
  2. calcdeps.py在Windows上运行不正常,特别是使用deps.js字符串文字中的反斜杠
  3. 如果某些内容不能正常工作,您可能需要查看提及calcdeps的所有问题并确保您拥有最新的结帐.


gat*_*pia 8

更新!

新版本的calcdeps.py稍微改变了游戏规则.要创建deps.js,您现在需要使用-d标志.例如:

python path-to-closure-library/closure/bin/calcdeps.py -i path-to-your-src/requirements.js -o deps -d path-to-closure-library/closure/ -p path-to-your-src/ --output_file=path-to-your-src/deps.js
Run Code Online (Sandbox Code Playgroud)

编译:

python path-to-closure-library/closure/bin/calcdeps.py -i path-to-your-src/requirements.js -d path-to-closure-library/closure/ -p ./ --output_file=path-to-your-release/scripts.min.js -c path-to-compiler/compiler.jar -f "--compilation_level=ADVANCED_OPTIMIZATIONS" -f "--debug=true" -f "--process_closure_primitives=true" -f "--manage_closure_dependencies=true" -o compiled
Run Code Online (Sandbox Code Playgroud)

所以这个过程实际上现在变得容易多了,但是你必须利用你的ESP的力量来发现它完全没有文档.calcdeps.py现在也无法在Windows上使用Python 3.1,因此这也是很有趣的.一些黑客让它为我工作(我不会放在这里,因为我不是一个python程序员,必须有更好的方法来做到这一点).

一般来说,最后一天一直非常有趣,希望这篇文章可以帮助别人避免同样的享受.

圭多