CommonJS是如何提高javascript的生产力的
javascript最初的设计没有包括一个良好的代码组织特性,没有import也没有include,从语言上来说非常的不成熟;但是在最初的网络环境中,javascript运转的很好,因为当时的网络环境非常简单,javascript也只是当做一个内嵌在浏览器里的脚本语言,用来帮助程序员完成一些简单的任务。
但是随着硬件性能的提高,网络带宽的提升,用户可以从网络上得到的信息和资源也越来越多,作为唯一一个在网络客户端普遍的编程语言,javascript的任务也就越来越多,从最多不会超过500行的html内嵌脚本,到现在动辄上万行的大型library,如果不能很好的组织代码,是无法完成一个大型项目的。比如说大家写java,如果没有package,那么你开发的类库命名为A, 我非常想复用你写的类库,但是我的老代码里面也已经有了一个A,我要么需要去修改我的代码要么就得在你的代码上再做修改,浪费了人力。特别是,如果你开发的程序一部分是import(module),我开发的东西是include(module),import在我这是用来读取文件,我们这两部分的程序就无法互相复用,都"reinvente wheel“. javascript偏偏没有提供这种功能,于是程序员们自己在语法之上设计类一系列的common practise,也就是约定习惯。
约定习惯对于动态语言来说是非常重要的,因为动态语言不能像静态语言那样在执行前进行编译器检验,在某一刻一个对象一个模块的类型或功能是随时可能会被改变的,语言上没有提供支持的情况下,大家一起形成一个规范的习惯,则能够有效的减少在构建大型项目之间的交流工作。同时也动态语言本身也提供了非常好的灵活性,这也是为什么ror的习惯大于配置相比于spring要更加优秀的原因。
而javascript的一些大牛们也想做这样一件事,统一大家的编程习惯,使得大部分人能够一起来做一个大的项目,而你开发的代码由于遵循了一些共同的接口,我开发项目时就能直接拿来用,中间不需要一个再学习的过程。大大的提高了代码的复用, 所以现在网上如雨后春笋般的爆发出来这么多的javascript的类库,javascript忽然间变得强大了许多,不如测试我知道可以直接去用should.js,访问mongodb可以直接用mongojs。而且我知道我只需要简单的require就可以引用这些类库同时不用担心他们会”弄脏“我自己的代码。这样我再也不需要重写这些功能,也不用去费劲脑筋去整合这些类(以前如果你用了jquery的同时还向利用prototype的时候,非常头痛的要注意加载顺序,否则Date类可能是意想不到的一个lib里的)。
那些试图在javascript中建立起一套common practise使之成为javascript程序员都遵循的习惯的人,他们的讨论结果就是common js。
common js定义了一系列的标准(specification),包括console,filesystem,binary等,所以我们用到console的时候知道一定会有console.log,使用fs的时候可以fs.open,fs.write等。其中最重要的一部分就是定义module, http://www.commonjs.org/specs/modules/1.0/ 这个规范里定义了一个javascript的module应该遵循那些标准,这样别人遵循这样的标准就可以轻易的使用这个module。
例子:
在math.js中定义了add方法
// File: math.js exports.add = function() { var sum = 0, i = 0, args = arguments, l = args.length; while (i < l) { sum += args[i++]; } return sum; };
通过使用require('math'),increment.js引用了在math.js中定义的方法
// File: increment.js var add = require('math').add; exports.increment = function(val) { return add(val, 1); };
program.js中引用increment.js的方法,这里require('increment')实际上返回的是increment.js中的exports
//File: program.js var inc = require('increment').increment; var a = 1; inc(a); // 2
这样分布在世界上不同角落的人可以一起协作开发,你开发filesystem,我开发network,这些类库都可以一起工作了。重复劳动减少,类库越来越丰富的同时开发者的开发工作也越来越容易,因为很多东西在网上可以找到别人开发的library的支持。所以nodejs也很容易的就火了!