您的位置:首页 > Web前端 > JavaScript

CommonJS是如何提高javascript的生产力的

2012-07-14 16:47 141 查看
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也很容易的就火了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: