7.创建及加载模块

模块(Module)和包(Package)是 Node.js最重要的支柱。开发一个具有一定规模的程序不可能只用一个文件,通常需要把各个功能拆分、封装,然后组合起来,模块正是为了实现这种方式而诞生的。
1.什么是模块;
2.如何创建并加载模块;
3.如何创建一个包;
4.如何使用包管理器;

1.什么是模块 ==> 一个文件就是一个模块

模块是 Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON或者编译过的 C/C++ 扩展。
在前面章节的例子中,我们曾经用到了 var http = require('http'),其中 http 是 Node.js 的一个核心模块,其内部是用 C++实现的,外部用 JavaScript 封装。我们通过 require 函数获取了这个模块,然后才能使用其中的对象。

2.创建模块

创建一个模块非常简单,因为一个文件就是一个模块,我们要关注的问
题仅仅在于如何在其他文件中获取这个模块。
exports ==> 模块公开的接口
require ==> 用于从外部获取一个模块的接口,即所获取模块的 exports 对象。

// 创建一个模块文件 module.js 
var  name; 
exports.setName =  function (thyName) { 
  name = thyName; 
}; 
exports.sayHello = function () { 
  console.log('Hello ' + name); 
};

引入模块, 在同一目录下创建 getmodule.js ,内容是: 

var  myModule1 = require('./module'); 
myModule1.setName('Alan'); 
myModule1.sayHello();   // Alan
// module.js 通过  exports  对象把 setName 和  sayHello 作为模块的访问接口,
在 getmodule.js  中通过 require('./module') 加载这个模块,然后就可以直接访问 module.js  中  exports 对象的成员函数了。
npm提供的上万个模块都是通过这种简单的方式搭建起来的。

没有重装, 后者覆盖前者

var myModule2 = require("./module.js");
myModule2.setName("Alan2");
var myModule3 = require("./module.js");
myModule3.setName("Alan3");
myModule1.sayHello();   // Alan3
myModule2.sayHello();   // Alan3
myModule3.sayHello();   // Alan3

3.覆盖exports

有时候我们只是想把一个对象封装到模块中,例如:singleobject.js
在其他文件中需要通过 require('./singleobject').Hello 来获取
Hello 对象,这略显冗余

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

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

//使用模块接口module.exports ==> hello.js
function  Hello() { 
  var  name; 
  this.setName =  function (thyName) { 
    name = thyName; 
  }; 
   
  this.sayHello = function () { 
    console.log('Hello ' + name); 
  }; 
}; 
module.exports = Hello;

这样就可以直接获得这个对象了 ==> gethello.js
var  Hello = require('./hello.js'); 
hello =  new  Hello(); 
hello.setName('Wu'); 
hello.sayHello(); 
// 事实上,exports  本身仅仅是一个普通的空对象,即{},它专门用来声明接口,本质上是通过它为模块闭包①的内部建立了一个有限的访问接口。因为它没有任何特殊的地方,所以可以用其他东西来代替,譬如我们上面例子中的 Hello 对象。 

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

原文地址:https://www.cnblogs.com/alantao/p/7953828.html