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 相关文章推荐
Google官方支持的NodeJS访问API,提供后台登录授权
Jul 29 NodeJs
Windows系统下使用Sublime搭建nodejs环境
Apr 13 NodeJs
ubuntu下安装nodejs以及升级的办法
May 08 NodeJs
NodeJS中的MongoDB快速入门详细教程
Nov 11 NodeJs
初识NodeJS服务端开发入门(Express+MySQL)
Apr 07 NodeJs
详解nodejs微信公众号开发——4.自动回复各种消息
Apr 11 NodeJs
详解nodejs微信公众号开发——6.自定义菜单
Apr 13 NodeJs
Nodejs中使用captchapng模块生成图片验证码
May 18 NodeJs
详解Nodejs之静态资源处理
Jun 05 NodeJs
nodeJs爬虫的技术点总结
May 13 NodeJs
NodeJS实现一个聊天室功能
Nov 25 NodeJs
Nodejs实现微信分账的示例代码
Jan 19 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下MAIL的另一解决方案
2006/10/09 PHP
IP攻击升级,程序改进以对付新的攻击
2010/11/23 PHP
PHP反射使用实例和PHP反射API的中文说明
2014/07/02 PHP
PHP嵌套输出缓冲代码实例
2015/05/12 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
jquery 双色表格实现代码
2009/12/08 Javascript
理解Javascript_14_函数形式参数与arguments
2010/10/20 Javascript
关于锚点跳转及jQuery下相关操作与插件
2012/10/01 Javascript
js运动框架_包括图片的淡入淡出效果
2013/05/11 Javascript
js 页面元素的几个用法总结
2013/11/18 Javascript
上传图片js判断图片尺寸和格式兼容IE
2014/09/01 Javascript
轻松创建nodejs服务器(3):代码模块化
2014/12/18 NodeJs
jQuery中DOM树操作之复制元素的方法
2015/01/23 Javascript
使用jQuery实现图片遮罩半透明坠落遮挡
2015/03/16 Javascript
原生JS实现美图瀑布流布局赏析
2015/09/07 Javascript
常用的js验证和数据处理总结
2016/08/02 Javascript
Jquery获取当前城市的天气信息
2016/08/05 Javascript
js实现非常棒的弹出div
2016/10/06 Javascript
从零开始搭建一个react项目开发
2018/02/09 Javascript
vueScroll实现移动端下拉刷新、上拉加载
2019/03/22 Javascript
关于JS解构的5种有趣用法
2019/09/05 Javascript
解决LayUI数据表格复选框不居中显示的问题
2019/09/25 Javascript
[35:29]Secret vs VG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
[58:00]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第二场 2月7日
2021/03/11 DOTA
python列表的增删改查实例代码
2018/01/30 Python
Python迭代器与生成器基本用法分析
2018/07/26 Python
python实现静态服务器
2019/09/05 Python
python mysql 字段与关键字冲突的解决方式
2020/03/02 Python
jupyter notebook插入本地图片的实现
2020/04/13 Python
Python爬虫之Selenium实现关闭浏览器
2020/12/04 Python
HTML5实践-图片设置成灰度图
2012/11/12 HTML / CSS
html5中地理位置定位api接口开发应用小结
2013/01/04 HTML / CSS
在浏览器端如何得到服务器端响应的XML数据
2012/11/24 面试题
教学质量月活动总结
2015/05/11 职场文书
python实现批量提取指定文件夹下同类型文件
2021/04/05 Python
Springboot集成kafka高级应用实战分享
2022/08/14 Java/Android