2013-04-25 55 views
11

许多JavaScript库都有一个Builder工具,它可以让您“塑造”您所依赖的库的功能,无论是下载到客户端的带宽成本,还是您实际需要的隔离功能。AMD模块调整:如何只加载一个JS函数?

比如,我喜欢在sugar.js很多事情,但我根本不需要或不想要平假名和片假名字符集的处理。作为最微不足道的示例,我希望能够“塑造”sugar.js以仅导出string.isBlank()。

有没有工具可以为我做这个? EcmaScript委员会有没有在未来的JavaScript版本中做这样的工作?像TypeScript和CoffeeScript这样的更高级的语言对这种“塑造”提供隐藏的支持吗?我可以通过monolinker在C#中为.NET DLL做这样的“整形”。

基本上,它看起来对我来说,AMD处理一个现代编译器的加载方面,但不处理链接的方面。 jquerydojo的构建器仅适用于特定的模块,并不是真正的链接器,只是构建器。

更新:Google Closure Compiler是一种编译器,它将JavaScript作为输入并生成JavaScript作为输出。该Advanced Compilation and Externs文档建议有一个API调用来做到这一点:

如果放在一起,这些出口语句显得过于繁琐,可以用一个函数来做到出口为您服务。有关导出函数的示例,请参见Closure Library函数goog.exportSymbol()goog.exportProperty()

但是,这看起来相当复杂,并使我直接依赖Google Closure Compiler。在这一点上,我正在寻找关于EcmaScript委员会未来标准的信息,关于CommonJS以及任何想到这个问题并试图解决这个问题的人的智慧。特别是来自TypeScript开发人员;我不想在TypeScript中为sugar.js创建声明文件,然后对我的TypeScript编译器输出使用Google Closure Compiler。这听起来很复杂,很难调试。

+0

这是一个很好的问题。我不认为任何工具都可以自动完成。 JavaScript非常灵活,在运行时或者应用程序的状态中看到函数发生变化并不罕见......可能很难真正提取一个函数。所以,我现在可以向你保证,如果原作者没有内置该选项,那么你不能使用链接器仅从jQuery中获取'$ .each'。这可能会来吗?也许,但我不会在不久的将来看到它。 (也许现在在静态分析工具上完成的工作将有助于以这种方式进行) – 2013-04-25 14:31:10

+0

这就是我所怀疑的。我已经看到MS Research的Allen Wirfs-Brock和Nikolai Tillman给出了一些例子,根据*解释时*的变量类型,6行JS代码块可以有不同的含义。因此,为什么我还询问了TypeScript和其他支持可选键入的高级语言。谢谢! – 2013-04-25 15:04:38

+0

这里是Nikolai的例子,摘自他在VMIL 2010上的SPUR演讲(http://www.cs.iastate.edu/~design/vmil/2010/slides/p03-tillmann-slides.pdf) var sum = 0; 为(VAR I = 0; I <1000;我++){ 如果(I == 990){ 总和+ = “Hello World” 的 } 总和+ = 1 } 打印(总和) – 2013-04-25 15:06:23

回答

2

不幸的是,没有什么内置的Javascript做到这一点“塑造”的,和你真正想要的是一个编译器,无论如何,因为大致它所服务的角色之一是自动“塑造”在许多层面(而不仅仅是与方法)。 Closure编译器是成熟的开源(JQuery实际上是使用Closure编译器进行缩减)。所以如果你打算开始为编译器注释你的JS代码,那它可能就是这个。

有很多使用编译器的副作用,顺便说一句。它们会减少文件大小(从而减少解释/运行时间),而不仅仅是简化包含的库。在开发过程中,它会提供很多有用的信息来尽早发现错误。

相关问题