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框架Express的模板视图机制分析
Jul 19 NodeJs
nodejs中的fiber(纤程)库详解
Mar 24 NodeJs
Nodejs获取网络数据并生成Excel表格
Mar 31 NodeJs
详解nodejs 文本操作模块-fs模块(二)
Dec 22 NodeJs
windows 下安装nodejs 环境变量设置
Feb 02 NodeJs
nodejs6下使用koa2框架实例
May 18 NodeJs
深入理解Nodejs Global 模块
Jun 03 NodeJs
nodejs中sleep功能实现暂停几秒的方法
Jul 12 NodeJs
nodejs实现的简单web服务器功能示例
Mar 15 NodeJs
Nodejs实现爬虫抓取数据实例解析
Jul 05 NodeJs
CentOS7中源码编译安装NodeJS的完整步骤
Oct 13 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
Godaddy空间Zend Optimizer升级方法
2010/05/10 PHP
php生成酷炫的四个字符验证码
2016/04/22 PHP
Laravel框架定时任务2种实现方式示例
2018/12/08 PHP
PHP中quotemeta()函数的用法讲解
2019/04/04 PHP
PHP code 验证码生成类定义和简单使用示例
2020/05/27 PHP
网页设计常用的一些技巧
2006/12/22 Javascript
JS遮罩层效果 兼容ie firefox jQuery遮罩层
2010/07/26 Javascript
javascript中的toFixed固定小数位数 简单实例分享
2013/07/12 Javascript
js获取ajax返回值代码
2014/04/30 Javascript
探讨js字符串数组拼接的性能问题
2014/10/11 Javascript
js使用split函数按照多个字符对字符串进行分割的方法
2015/03/20 Javascript
JS实现随机乱撞彩色圆球特效的方法
2015/05/05 Javascript
js淡入淡出的图片轮播效果代码分享
2015/08/24 Javascript
jQuery实现页面评论栏中访客信息自动填写功能的方法
2016/05/23 Javascript
JS工作中的小贴士之”闭包“与事件委托的”阻止冒泡“
2016/06/16 Javascript
简单谈谈Vue 模板各类数据绑定
2016/09/25 Javascript
javascript的document中的动态添加标签实现方法
2016/10/24 Javascript
es6学习之解构时应该注意的点
2017/08/29 Javascript
js+html5生成自动排列对话框实例
2017/10/09 Javascript
input 标签实现输入框带提示文字效果(两种方法)
2017/10/09 Javascript
vue 指令和过滤器的基本使用(品牌管理案例)
2019/11/04 Javascript
python队列通信:rabbitMQ的使用(实例讲解)
2017/12/22 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
2019/09/07 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
2019/11/11 Python
html5 css3实例教程 一款html5和css3实现的小机器人走路动画
2014/10/20 HTML / CSS
PAUL HEWITT手表美国站:德国北部时尚生活配饰品牌,船锚元素
2017/11/18 全球购物
Farfetch台湾官网:奢侈品牌时尚购物平台
2019/06/17 全球购物
Fossil德国官网:化石手表、手袋、珠宝及配件
2019/12/07 全球购物
师德个人剖析材料
2014/02/02 职场文书
《李时珍夜宿古寺》教学反思
2014/04/09 职场文书
冬季施工防火方案
2014/05/17 职场文书
最感人的道歉情书
2015/05/12 职场文书
创业计划书之小型广告公司
2019/10/22 职场文书
pytorch中的model=model.to(device)使用说明
2021/05/24 Python
世界各国短波电台对东亚播送时间频率表(SW)
2021/06/28 无线电
MySQL窗口函数的具体使用
2021/11/17 MySQL