node.js模块的创建和使用

前言

这两天开始钻研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);

连续引用,结果如下:

总结

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容