nodejs中模块定义实例详解


Posted in NodeJs onMarch 18, 2017

本文实例讲述了nodejs中模块定义方法。分享给大家供大家参考,具体如下:

1.模块定义

nodejs所谓的模块就是一个文件!一个.js文件就是一个nodejs的模块,模块与文件是一一对应的,那么引用模块就是require('文件路径')。

如:

var circle = require('./circle.js');
console.log( 'The area of a circle of radius 4 is '
      + circle.area(4));

这个取名为foo.js

var PI = Math.PI;
exports.area = function (r) {
 return PI * r * r;
};
exports.circumference = function (r) {
 return 2 * PI * r;
};

这个取名为circle.js

两个js代码文件是放在同一个文件夹下的。

如果你要引用其它文件夹下的模块,直接写定路径。这里的路径格式和linux的路径格式一样:/../../.js  这是绝对路径,../.js 这个是上一层 ./.js 这个就是当前路径。

这里需要注意exports与module.exports的区别:exports其实只是module.exports的一个引用(就像a=2,b=a这样,b只是引用了a,当b=c的时候,b就不指向a了),这样就能明白官网上的意思了(如果你想要将exports的根声明为一个函数,或者你想生成一个object,那么就请用module.exports而不是exports)

2.循环引用

a.js:

console.log('a starting');
exports.done = false;
var b = require('./b.js');
console.log('in a, b.done = %j', b.done);
exports.done = true;
console.log('a done');

b.js:

console.log('b starting');
exports.done = false;
var a = require('./a.js');
console.log('in b, a.done = %j', a.done);
exports.done = true;
console.log('b done');

main.js:

console.log('main starting');
var a = require('./a.js');
var b = require('./b.js');
console.log('in main, a.done=%j, b.done=%j', a.done, b.done);

看到没有,这个a.js与b.js两个相互引用了。这样会不会无限循环呢?不会的,这只是会有一个没有加载完毕,也就是有一个module一部分处于不可用状态。像这里,a.js先加载,但是在加载a.js的同时,a.js加载了b.js,此时a.js处于停滞状态,只是仅仅加载了require前面的数据,而对于b.js会一直加载完毕。下面是运行的结果:

$ node main.js
main starting
a starting
b starting
in b, a.done = false
b done
in a, b.done = true
a done
in main, a.done=true, b.done=true

3.核心模块

所谓核心模块,其实就是nodejs开发的公共包,就像Java的公共包一样。访问核心模块只要require('文件名字'),这样就能访问到。其实公共模块包是放在了nodejs安装的node_modules\npm\lib下面。

4.文件模块

当没有精确匹配所谓的引用时,nodejs会先采用扩展名:.js, .json, and then .node. .js文件就是JavaScript文件,.json就会以json格式解析,.node就会以dlopen加载为一个附加的模块

这里还需要注意,当没有'/'、'./'这样的符号修饰时,模块加载的地方是在node_modules,至于这个文件在哪,请看下面。

5.node_modules文件夹

如果在引用模块时没有'/' '../' './'这样的格式符号限定,那么其采用寻找的方式如下:假设你的文件在'/home/ry/projects/foo.js',其引用了require('bar.js'),那么这个bar.js寻找方式如下:

/home/ry/projects/node_modules/bar.js
/home/ry/node_modules/bar.js
/home/node_modules/bar.js
/node_modules/bar.js

也就是从当前路基开始,一步一步向父目录添加node_modules文件夹作为模块地址。

require('example-module/path/to/file')这种引用和require('bar.js')是一样的解析。

6.以文件夹名字引用模块

大致分为两种:1)写package.json文件,此文件写在项目的根目录下,其形式如下:

{ "name" : "some-library",
 "main" : "./lib/some-library.js" }

这样写出来的require('./some-library')其真正的是

require('./some-library/lib/some-library.js')

2)直接约定好为index.js或index.node文件加载,同上的require,其加载可能如下:

./some-library/index.js
./some-library/index.node

7.缓存

一个模块的多次引用会只做一次加载。就像java中的static关键字修饰。不过要值得注意的是,当你require('foo')这样的形式就不一定保证每次都会引用到相同的文件了(因为你可能会在不同的文件夹中引用)。

希望本文所述对大家nodejs程序设计有所帮助。

NodeJs 相关文章推荐
NodeJS学习笔记之Connect中间件模块(一)
Jan 27 NodeJs
Windows 系统下设置Nodejs NPM全局路径
Apr 26 NodeJs
Jquery通过ajax请求NodeJS返回json数据实例
Nov 08 NodeJs
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
Mar 28 NodeJs
nodejs使用express创建一个简单web应用
Mar 31 NodeJs
nodejs入门教程二:创建一个简单应用示例
Apr 24 NodeJs
NodeJS链接MySql数据库的操作方法
Jun 27 NodeJs
nodejs后台集成ueditor富文本编辑器的实例
Jul 11 NodeJs
nodejs动态创建二维码的方法
Aug 12 NodeJs
ubuntu编译nodejs所需的软件并安装
Sep 12 NodeJs
nodejs中实现用户注册路由功能
May 20 NodeJs
浅谈vue websocket nodeJS 进行实时通信踩到的坑
Sep 22 NodeJs
Nodejs基于LRU算法实现的缓存处理操作示例
Mar 17 #NodeJs
用nodeJS搭建本地文件服务器的几种方法小结
Mar 16 #NodeJs
nodejs+express实现文件上传下载管理网站
Mar 15 #NodeJs
nodejs搭建本地http服务器教程
Mar 13 #NodeJs
搭建简单的nodejs http服务器详解
Mar 09 #NodeJs
nodejs读写json文件的简单方法(必看)
Mar 09 #NodeJs
Nodejs 获取时间加手机标识的32位标识实现代码
Mar 07 #NodeJs
You might like
php中利用explode函数分割字符串到数组
2014/02/08 PHP
ThinkPHP查询返回简单字段数组的方法
2014/08/25 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
2018/08/07 PHP
php实现微信企业转账功能
2018/10/02 PHP
PHPStorm 2020.1 调试 Nodejs的多种方法详解
2020/09/17 NodeJs
windows系统php环境安装swoole具体步骤
2021/03/04 PHP
游戏人文件夹程序 ver 3.0
2006/07/14 Javascript
javascript options属性集合操作代码
2009/12/28 Javascript
setTimeout()与setInterval()方法区别介绍
2013/12/24 Javascript
使用jQuery的attr方法来修改onclick值
2014/07/07 Javascript
使用纯javascript实现经典扫雷游戏
2015/04/23 Javascript
js实现各种复制到剪贴板的方法(分享)
2016/10/27 Javascript
JS中如何实现复选框全选功能
2016/12/19 Javascript
JavaScript日期对象(Date)基本用法示例
2017/01/18 Javascript
Angular 4.x 路由快速入门学习
2017/05/03 Javascript
vue添加axios,并且指定baseurl的方法
2018/09/19 Javascript
学习RxJS之JavaScript框架Cycle.js
2019/06/17 Javascript
微信小程序从注册账号到上架(图文详解)
2019/07/17 Javascript
JS前端基于canvas给图片添加水印
2020/11/11 Javascript
[01:08:17]2018DOTA2亚洲邀请赛3月29日 小组赛B组 EG VS VGJ.T
2018/03/30 DOTA
使用Python设置tmpfs来加速项目的教程
2015/04/17 Python
python实现聚类算法原理
2018/02/12 Python
Python中的上下文管理器和with语句的使用
2018/04/17 Python
Python学习笔记之字符串和字符串方法实例详解
2019/08/22 Python
Python日志处理模块logging用法解析
2020/05/19 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
应急处置方案
2014/06/16 职场文书
金融与证券专业求职信
2014/06/22 职场文书
初中国旗下的演讲稿
2014/08/28 职场文书
股权转让协议书
2014/12/07 职场文书
公司仓管员岗位职责
2015/04/01 职场文书
2015年医院工作总结范文
2015/04/09 职场文书
幽灵公主观后感
2015/06/09 职场文书
Python测试框架pytest高阶用法全面详解
2022/06/01 Python
Python可视化神器pyecharts绘制水球图
2022/07/07 Python