Clojure 实用至上,ClojureScript 亦然。随着越来越多的应用面向 Web 和移动环境,JavaScript 的作用和影响力也超越了浏览器的范围,扩展到更受限的环境,如移动设备,这些设备之间存在着无处不在的网络连接。Google Closure 工具提供了一套强大的库、一个强大的依赖管理系统和一个精密的编译器,它们共同努力实现最终目标:缩减 JavaScript 代码大小。对于 ClojureScript 而言,Google Closure 通过三种不同的方式为 JavaScript 提供了“库问题”的解决方案。
库
依赖管理
积极的代码压缩
这些功能中的每一个都代表了数千小时的研究、设计、开发和测试。因此,ClojureScript 在其实现中利用了这些功能,让 Clojure/core 团队和贡献者能够专注于在 JavaScript 所在的任何地方启用 Clojure 的强大功能。
ClojureScript 是用 Clojure 编写的,ClojureScript 与 Google Closure JavaScript 库交互。但是,ClojureScript 可以与任何 JavaScript 库或框架交互。在 ClojureScript 核心代码中使用Google Closure 库是一种实现策略,它使我们能够减少依赖并确保与高级模式编译的兼容性(见下文)。
Google Closure 的依赖管理系统提供了三个基本原语:addDependency
、provide
和 require
,它们允许在编译时包含依赖项。ClojureScript 对这些原语进行了封装,通过 ns
表达式提供访问。此功能用于允许对 ClojureScript 命名空间和函数进行细粒度的导入和导出,以及用于互操作目的的外部 JavaScript 库。
Google Closure 工具提供了一个压缩编译器,可以通过命令行标志将其用于 ClojureScript 编译过程。总而言之,压缩编译器接收 ClojureScript 编译器生成的 JavaScript 代码,并将变量重命名为更短的名称,删除空格,删除注释等,从而在保持程序语义的同时减少源代码大小。
Google Closure 编译器提供了一个高级设置,允许使用比上面概述的策略更激进的压缩策略。实际上,Google Closure 编译器使用高度复杂的技术来识别和消除死代码(即从未调用或无法访问的代码)。这种做法的缺点是,JavaScript 代码的样式必须符合严格的标准才能实现最大的压缩潜力。因此,ClojureScript 团队的目标是通过遵守这些习惯用法以及使用 Closure 库和依赖系统,确保生成的 JavaScript 代码具有最大的压缩潜力。
Google Closure 工具的主要参考资料是 O’Reilly 的Closure: The Definitive Guide,由 Michael Bolin 编写。这本书强烈推荐给任何希望利用 ClojureScript 互操作性的全部力量的人、ClojureScript 贡献者以及那些仅仅对高级 JavaScript 技术和工具感兴趣的人。