初学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收集的属性了,所以在使用时不要混用。
初学Node(三)模块系统的更多相关文章
- 10、Node.js模块系统
##################################################################################介绍Node.js模块系统为了让No ...
- Node.JS模块系统
1.什么是模块? 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node.js ...
- Node.js 模块系统
为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node.js 文件就是一个模块, ...
- node基础—模块系统
模块的概念 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块加载系统. 在 Node.js 中,文件和模块是一一对应的(每个文件被视为一个独立的模块),换言之,一个 Node ...
- 27.Node.js模块系统
转自:http://www.runoob.com/nodejs/nodejs-module-system.html 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模 ...
- Node.js 模块系统入门
在编程领域中,模块是自包含的功能单元,可以跨项目共享和重用.它们使开发人员的生活更加轻松,因为我们可以使用它来增加应用程序的功能,而不必亲自编写这些功能.它还让我们可以组织和解耦代码,从而使应用程序更 ...
- Node.js的模块系统
编写稍大一点的程序时一般都会将代码模块化.Node.js提供了一个简单的模块系统.模块既可能是一个文件,也可能是包含一个或多个文件的目录. 模块的创建 如果模块是个文件,一般将代码合理拆分到不同的J ...
- Node.js:模块系统
ylbtech-Node.js:模块系统 1.返回顶部 1. Node.js模块系统 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的 ...
- Node.js:模块系统、函数
为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node.js 文件就是一个模块, ...
随机推荐
- 在内核中异步请求设备固件firmware的测试代码
在内核中异步请求设备固件firmware的测试代码 static void ghost_load_firmware_callback(const struct firmware *fw, void * ...
- 基于Eclipse搭建Hadoop源码环境
Hadoop使用ant+ivy组织工程,无法直接导入Eclipse中.本文将介绍如何基于Eclipse搭建Hadoop源码环境. 准备工作 本文使用的操作系统为CentOS.需要的软件版本:hadoo ...
- CLR via C#深解笔记五 - 事件
事件处理实际上是一种具有特殊签名的delegate, 像这个样子:public delegate void EventHandler(object sender, EventArgs e); 类型 ...
- Ubuntu下的防火墙
Ubuntu下的防火墙Gufw-ufw Gufw是ufw的桌面版本,网上有Gufw的安装和配置方法,但是我认为并不是很好.网上的教程也有点愚弄大众的嫌疑,因为按照他的说法,最后防火墙根本就无法自动启动 ...
- 安卓开发笔记——自定义HorizontalScrollView控件(实现QQ5.0侧滑效果)
对于滑动菜单栏SlidingMenu,大家应该都不陌生,在市场上的一些APP应用里经常可以见到,比如人人网,FaceBook等. 前段时间QQ5.0版本出来后也采用了这种设计风格:(下面是效果图) 之 ...
- mysql 启动错误-server PID file could not be found
[root@centos var]# service mysqld stop MySQL manager or server PID file could not be found! [F ...
- PHP实现简单的监控nginx日志文件功能
此功能是为了实现,定时监控nginx生成的日志数据,并将新增的数据提交到一个接口(比如大数据的接口,让大数据来进行分析) define("MAX_SHOW", 8192*5); / ...
- android 隐藏标题栏的方法
1:单个activity里 onCreate() { super.onCreate(); requestWindowFeature(Window.FEATURE_NO_TITLE); setConte ...
- ArcGIS Server注册地理数据库报machine:机器名[Oracle:(null)]错误的修改
环境介绍:本机安装了ArcGIS Server10.2,ArcGIS Desktop10.2,64位Oracle11g以及Oracle32位客户端.直连和服务连接都能成功. 问题:我要进行服务发布的时 ...
- epoll源码实现分析[整理]
epoll用法回顾 先简单回顾下如何使用C库封装的3个epoll相关的系统调用.更详细的用法参见http://www.cnblogs.com/apprentice89/archive/2013/05/ ...