CommonJS是试图给现有的javascript做一个补充,增加一些独立于浏览器 的东西定义,这些东西定义出来就是CommonJS api,而定义这些api的详细说明,就是CommonJS的规范,相应的去实现这些api的东西,就是库;所以我们可以说CommonJS就是一组规范 定义的接口再加上实现这些接口的库;简单来说就是 CommonJS = spcifications + apis + libs;而我们自己写代码也学CommonJS的样子来,那么在这个意义上来说,CommonJS也可以说是一种代码书写风格。
目前的CommonJS规范含有3块内容,分别为 Modules/Packages/System;对应汉语就是模块/包/系统;分别说明怎么搞一个模块,怎么打一个包,和作为通用的系统接口来说,应当 提供什么东西;下面我们关注一下Modules的规范,其他2个的规范:http://www.commonjs.org/specs/
1. 每个模块里面都应当有个函数叫require;
1.1 require接收模块描述符作为参数
1.2 require的返回值就是那个描述符描述的模块导出(export)的api
1.3 如果存在循环依赖,那么require返回的应当是那个模块在循环依赖产生前已经可以导出的api;
1.4 如果那个模块有问题,要抛出个错误来,就是说别悄没声的装作完事了;要大喊一声你有病啊;
2. 每个模块都应当有个叫exports的变量,好把自己的api都塞进去;
3. 模块必须把exports作为导出api的唯一方法;
一句话:就是引用另一个模块要使用require函数,require呢就只认识exports,把你exports的东西给返回去
3. CommonJS的好处:
我们所使用的Titanium虽然实现了CommonJS规范,但不过并非其的忠实实现,而是自己做了一些扩充,详细的文档请参阅https://wiki.appcelerator.org/display/guides/CommonJS+Modules+in+Titanium , 这里面需要额外说明一下module.exports,从文档中的解释来说这哥们是个对象,是用来导出表示模块内对象的;以在下的理解,titanium mobile里面特意搞这个就是用来区分对象与函数集的;假如一个模块仅仅是需要导出一些接口,那么请使用exports,如果一个模块需要导出一个对象,请使用module.exports;对象与函数集的区别就在于函数集中的各个函数之间不需要有共同需要的变量,尤其是某些状态变量;对象则不同是有自己的数据的,这些数据就表明了这个对象的状态,而对象中的函数,所操作的应当都是本对象的数据;具体到实际的titanium mobile项目中,对于工具类函数集,比如您需要个大小写切换的函数,那么就就写一个exports.convertCase = function(...){...};假如你你需要创建一个窗口(View)啊模型(Model)啊控制器啊(Controller)什么的,请使用 module.exports;
最简单的CommonJS: