如何分发使用 Closure-library 的库而不包含任何实际的 Closure-library 源代码?

How to distribute a library which uses Closure-library without including any of the actual Closure-library source?

我最近使用 Google 的闭包编译器创建了一个 JavaScript 库:https://github.com/bvaughn/task-runner

我打算让 也需要完整 Closure Library 的应用程序使用此库,因此我想要我的库(Task Runner)的构建版本 not 以包含 Closure 库的一个子集。如果 Task Runner 包含 Closure Library 的一个子集,而另一个应用程序包含 full Closure Library,则在最后加载 Closure 之间将存在竞争条件(last in wins)。它还会增大 Task Runner 文件的大小。

但是我遇到了麻烦。如果我不需要任何 Closure 库 类,Task Runner 构建良好(显然)。但是,如果我需要某些东西(例如 goog.dom),那么我的 "compiled" JavaScript 文件也包含 Closure 库的一部分。有没有办法告诉 Closure 编译器在构建结果中保留某些 JavaScript files/modules/whatever?

FWIW,Plovr experimental-exclude-closure-library 选项似乎在某种程度上描述了我正在寻找的功能。

从表面上看,您的要求毫无意义。您想要依赖闭包库中的 on/use 代码,但不将其包含在您的输出中。这实际上是不可能的,库和编译器如何协同工作。

Closure 库中定义了一个相当小的原始函数列表,当使用 Closure 编译器编译时,它们完全 removed/replaced。 goog.requiregoog.provide 是其中最突出的两个。

对于绝大多数 Closure-Library,如果您使用或依赖 class,特定代码将出现在编译输出中的方法或对象。而且由于该库代码本身可能依赖于库的其他部分,因此编译结果中可能包含更多代码。

与更传统的 JavaScript 库相比,将 Closure-compiler 与 Closure-library 结合使用的区别在于,只有确定要调用和使用的代码部分包含在输出中。这比简单的文件包含更精细 - 原型、变量、常量等都将被排除,因为编译器可以确定它们从未被使用过。

分发库

如果您正在构建一个依赖于 Closure-library 的库,您有两个选择。

  1. 分发一个 compiled/built 版本
    您将使用 Closure-library 编译您的库;导出任何 public API 方法和属性。其他通过 Closure-compiler 或 Closure-library 使用您的库的人将需要使用外部文件并在编译后包含您的库。

  2. 将您的库作为源分发
    您只需分发您的库源代码。其他人会将 goog.require 您的库作为其源代码和构建过程的一部分。如果在两个项目中都使用了 Closure-library,它只会在构建过程中包含一次。

没有编译代码但排除 Closure-library 的混合方法。这违反了所有源代码将同时编译的原则。

您可以仔细阅读我的 Geolocation-marker library 以查看示例。我提供了编译后的独立版本的代码供使用,但未编译的源代码也可以包含在其他使用 Closure-library 的项目中。