初学Node(三)模块系统

模块系统

  Node根据CommonJS规范实现了一套自己的模块机制,可以使用require()导入一个模块,使用module.exports导出一个模块。

require使用

  在Node中我们可以使用require()导入一个模块,此时我们就会获得一个被导入模块的对象,我们就可以利用这个对象来完成一些操作,例如:

var fs = require("fs");
fs.readFile("content.txt",function(err,data){
    if(err){
        return console.log("读取文件错误!");
    }
    console.log(data.toString());
})

  我们通过require()将fs模块导入,此时我们就通过获得的fs模块的对象来实现对文件的操作。

  在Node中模块分为核心模块和文件模块,核心模块即被被编译成二进制代码的模块,是Node自带的一些模块。文件模块即我们自己编写的模块,无论哪种模块都可以通过require()函数来引入。

  require()的参数有四种不同的形式,分别为:

  核心模块:require("fs")

  相对文件路径:require("../xxx")

  绝对文件路径:require("/xxx")

  非核心模块的文件模块:require("xxx")

  加载模块的过程如下图所示:

require按照路径加载模块

  例如我们通过require("X")加载一个模块,首先会去文件模块缓存区中查找有没有该模块的缓存,如果缓存区中存在该模块,则直接返回。如果不存在该模块就会判断X的类型,如果是加载一个原生模块,就会按原生模块缓存区,原生模块这样的顺序去查找该模块,如果在原生模块缓存区中找到就会直接返回模块对象,如果在原生模块中找到就会在原生模块缓存区中加入该模块以方便下一次的使用,然后返回模块。

  如果X是一个路径类型首先把X当做文件按照X、X.js、X.json、X.node来查找该模块,找到之后加入到文件模块缓存区中然后返回该模块。如果没有找到,则把X当做是一个目录,在X里面按照index.js、index.json、index.node的顺序依次查找,如果目录中存在package.json则优先加载main属性对应的文件,在找到之后将模块加入到文件模块缓存区中然后返回该模块。

  我们在桌面上新建两个文件夹,分别为first和second,在first中新建first.js文件,first.js内容如下:

var name = "zt"
module.exports.show = function(){
    console.log(name);
}

  在sencond中新建main.js文件,main.js文件内容如下:

var first = require("../first");
first.show();

  在命令行中进入sencond文件node main.js执行,会报Error,不能找到first。我们按照上面的过程来排除错误,第一次加载文件缓存区中没有,也不是原生模块,此时就会按照路径的方式来加载first模块,首先把它当成一个文件,即在桌面中按照first、first.js、first.json、first.node的顺序来查找,都不存在,然后把first看错一个目录,然后在first文件内去查找,首先查看有没有package.json文件,存在就会加载main属性对应的文件,不存在就按照index.js、index.json、index.node的顺序来查找,仍然找不到最终就会报错。

  按照上面的流程我们可以通过三种方式来修改:

  1:在桌面上新建一个first.js,这时当按照文件来查找时就可以找到first.js,然后载入模块。

  2:在first文件夹中将first.js改名为index.js,这样在按照文件不能查找到,按照目录查找时就可以找到index.js,然后载入模块。

  3:在first文件夹中初始化一个package.json文件,main属性值为first.js,这样在按照目录查找时在目录中存在package.json文件就会加载main属性对应的文件。

require按照模块去查找

  例如在second的main.js中通过require("first")这种方式来加载first模块,使用这种方式来加载模块优先在当前文件夹(second文件夹)中查找node_modules文件夹,在node_modules文件夹中去查找first模块(在node_modules文件夹中也是按照路径的那个套路来查找),然后在sencond的父级下的node_modules文件下去查找first模块,按照这种方式一直查找下去,我们可以通过module.paths来查看查找的路径:

console.log(module.paths);

  在sencond文件夹中新建node_modules文件夹,然后把first文件夹放入到node_modules文件夹中,这样main.js中的require("first")就可以找到first模块了。

module.exports导出模块

  可以在一个文件中使用module.exports导出一个模块,这样在require()时就可以使用导出的属性或者方法。以上面的first.js为例我们在first.js中使用module.exports导出了show方法,这样我们在使用require()之后获取到的对象就可以使用show方法了。

  Node对module.exports的使用做了一些简化处理让我们在导出时可以使用exports:

module.exports = exports = {};

  module.exports和exports共用一个引用,这样就可以通过exports来收集属性:

var name = "zt"
exports.show = function(){
    console.log(name);
}

  通过module.exports = exports = {},这样在使用require()函数时获得的module.exports对象也就有了exports收集的属性。

  如果module.exports重新赋值module.exports和exports的引用关系也就断开了,而require()函数返回的是module.exports对象,也就不能得到exports收集的属性了,所以在使用时不要混用。

时间: 2025-01-16 00:18:43

初学Node(三)模块系统的相关文章

node js 模块系统

Node.js模块系统 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码.JSON 或者编译过的C/C++ 扩展. 创建模块 在 Node.js 中,创建一个模块非常简单,如下我们创建一个 'hello.js' 文件,代码如下: var hello = require('./hello'); hello.w

3:Node.js模块系统

原文出自:http://www.w3cschool.cc/nodejs/nodejs-module-system.html Node.js模块系统 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码.JSON 或者编译过的C/C++ 扩展. 创建模块 在 Node.js 中,创建一个模块非常简单,如下我们创建

Node.js模块系统

为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码.JSON 或者编译过的C/C++ 扩展. 创建模块 在 Node.js 中,创建一个模块非常简单,如下我们创建一个 'main.js' 文件,代码如下: var hello = require('./hello'); hello.world(); 以上实例中

Node.js 的模块系统

Node.js的模块系统是借鉴 CommonJS 的 Modules 规范实现的,因此,下面我们需要先了解 CommonJS 的 Modules 规范,希望对大家学习Node.js有所帮助. CommonJS 的 Modules 规范 CommonJS 对模块的定义非常简单,主要分为 模块引用.模块定义和模块标识三个部分. 1. 模块引用 - require() 方法 2. 模块定义 - module.exports 对象 3. 模块标识 - 传递给 require() 方法的参数 通过 Com

Node.js:模块系统

为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码.JSON 或者编译过的C/C++ 扩展. 一.创建模块 在 Node.js 中,创建一个模块非常简单,如下我们创建一个 main.js 文件,代码如下: var hello = require('./hello'); hello.world(); 以上实例中

【node.js】模块系统、函数

为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码.JSON 或者编译过的C/C++ 扩展. 创建模块 在 Node.js 中,创建一个模块非常简单,如下我们创建一个 'hello.js' 文件,代码如下: var hello = require('./hello'); hello.world(); 以上实例中,代码 require('./hello') 引入了当前目录下的hello.

Node,js的模块系统

模块系统 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码.JSON 或者编译过的C/C++ 扩展. 创建模块 在 Node.js 中,创建一个模块非常简单,如下我们创建一个 'mk.js' 文件,代码如下: 以上实例中,代码 require('./hello') 引入了当前目录下的hello.js文件(.

node模块系统常用命令

node模块系统常用命令 命令 示例 备注 安装模块 npm install commander 最新版本 npm install [email protected] 指定版本 npm install [email protected] 支持通配符,代表1.0版本下的最新补丁 npm install [email protected]"" 支持版本范围描述,代表最新版本 npm install [email protected]"*" 支持版本范围描述,代表最新版本

Node.js 教程 04 - 模块系统

前言: Node.js的模块系统类似于C/C++的文件引用,可以声明对象,也可以定义类 创建对象. 大家这么理解,就简单了. 定义: 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js应用程序的基本组成部分,文件和模块是一一对应的. 换言之,一个Node.js文件就是一个模块,这个文件可能是Javascript代码.JSON或者编译过的C/C++扩展. 实例一: 这个实例演示的是,在hello.js中创建一个方法,然后在主程序main.js中调