我爱编程

node.js模块的创建和使用

2016-12-11  本文已影响0人  codingQi

前言

这两天开始钻研node,因为我的毕设题目是基于node.js的,虽然暑假做项目接触了一些,不过现在无论如何都要深入学习,不仅是为了毕设,也是为了明年去公司的工作。

正文

在node.js里面,文件和模块是一一对应的。
模块有几种不同类型,大体上可以分为核心模块本地(文件)模块第三方模块(通过npm安装)
根据模块类型,有几种引用方式:

  • 在node.js里面可以通过文件路径来引用模块;
  • 也可以通过模块名来引用。
  1. 如果用名称引用非核心模块的话,node最终会把模块名影射到对应的模块文件的路径;
    非核心模块包括使用npm安装的第三方模块以及同事创建的本地模块。
  2. 而那些包含了核心函数的核心模块,会在node启动时被预先加载。
图示1

实现node.js所谓的模块

图示2
流程解析:
  1. 首先是创建模块,也就是一个入口的js文件,里面加入了一些特定的功能。
  2. 然后导出这个模块,把这个功能跟这个文件也就是这个模块名建立了关系。
  3. 紧接着就是加载模块,在其它的文件里面引入并加载这个模块,在node.js里面使用require这个函数来完成这个工作。
  4. 最后就是使用模块,直接调用模块中命名好的这个方法来做一些特定的逻辑处理,完成某种功能。

come on!!!

前面说的都是些文字说明,然后下面就可以开始做练习来实践:
说明:一个学校有好多个班;一个班里有一个老师,好多同学。因此我们可以通过模块化来完成他们之间的关系。从小方面开始,老师是一个模块(teacher.js),学生是一个模块(student.js),班级是一个模块(class.js),且都在学校(school)这个文件夹下,如下新建js文件。

图示3
第一步

老师与学生都有姓名,在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的区别
  1. 如果想让你的模块成为一个特别的对象类型,那么请使用module.exports.
  2. 如果你希望你的模块成为一个传统的模块实例,那就使用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);

连续引用,结果如下:

总结

坚持了两天,后面会继续,加油~~

有没有搞清楚各个模块的作用与联系呢??,在每个模块里写入要实现的功能,如果后面要实现很复杂的项目组件与模块,就很容易上手。

上一篇下一篇

猜你喜欢

热点阅读