模块系统

  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收集的属性了,所以在使用时不要混用。

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

  1. 10、Node.js模块系统

    ##################################################################################介绍Node.js模块系统为了让No ...

  2. Node.JS模块系统

    1.什么是模块? 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node.js ...

  3. Node.js 模块系统

    为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node.js 文件就是一个模块, ...

  4. node基础—模块系统

    模块的概念 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块加载系统. 在 Node.js 中,文件和模块是一一对应的(每个文件被视为一个独立的模块),换言之,一个 Node ...

  5. 27.Node.js模块系统

    转自:http://www.runoob.com/nodejs/nodejs-module-system.html 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模 ...

  6. Node.js 模块系统入门

    在编程领域中,模块是自包含的功能单元,可以跨项目共享和重用.它们使开发人员的生活更加轻松,因为我们可以使用它来增加应用程序的功能,而不必亲自编写这些功能.它还让我们可以组织和解耦代码,从而使应用程序更 ...

  7. Node.js的模块系统

    编写稍大一点的程序时一般都会将代码模块化.Node.js提供了一个简单的模块系统.模块既可能是一个文件,也可能是包含一个或多个文件的目录. 模块的创建  如果模块是个文件,一般将代码合理拆分到不同的J ...

  8. Node.js:模块系统

    ylbtech-Node.js:模块系统 1.返回顶部 1. Node.js模块系统 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的 ...

  9. Node.js:模块系统、函数

    为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node.js 文件就是一个模块, ...

随机推荐

  1. 天朝专用- 配置pypi镜像

    使用python者,需要经常安装模块,可是身在天朝.pypi.python.org 站点稳定性相当差,为了很更好的使用pip安装模块. 请使用镜像. mac/linux 环境 在用户当前目录下 如没有 ...

  2. rm: 无法删除"/run/user/root/gvfs": 是一个目录 问题

    2013-03-02    bxd@linux:~$ sudo su [sudo] password for bxd:  root@linux:/home/bxd# exit exit rm: 无法删 ...

  3. react-native Unrecognized font family ‘Lonicons’;

    在使用:react-native-vector-icons库时报的错. 解决办法:使用这个库时android和ios工程目录中需要做些配置 配制方法如下: http://www.cnblogs.com ...

  4. netty ByteToMessageDecoder 分析

    ByteToMessageDecoder 1.socket 移除时触发,最后次读数据处理 @Override public final void handlerRemoved(ChannelHandl ...

  5. sql like 时间

    and Convert(varchar(),TimeStamp,) like '%2013-09-06 09:46:03%'

  6. 如何准备PMP考试?

    东西在精,而不在多.话不多说,干货如下: 1.参加培训,不要持续时间太长,通常情况下3个月时间足够了:许多和我一起参加培训的学员,有时候准备6个月时间,反而没有3个月冲刺的时间考试结果好. 2.培训老 ...

  7. 论文第4章:iOS绘图平台的实现

    面向移动设备的矢量绘图平台设计与实现 Design and Implementation of Mobile Device-oriented Vector Drawing Platform 引用本论文 ...

  8. Device eth0 does not seem to be present, delaying initialization.转载

    昨天在vm里面克隆了个虚拟机,克隆之后,启动了网卡起不来,已启动就报 Device eth0 does not seem to be present, delaying initialization. ...

  9. Python单元测试框架之pytest -- 生成测试报告

    继续pytest单元测试框架的学习,pytest可以生成多种类型的测试报告.这一节就来学习pytest如何生成测试报告. 创建test_calss.py 测试用例文件,这里以测试该文件为例. #cod ...

  10. sprint3(第二天)

    今天完成的任务有统计用户,全局管理员可以对员工或者用户设置权限. 燃尽图