在开发一个复杂的应用程序的时候,我们需要把各个功能拆分、封装到不同的文件,在需要的时候引用该文件。没人会写一个几万行代码的文件,这样在可读性、复用性和维护性上都很差,几乎所有的编程语言都有自己的模块组织方式,比如Java中的包、C#中的程序集等,node.js使用模块和包来组织,其机制实现参照了CommonJS标准,虽未完全遵守,但差距不大,使用起来非常简单。
模块在node.js中的概念很简单,看看如何创建一个我们自己的模块供开发复用。
在node.js中创建模块非常简单,一个文件就是一个模块,所以我们创建一个module_1.js文件就创建了一个模块
console.log("load moudle_1.js"); var name=''; function setName(n){ name=n; } function printName(){ console.log(name); } exports.setName=setName; exports.printName=printName;
问题是怎么使外部访问这个module,我们知道客户端的JavaScript使用script标签引入JavaScript文件就可以访问其内容了,但这样带了的弊端很多,最大的就是作用域相同,产生冲突问题,以至于前端大师们想出了立即执行函数等方式,利用闭包解决。node.js使用exports和require对象来解决对外提供接口和引用模块的问题。我们可以把模块中希望被外界访问的内容定义到exports对象中,例如
var m = require("./moudle_1.js"); m.setName("thd"); m.printName(); var m2 = require("./moudle_1.js"); m2.setName("thirdteendevil"); m2.printName(); m.printName();
我们可以把module_1.js中的exports看做是一个对象,在app_1.js中第一行require("./moudle_1.js");返回的就是moudle_1.js中的exports对象。(不晓得是不是真的这样啊,仅仅是个人猜测)
再看一种情况
moudle_2.js:
console.log(" load moudle_2.js "); var Student = function(name){ this.name = name; } Student.prototype = { getName : function(){ return this.name; }, setName : function(name){ this.name = name; } } exports.Student=Student;
app_2.js
var Student = require("./moudle_2.js").Student; var s1 = new Student("thd"); console.log(s1.getName()+"|||"); var s2 = new Student("thirdteendevil"); console.log(s2.getName()+"|||"); console.log(s1.getName()+"|||");
在moudle_2.js中,exports.Student指向了一个函数(类),在app_2.js中第一行代码require("./moudle_2.js")按照上例的理解,返回的是moudle_2.js中的exports,但moudle_2.js中最后定义了exports.Student=Student,
所以在app_2.js中如果要使用exports.Student属性则需要写成var Student = require("./moudle_2.js").Student;
综上所述,将require("./xxx.js")理解为 xxx.js中的exports对象就可以了。
初学nodejs以上内容均为个人理解,如有不当之处,还望高手指点。
注:模块的英文是module以上的文件因个人英语水平全部写成了moudle,自行修改吧。。。