我最近使用Google的Closure Compiler创建了一个JavaScript库:https://github.com/bvaughn/task-runner
我打算让这个库被也需要完整的Closure Library 的应用程序使用,所以我想要我的库的构建版本(Task Runner)而不是包括Closure Library的子集。如果任务运行器包含Closure库的子集,而另一个应用程序包含完整 Closure库,则将存在一个竞争条件,在该条件之间加载Closure last(last in wins)。它也会增加Task Runner文件的大小。
但是我遇到了麻烦。如果我不需要任何Closure库类,则Task Runner构建正常(显然)。但是,如果我需要某些东西(例如goog.dom),那么我的“编译”JavaScript文件也包含Closure库的一部分。有没有办法告诉Closure编译器保留某些JavaScript文件/模块/内置的结果?
FWIW,Plovr experimental-exclude-closure-library选项似乎在某种程度上描述了我正在寻找的功能。
答案 0 :(得分:1)
从表面上看,你提出的问题毫无意义。您希望依赖/使用Closure-library中的代码,但不要将其包含在输出中。这不是真的可能,也不是库和编译器如何协同工作。
Closure-library中定义的一个相当小的原始函数列表在使用Closure-compiler编译时被完全删除/替换。 goog.require
和goog.provide
是其中最突出的两个。
对于绝大多数Closure-Library,如果使用或依赖于特定代码将出现在编译输出中的类,方法或对象。并且因为库代码本身可能依赖于库的其他部分,所以编译结果中可能包含更多代码。
与更传统的JavaScript库相比,使用Closure-compiler与Closure-library之间的区别在于,只有确定要调用和使用的代码部分才包含在输出中。这比简单的文件包含更精细 - 原型,变量,常量等都将被排除,因为编译器可以确定它们从未被使用过。
如果要构建依赖Closure-library的库,则有两种选择。
分发已编译/构建的版本
你可以使用Closure-library编译你的库;导出任何公共API方法和属性。使用Closure-compiler或Closure-library的库的其他人需要使用externs文件并在编译后包含你的库。
将您的图书馆分发为来源
您只需分发您的库源代码。其他人会goog.require
将您的库作为其源和构建过程的一部分。如果在两个项目中都使用了Closure-library,那么它只会在构建过程中包含一次。
没有混合方法可以编译代码但排除Closure-library。这违反了所有源代码将同时编译的原则。
您可以仔细阅读我的Geolocation-marker library以查看示例。我提供了一个编译的独立代码版本供使用,但未编译的源代码也可以包含在使用Closure-library的其他项目中。