Node.js模块化

Nodejs模块化及使用

Posted by wang chong on January 23, 2019

模块化的概念与意义

  1. 为了让Nodejs的文件可以相互调用,Nodejs提供了一个简单的模块系统
  2. 模块是Nodejs应用程序的基本组成部分
  3. 文件和模块是一一对应的。一个Nodejs文件就是一个模块
  4. 这个文件可能是JavaScript代码、JSON或者编译过的C/C++扩展
  5. Nodejs中存在4类模块(原生模块和3种文件模块:3种文件模块是第三方提供的,原生模块是node原生支持的)

Nodejs中的模块

NodeJS通过require方法加载模块,通过exports导出模块

module.exports导出单个模块

exports.xxx=xxx 导出模块对象

require方法接受一下几种参数的传递

  1. http、fs、path等原生模块
  2. ./mod或者../mod等相对路径的文件模块
  3. /pathtomodule/mod 绝对路径的文件模块
  4. mod 非原生模块的文件模块

模块的三种加载方式

  1. 从文件模块缓存区中加载
  2. 从原生模块加载
  3. 从文件中加载

Nodejs的模块加载流程

文件模块缓存区的作用:防止模块被反复的加载。节省内存,加快了模块的加载速度

  1. 开始require加载模块,首先判断是否在文件模块缓存区中,如果在就在缓存区中通过exports导出;
  2. 如果不在文件模块缓存区就去查找是否是原生模块(原生模块和第三方模块是不在同一个内存缓存区的),
    1. 跳转查看是否在原生模块缓存区中,如果在的话就在缓存区中通过exports导出;
    2. 如果不在原生模块缓存区中,那么就去加载原生模块,加载原生模块的同时,把加载的原生模块放到原生模块缓冲区中,通过exports导出;
  3. 如果不是原生模块,就是查找第三方的文件模块,根据扩展名载入响应的文件模块,把载入的文件模块放入文件模块缓存区中,通过exports导出。

模块加载代码示例

test.js为子模块

const Test = function(){
    var name;
    this.setName = function(newName){
        name = newName;
    }
    this.sayName = function(){
        console.log(name);
    }
}
modules.exports = Test;

main.js为主模块

const Test = require('./test');
const test = new Test();
test.setName('wang');
test.sayName(); //wang