【发布时间】:2011-04-15 13:40:28
【问题描述】:
我最近在开发Rich Internet Application 的背景下完成了大量的JavaScript 编程。我在开发之初的看法和现在差不多。 JS RIA 有效,但缺少开发工具。
我特别错过的一个工具是用于管理依赖项。我发现我最终得到了很多 HTML 页面,声明了它们所有的 JS 文件依赖项,而且这变得难以维护。
我想知道您对我着手的一个项目的看法:Maven JavaScript 导入。我的意图是最终将项目作为开源发布,但目前我只是在修补它(虽然已经开发了很多东西)。
声明依赖关系
我的想法基于使用 Maven 将 JS 文件声明为依赖项。这就是我在我的 pom 文件中声明对 jQuery 的项目依赖的方式:
<dependency>
<groupId>com.jquery</groupId>
<artifactId>jquery</artifactId>
<version>1.4.2</version>
<type>js</type>
</dependency>
然后依赖于 jQuery 的文件有两种声明其依赖关系的方法:
- 通过注释块中的@import 语句;或
- 只需声明一个所需的全局变量。
进口
显式导入采用以下形式:
/**
* @import com.jquery:jquery
*/
如您所见,导入的格式是<groupId>:<artifactId>。该方法的优点是在具有依赖关系的 js 文件中没有声明文件/版本信息。这些 GAV 参数解析为 POM 文件中声明的工件。
全局变量
而不是上面的@import,如果一个依赖文件在全局范围内声明变量,那么只需声明任何这些全局符号就可以了。例如,如果一个文件需要 jQuery:
var $;
... 因为 $ 当然是 jQuery 定义的全局变量。
并非所有依赖项都声明全局符号,这也是提出 @import 的原因,但我认为声明所需的符号是好的和干净的(并且符合 JSLint!)。
总结
最终,需要 JS 资源的 HTML 文件只是声明它需要的直接资源,而不是它的所有依赖项。我的 Maven 插件将运行所有 JS 文件(源文件和依赖项)并构建一个符号树。任何包含资源的 HTML 文件都将具有由插件注入的脚本元素,以确保包含所有依赖项。当一个项目的阶段被执行时,这一切都会以神奇的 Maven 方式发生。在测试或资源阶段执行之前。
那你怎么看?这是您可能在 JS RIA 项目中使用的东西吗?
【问题讨论】:
-
Google Closure 工具有一个很好的方法来管理依赖关系。每个 JS 文件都声明其依赖项,然后编译器可以将“主”脚本文件所需的所有内容复制在一起。他们使用这些工具包制作了 GMail,所以显然它可以工作。
-
非常有趣。感谢那;我将进一步研究 Closure Tools。关于我的提议,我忘记提及的一件事是依赖项是静态引入的,即在加载 html 文档时。我还没有彻底探索闭包,但我得到的印象是依赖项是根据需要延迟引入的。我已经沿着这条路径开发了一些东西,我知道通过 FireBug 和其他方法进行调试并不能很好地解决这个问题。只是一个想法。不过再次感谢 - 我将仔细研究 Closure 的机制。
-
在进一步调查中,我没有看到 Closure 管理依赖项的版本控制 - 似乎也没有任何存储库的概念......当然,Maven 在这方面非常强大。
-
“我还没有彻底探索过闭包,但我得到的印象是依赖项是根据需要延迟引入的。”不,仅在开发期间。对于生产使用,所有内容都被编译到一个文件中。但你是对的,Closure 不管理版本控制或存储库。
-
所以已经一年多了。给我看代码!
标签: javascript maven-2 dependencies mojo