美文网首页我爱编程
node.js模块的创建和使用

node.js模块的创建和使用

作者: codingQi | 来源:发表于2016-12-11 23:53 被阅读0次

    前言

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

    连续引用,结果如下:

    总结

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

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

    相关文章

      网友评论

        本文标题:node.js模块的创建和使用

        本文链接:https://www.haomeiwen.com/subject/mvspmttx.html