• Node.js:模块


    概要本篇博客主要介绍node.js的模块

    1.创建模块

      在node.js中创建一个模块非常简单,因为一个文件就是一个模块。我们只需要明白如何从其他文件中获取这个模块。Node.js提供了 exportsrequire 两个对象,其中exports是模块的公开接口,require用于从外部获取一个模块的接口,即所获取模块的exports对象。看下面的例子。

    创建一个module.js的文件,内容是:

    var name;
    
    exports.setName = function(thyName){
        name = thyName;
    };
    
    exports.sayHello = function(){
        console.log('hello'+name);
    }

    在同一级目录下创建getmodule.js,内容是:

    var myModule = require('./module');
    
    myModule.setName('BYVoid');
    myModule.sayHello();

    运行getmodule.js,得到的结果是:hello BYVoid。

      你也许已经能理解exports和require对象的区别了吧。module.js通过exports对象把setName和sayHello作为模块的访问接口,在getmodule.js中通过require('./module')加载这个模块,然后就可以直接访问module.js中的exports对象的成员了。

    2.单次加载

      require不会重复加载模块,并且最终输出的结果是由后者决定的,就像同样的定义CSS属性,后者会覆盖前者一样。

      例如,我们在getmodule.js的基础上稍作修改:

    var hello1 = require('./module');
    hello1.setName('BYVoid 1');
    
    var hello2 = require('./module');
    hello2.setName('BYVoid 2');
    
    hello1.sayHello();

    运行的结果是: hello BYVoid 2。这是因为变量hello1和hello2指向的是同一个实例,因此hello1.setName的结果被hello2.setName覆盖。

    3.覆盖exports

      有时候我们只是把一个对象封装到模块中,例如:

    function Hello(){
        var name;
        this.setName = function (thyName) {
            name = thyName;
        };
        this.sayHello = function () {
            console.log('Hello' + name);
        };
    };
    
    exports.Hello = Hello;

      此时我们在其他文件中需要通过require('./singleobject').Hello来获取Hello对象,这略显冗余,因此可以用下面的方法稍微简化:

    function Hello() { 
        var name; 
        this.setName = function(thyName) { 
            name = thyName; 
        }; 
        this.sayHello = function() { 
            console.log('Hello ' + name); 
        }; 
    }; 
    module.exports = Hello;

    这样就可以直接获得这个对象了:

    var Hello = require('./hello');
    
    hello = new Hello();
    hello.setName('BYVoid');
    hello.sayHello();

      注意:模块接口的唯一变化就是使用module.exports = Hello代替了exports.Hello = Hello。在外部引用该模块时,其接口对象就是要输出的Hello对象本身,而不是原先的exports。

      警告:不可以通过对 exports 直接赋值代替对 module.exports 赋值。exports 实际上只是一个和 module.exports 指向同一个对象的变量,它本身会在模块执行结束后释放,但 module 不会,因此只能通过指定module.exports 来改变访问接口。

  • 相关阅读:
    测试篇 尝了一下net5.0桌面开发
    日志篇 vs的文本替换,剔除引号保留数字 将vs2019更新之后无法用ctrl+d
    测试篇 使用 nuget.exe CLI 创建 nuget 包
    日志篇 博客园的下方的女孩透明的,带点击声音的
    测试篇 c#文件类型关联启动程序
    数学篇 求两条直线的交点,说明过程.
    日志篇 原生git笔记
    测试篇 winform Anchor 怎么临时取消关联,窗口边界和控件关联
    cad.net dll动态加载,插件式架构,在dll查找引用了的dll,查找dll依赖,dll热插拔,加载dll运行出错.
    cad.net 图元反应器,图元事件,要加在提交数据库之后哟
  • 原文地址:https://www.cnblogs.com/koto/p/5692433.html
Copyright © 2020-2023  润新知