前言
这两天开始钻研node,因为我的毕设题目是基于node.js的,虽然暑假做项目接触了一些,不过现在无论如何都要深入学习,不仅是为了毕设,也是为了明年去公司的工作。
正文
在node.js里面,文件和模块是一一对应的。
模块有几种不同类型,大体上可以分为核心模块、本地(文件)模块、第三方模块(通过npm安装)。
根据模块类型,有几种引用方式:
- 在node.js里面可以通过文件路径来引用模块;
- 也可以通过模块名来引用。
- 如果用名称引用非核心模块的话,node最终会把模块名影射到对应的模块文件的路径;
非核心模块包括使用npm安装的第三方模块以及同事创建的本地模块。 - 而那些包含了核心函数的核心模块,会在node启动时被预先加载。
实现node.js所谓的模块
流程解析:
- 首先是创建模块,也就是一个入口的js文件,里面加入了一些特定的功能。
- 然后导出这个模块,把这个功能跟这个文件也就是这个模块名建立了关系。
- 紧接着就是加载模块,在其它的文件里面引入并加载这个模块,在node.js里面使用require这个函数来完成这个工作。
- 最后就是使用模块,直接调用模块中命名好的这个方法来做一些特定的逻辑处理,完成某种功能。
come on!!!
前面说的都是些文字说明,然后下面就可以开始做练习来实践:
说明:一个学校有好多个班;一个班里有一个老师,好多同学。因此我们可以通过模块化来完成他们之间的关系。从小方面开始,老师是一个模块(teacher.js),学生是一个模块(student.js),班级是一个模块(class.js),且都在学校(school)这个文件夹下,如下新建js文件。
第一步
老师与学生都有姓名,在js文件里写如下代码,添加add方法。
teacher.js
function add(teacher) { //传入老师的名字
console.log('Add Teacher:' + teacher); //然后把这个老师的名字打印出来
}
//光写方法还没有用,要把这个add方法暴露出去
exports.add = add; //通过一个对象,叫做exports,这个exports它是一个对象,上面就可以挂载任何合法的javascript对象,属性,Number,Date,Json,String,包括Array等等
同理,student.js也要添加add方法,只需将teacher.js里的teacher换成student就好。
student.js
function add(student) {
console.log('Add Student:' + student);
}
exports.add = add;
第二步
接下来就是班级了,班级里需要加载老师跟学生,分配相关的职责等等。新建一个文件,class.js,我们可以使用require函数来加载模块,不用担心在代码里面调用require会影响全局的命名空间,因为node里面就没有全局命名空间的概念。
如果模块存在并且没有任何语法、或者说初始化的错误,require函数就会返回这个模块对象。这个模块对象就是前面所说的exports。
class.js
//使用模块之前要将模块导入
var student = require('./student');
var teacher = require('./teacher');
//1、被引入的脚本即student和teacher,每一个被当前脚本导入的模块都会向当前这个脚本暴露一组公开的API(.add)
teacher.add('qiqi');
//3、接下来实现一个班级的代码,加一个add的方法
function add(teacherName, students) { //传入的参数students是一个数组
teacher.add(teacherName);
students.forEach((item, index) = >{
student.add(item);
})
}
//2、把属性赋予给module.exports的结果和把属性赋予给exports是一样的。
//module.exports = add;
exports.add = add;
- module.exports与exports的区别
- 如果想让你的模块成为一个特别的对象类型,那么请使用module.exports.
- 如果你希望你的模块成为一个传统的模块实例,那就使用exports。
module.exports是真实存在的东西,exports是module.exports的一个辅助方法。
- 注意:
这个模块最终返回的module.exports给调用者,exports挂载属性和方法,然后把属性再赋给module.exports。
如果module.exports后面已经有了属性,那么exports上的就会被忽略,当然我们推荐使用exports这种方式,除非你想把你的模块对象类型从传统的模块实例修改成其他的。
第三步
最后新建一个启动文件index.js
index.js
var klass = require('./class');
klass.add('qiqi', ['小王','小名','小里']);
结果在终端运行,输入node index.js
,点击回车,如下:
第四步
将index.js暴露出去,新建result.js来调用它
传入好多个班级,将这个学校暴露出去。(传入的classes是个数组,数组里嵌套着对象)
index.js
var klass = require('./class');
exports.add = function(classes) {
classes.forEach((item, index) = >{
var _klass = item;
var teacherName = _klass.teacherName;
var students = _klass.students;
klass.add(teacherName, students);
});
};
result.js
var index = require('./index');
var classes = [{
teacherName: 'qiqi',
students: ['aa1', 'aa2']
},
{
teacherName: 'yueyue',
students: ['bb1', 'bb2']
}];
index.add(classes);
连续引用,结果如下:
总结
坚持了两天,后面会继续,加油~~
有没有搞清楚各个模块的作用与联系呢??,在每个模块里写入要实现的功能,如果后面要实现很复杂的项目组件与模块,就很容易上手。