2.5 模块与CommonJS
Node应用程序构建——使用MongoDB和Backbone
Node引发了服务器端JavaScript编程的巨大兴趣,更别提对一般JavaScript的影响了。但这不是JavaScript第一次脱离浏览器作为工具,实际上,JavaScript在网景公司的浏览器中首次亮相之后不久,该公司发布的一个Web服务器就包含了该语言。不到一年后,微软的因特网信息服务(IIS)服务器软件也开始支持服务器端JavaScript(他们的方言称为JScript)。大约在同一时间,网景打算使用Java编程语言重写他们的旗舰Web浏览器,该项目最终产生了Mozilla的Rhino JavaScript引擎。
如果这听起来像是一个快速碎片化的市场,请想象一下试图为一个现有服务器产品编写JavaScript代码,然后在其他地方重用同样的代码。如果你的应用足够小,你或许可以通过一些修改对付过去。任何正常大小的应用程序很快会发现,这时需要调用外部库和模块化组件,否则最后将得到一个乱成一团、无法维护的几千行脚本代码的大文件。每个服务器都有不同的方法来划分应用代码,但没有统一标准。一旦选用了一种,你就被套牢了。
情况并没有好多少,虽然今天在代码开发标准化、命名空间保护、对象创建和模块化方面已经取得了重大进步。CommonJS旨在为脱离浏览器的JavaScript提供一套标准规范,其中许多已经被Node采用。如果你刚开始使用Node,而你的应用程序已经大到不合适放在一个文件中,那么你必须知道,你的应用无法使用外部文件中声明的变量,除非显式地使用exports关键字使它们可见。
例2-9展示了一个简单的Node.js模块,它暴露出一个函数:getFlagWidth,用于计算美国国旗的法定宽度,宽度必须1.9倍于国旗的高度;这个比例存储在名为FLAG_WIDTH的变量中。函数getFlagWidth获取高度值并乘以宽高比例,为给定的国旗高度产生对应的宽度。
例2-9 计算国旗宽度的模块
如果你在应用中包含这个文件,你将能够访问getFlagWidth函数,它使用exports关键字暴露接口,而不是FLAG_WIDTH变量。FLAG_WIDTH可以认为是一个“私有”变量,只能在该模块的上下文中访问,而不能在整个应用范围内访问。