Node.js学习(4)----Node模块

news/2024/7/1 21:05:52

1、什么是模块

开始编写Node应用之前,必须先学会Node的模块和包。模块和包是组成应用的基本单位。一个Node.js文件就是一个模块,这个文件可能是Javascript代码、JSON或者编译过的C/C++扩展。

例如:simple.js

var count=0;
exports.next=function(){return count++;}

实例:


从require('./simple')返回的这个对象正是我们在simple.js中定义的exports。每一次对s.next()调用都是对simple.js里next函数的调用,然后next函数返回自增count变量值。

Node里有三种定义模块的方式:

相对路径定义方式(以 ./或者../开头)、绝对路径定义方式(以 /开头)和顶级目录的定义方式(以模块名开头)。


2、创建模块

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

创建module.js模块

var name;

exports.setName=function(thyName){name=thyName;};

exports.sayHello=function(){console.log("Hello "+name);};
创建getmodule.js调用模块module.js

var module=require('./module');

module.setName('Public');

module.sayHello();

最后运行结果是:Hello Public

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

3、单次加载

require不会重复加载模块,也就是说无论调用多少次require,获得的模块都是同一个。

根据getmodule.js修改为loadmodule.js

var hello1=require('./module');
hello1.setName('Tom 1');

var hello2=require('./module');
hello2.setName('Tom 2');

hello1.sayHello();

运行结果是:Hello Tom 2

从结果可知,前者被后者覆盖了,所以最终结果由后者决定。


4、覆盖exports

有时我们只是想把一个对象封装到模块中。

singleobject.js

function Hello()
{
	var name='霍元甲';
	this.setName=function(thyName){
		name=thyName;
	};
	
	this.sayHello=function()
	{
		console.log('Hello '+name);
	};
}
exports.Hello=Hello;
此时我们在其他文件中需要通过require('./singleobject').Hello来获取Hello对象,

var Hello=require('./singleobject').Hello;
var hello=new Hello();
hello.setName('Module');
hello.sayHello();

略显冗余,可以简化如下:

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');

var hello=new Hello();
hello.setName('Module');
hello.sayHello();
注意,模块唯一的变化是将exports.Hello改成了module.exports,在外部引用该模块时,其接口对象就是要输出的Hello对象本身,而不是原先的exports.

事实上,exports本身仅仅是一个普通的空对象,即{},他专门用来声明接口。





http://www.niftyadmin.cn/n/3039994.html

相关文章

Node.js学习(5)----异步I/O和同步

异步I/O与事件式编程 1、异步的方式读取一个文件 /*** New node file* 异步方式读取数据*/var fsrequire(fs);fs.readFile(README.md,utf-8,function(err,data)//读取文件函数 {if(err){console.error(err);}else{console.log(data);} }); 2、以同步的方式读取数据 /*** New n…

企业站如何提升排名

在这个互联网发展越来越快的当代,大大小小的网站已经多得数不过来了。网站排名想要拿到“好名次”可以说是非常难。很多的站长应该都遇到过这样的问题:排名一直在三、四页徘徊,优化方法也是不断地更新,却没有明显的效果。那究竟要…

Docker 搭建 Zookeeper、Dubbo、Spring Boot 项目

2019独角兽企业重金招聘Python工程师标准>>> 项目介绍 本项目旨在应用阿里开源的分布式服务框架 dubbo 温馨提示:_blank方式打开链接,请按住Ctrl键https://amoswang0626.github.io/docker-dubbo/ 主要内容包括 docker 构建 zookeeper 集群doc…

反向 Ajax,第 4 部分: Atmosphere 和 CometD

简介 本 系列 文章向您展示如何使用反向 Ajax 技术开发事件驱动的 Web 程序。第 1 部分 介绍了 Reverse Ajax、轮询、流、Comet 和长轮询。第 2 部分 介绍了如何使用 WebSocket 实现 Reverse Ajax,还讨论了使用 Comet 和 WebSocket 的 Web 服务器的限制。第 3 部分 …

Andorid ViewPager+PageAdapter+Fragment实现多个tab页

一、文章内容 现在常见的Android或者iOS应用中都可以看到一个页面的下面有多个tab,点击不同的tab页面重新加载。现使用Android提供的ViewPager、PageAdapter和Fragment简单实现这一功能。 二、ViewPager简介 首先为了让页面能够左右滑动,我们需要采用ViewPager这一A…

聊聊flink的BoundedOutOfOrdernessTimestampExtractor

序 本文主要研究一下flink的BoundedOutOfOrdernessTimestampExtractor BoundedOutOfOrdernessTimestampExtractor flink-streaming-java_2.11-1.7.0-sources.jar!/org/apache/flink/streaming/api/functions/timestamps/BoundedOutOfOrdernessTimestampExtractor.java /*** Thi…

Node.js学习(6)----事件

Node.js所有的异步I/O操作在完成时都会发送一个事件到事件队列。在开发者看来,事件由EventEmitter对象提供。 /*** New node file*/ var EventEmitterrequire(events).EventEmitter; var eventnew EventEmitter();event.on(some_event,function(){ console.log(some…

什么是云主机?

为啥总有人念叨云计算、云主机、大数据,不明觉厉,好像都很高端,感觉距离生活太遥远了。但其实云主机对你生活的影响一点也不小,云计算也潜移默化的影响的你的生活,我们工作生活很多地方都可以用到云主机,利…