美文网首页前端包浆记
NodeJs之初体验08--啥是模块

NodeJs之初体验08--啥是模块

作者: 水云楼 | 来源:发表于2019-02-12 15:50 被阅读0次

    在Node环境中,一个.js文件就称之为一个模块(module)
    Node.js 提供了 exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象。
    那么使用模块有什么好处呢?

    1、 提高了代码的可维护性
    2、 提高了代码的延展性,当一个模块编写完毕,就可以被其他地方引用。
    3、 避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中。

    一个js文件就是一个模块,那么我们先简单创建一个学生模块

    let name = '张三';
    function studen1(){
        console.log('这是我的一个学生:',name)
    }
    function studen2(){
        let age = 14;
        console.log('这是我的一个学生:',name,'今年',age,'岁了')
    }
    exports.studen1 = studen1;
    exports.studen2 = studen2;
    

    然后我们在别的模块对其进行调用:

    let mode = require('./student');
    mode.studen1();
    mode.studen2();
    
    调用结果

    1、 首先我们创建一个student.js的文件,他就是我们的student模块啦,在这个模块我们虚拟了一个学生-张三,里面提供了两个方法,用来介绍姓名,和姓名年龄。并且使用exports关键字将方法暴露出去。
    2、 我们创建一个测试文件module_test.js,在里面使用require()引入student模块
    3、 执行student模块暴露出来的api方法。得到输出结果
    前面提到exports是负责将模块的api暴露出去的,通过在特殊的 exports 对象上指定额外的属性,函数和对象可以被添加到模块的根部。
    我们查看node-module模块的api发现其实暴露api的方式有两种,分别是:


    上面我们已经证实可以使用exports.xxx = ${ functionName };的方式将属性或函数暴露出去,通过写法我们可以判断其实node.js提供了一个空的对象变量exports,因为JavaScript是弱编码语言,所以我们可以将需要暴露的api或属性通过点的方式绑定到exports对象上,经由exports对象传递出去。
    那么module.exportsexports有什么不同呢?
    官方给出的介绍是:

    在每个模块中,module 的自由变量是一个指向表示当前模块的对象的引用。 为了方便,module.exports 也可以通过全局模块的 exports 对象访问。 module 实际上不是全局的,而是每个模块本地的。

    我们用一个例子测试一下,

    let name = '张三';
    function studen1(){
        console.log('这是我的一个学生:',name)
    }
    function studen2(){
        let age = 14;
        console.log('这是我的一个学生:',name,'今年',age,'岁了')
    }
    exports.s1 = studen1;
    exports.s2 = studen2;
    exports.name = name;
    
    console.log('exports--->',exports);
    console.log('module.exports--->',module.exports);
    console.log(exports===module.exports)
    

    我们用exports暴露api 同时比对原对象的module.exports,结果如下:



    发现他们其实是一回事,我们将module打印出来



    Module对象的exports就是我们暴露的exports
    那么我们用module.exports暴露呢?
    module.exports = {s1:  studen1, s2:studen2, name: '张三'}
    

    输出的结果exports变为了空对象,自然两者对比为false
    至此我们得出结论

    • 通过exports导出的函数或属性,会传递给module.exports。二者没区别。
    • 而通过module.exports导出的对象不会传递给exports。也就是说当我们使用module.exports进行导出api的时候exports并不会进行赋值。
      这也是从侧面证明了对象的根本还是在module对象中,而且当同时声明两种方式的时候,当 module.exports声明在前,在exports声明的时候不会修改已声明的module.exports,(也就是说一旦module.exports有值后,此时两者其实就已经没有对应关系了),如果exports声明在前,当module.exports声明的时候会覆盖掉exports传递过来的对象,并单方面截断两者联系(有点厉害啊)
      所以module.exports明显更强势一些。

    相关文章

      网友评论

        本文标题:NodeJs之初体验08--啥是模块

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