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

标签 javascript google-closure-compiler google-closure-library

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

我打算让这个库供那些也需要完整闭包库的应用程序使用,因此我想要我的库的构建版本(任务运行程序)而不是包括闭包库的子集。如果任务运行程序包含闭包库的子集,而另一个应用程序包含完整闭包库,则最后加载闭包之间将存在竞争条件(最后一个获胜)。它还会使任务运行程序文件的大小膨胀。

但是我遇到了麻烦。如果我不需要任何 Closure 库类,Task Runner 构建得很好(显然)。但是,如果我需要某些东西(例如 goog.dom),那么我的“编译”JavaScript 文件还包含 Closure 库的一部分。有没有办法告诉闭包编译器将某些 JavaScript 文件/模块/任何内容排除在构建结果之外?

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

最佳答案

表面上看你的要求毫无意义。您想要依赖/使用 Closure-library 中的代码,但不将其包含在输出中。这实际上是不可能的,库和编译器如何一起工作也是不可能的。

Closure-library 中定义了一个相当小的原始函数列表,当使用 Closure-compiler 编译时,它们被完全删除/替换。 goog.requiregoog.provide 是其中最突出的两个。

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

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

分发库

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

  1. 分发编译/构建版本
    您可以使用 Closure-library 编译您的库;导出任何公共(public) API 方法和属性。其他通过 Closure-compiler 或 Closure-library 使用您的库的人将需要使用 externs 文件并在编译后包含您的库。

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

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

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

关于javascript - 如何分发使用 Closure-library 的库而不包含任何实际的 Closure-library 源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28258386/

相关文章:

javascript - AngularJS ng-Cloak 不起作用

javascript - 在 react/redux 中传递多个 props 和 action

javascript - Element.prototype.remove - 关闭编译器警告

wysiwyg - 谷歌关闭编辑器/所见即所得

javascript - 有没有办法在不使用全局对象的情况下获得 `goog.provide` 的东西?

javascript - 如何进行 AJAX 调用

google-closure-compiler - 如何包含谷歌关闭的依赖项

javascript - 在源上运行测试,然后在其缩小版本上运行

javascript - 是否有与 goog.object.extend 等效的纯函数?

javascript - 无法从ajax div调用javascript