[摘抄] 2. module对象
2. module对象
Node内部提供一个Module 构建函数,所有函数都是Module的实例。
function Moudle(id,parent) {
this.id = id;
this.exports = {};
this.parent = paremt;
//...
}
每个模块内部,都有一个module对象,代表当前模块。它有以下属性。
>
module.id模块的识别符,通常是带有绝对路径的模块文件名>
module.filename模块的文件名,带有绝对路径。>
module.loaded返回一个布尔值,表示模块是否已经完成加载>
module.parent返回一个对象,表示调用该模块的模块>
module.children返回一个数组,表示该模块要用到的其他模块。>
module.exports表示模块对外输出的值
下面是一个示例文件,最后一行输出module变量。
//example.js
var jquery = require('jquery');
exports.$ = jquery;
console.log(module);
执行这个文件,命令行会输出如下信息。
{ id: '.',
exports: { '$': [Function] }, //对外输出值
parent: null, // 调用该模块的模块
filename: '/path/to/example.js', // 模块文件名
loaded: false, //是否加载完成
children: // 该模块要用到的其他模块
[ { id: '/path/to/node_modules/jquery/dist/jquery.js',
exports: [Function],
parent: [Circular],
filename: '/path/to/node_modules/jquery/dist/jquery.js',
loaded: true,
children: [],
paths: [Object] } ],
paths:
[ '/home/user/deleted/node_modules',
'/home/user/node_modules',
'/home/node_modules',
'/node_modules' ]
}
如果在命令行下调用某个模块,比如node something.js 那么module.parent就是undefined。
如果实在脚本之中调用,比如require("./something.js"),那么module.parent就是调用它的模块。
利用这一点,可以判断当前模块是否为入口脚本。
if(!module.parent) {
// ran with `node something.js`
app.listen(8088,function(){
console.log("app listeing on port 8088");
})
}else{
// used with `require("./someting.js")`
module.exports = app;
}
2.1 module.exports属性
module.exports 属性表示当前模块对外输出的接口,其他文件加载该模块,实际上就是读取module.exports变量。
var EventEmitter = require('events').EventEmitter;
moudle.exports new EventEmitter();
setTimeout(funciton(){
moudle.exports.emote('ready');
},1000)
上面模块会在加载后一秒以后,发出ready时间,其他文件监听该事件,可以写成下面这样。
var e = require('./e');
e.on('ready',function(){
console.log('module e is ready');
})
2.2 exports变量
为了方便,Node为每个模块提供了一个exports变量,指向module.exeports。 在这等同于在每个模块头部,有一行这样的命令。
var exports = module.exports;
造成的结果是,在对外输出模块接口时,可以向exports对象添加方法。
exports.area = function(r){
return Math.PI * r * r;
}
exports.circumference = function (r) {
return 2 * Math.PI * r;
};
注意,不能直接将exports变量指向一个值,因为这样等于切断了exports 与module.exports 的联系。
exports = function(x){console.log(x)};
上面这样的写法是无效的。
因为exports 不能在指向module.exports了。
下面的写法也是无效的。
exports.hello = function(){
return 'hello';
};
module.exports = 'Hello world';
上面代码中,hello函数是无法对外输出的,因为module.exports 被重新赋值了。
如果你觉得,exports与module.exports之间的区别很难分清,一个简单的处理方法,就是放弃使用exports,只使用module.exports。
[摘抄] 2. module对象的更多相关文章
- 原生JS:Function对象(apply、call、bind)详解
Function对象(apply.call.bind) 原创文章,转摘请注明出处:苏福:http://www.cnblogs.com/susufufu/p/5850180.html 本文参考MDN做的 ...
- angular源码阅读,依赖注入的原理:injector,provider,module之间的关系。
最开始使用angular的时候,总是觉得它的依赖注入方式非常神奇. 如果你跳槽的时候对新公司说,我曾经使用过angular,那他们肯定会问你angular的依赖注入原理是什么? 这篇博客其实是angu ...
- python动态获取对象的属性和方法 (转载)
首先通过一个例子来看一下本文中可能用到的对象和相关概念. #coding:utf-8 import sys def foo():pass class Cat(object): def __init__ ...
- node.js module初步理解
在开发一个复杂的应用程序的时候,我们需要把各个功能拆分.封装到不同的文件,在需要的时候引用该文件.没人会写一个几万行代码的文件,这样在可读性.复用性和维护性上都很差,几乎所有的编程语言都有自己的模块组 ...
- nodejs里的module.exports和exports的关系
关于node里面的module.exports和exports的异同,网上已经有很多的资料,很多的文章,很多的博客,看了很多,好像懂了,又好像不懂,过几天又不懂了...大致总结是这样的: //下面这种 ...
- Node.js module.exports和exports的区别
require 用来加载代码,而 exports 和 module.exports 则用来导出代码,从接触node.js就不会它们两陌生,上代码: foo.js exports.a = functio ...
- nodejs的模块系统(实例分析exprots和module.exprots)
前言:工欲善其事,必先利其器.模块系统是nodejs组织管理代码的利器也是调用第三方代码的途径,本文将详细讲解nodejs的模块系统.在文章最后实例分析一下exprots和module.exprots ...
- JavaScript module pattern精髓
JavaScript module pattern精髓 avaScript module pattern是一种常见的javascript编码模式.这种模式本身很好理解,但是有很多高级用法还没有得到大家 ...
- module、export、require、import的使用
module 每个文件就是一个模块.文件内定义的变量.函数等等都是在自己的作用域内,都是自身所私有的,对其它文件不可见. 每个文件内部都有一个module对象,它包含以下属性 id: 模块的识别符,通 ...
随机推荐
- maven 配置参数详解
引自:搬砖工的奋斗史www.cnblogs.com/laobiao/p/5589025.html <project xmlns="http://maven.apache.org/POM ...
- hbase表的高性能设计
第7章 HBase优化 7.1 高可用 在HBase中Hmaster负责监控RegionServer的生命周期,均衡RegionServer的负载,如果Hmaster挂掉了,那么整个HBase集群将陷 ...
- Comet OJ 夏季欢乐赛 距离产生美
距离产生美 https://cometoj.com/contest/59/problem/B?problem_id=2680 题目描述 JWJU放暑假了,于是鸡尾酒就和女朋友璇璇一起出去玩.但是外面太 ...
- 阿里巴巴java开发手册 注释规约
- Pandas | GroupBy 分组
任何分组(groupby)操作都涉及原始对象的以下操作之一: 分割对象 应用一个函数 结合的结果 在许多情况下,我们将数据分成多个集合,并在每个子集上应用一些函数.在应用函数中,可以执行以下操作: 聚 ...
- 异常CLRDBG_NOTIFICATION_EXCEPTION_CODE( 0x04242420)的抛出过程
新建一个c#控制工程,就用自动生成的代码,不用补任何代码,如下: using System; using System.Collections.Generic; using System.Linq; ...
- ESA2GJK1DH1K基础篇: STM32+Wi-Fi(AT指令版)实现MQTT源码讲解
前言 注: 本程序发送心跳包,发送温湿度,返回控制数据这三个发送是单独的,有可能凑到一起发. 由于本身程序就是复杂性的程序,所以这节程序没有使用中断发送,没有使用环形队列发送,为了避免多条消息可能凑到 ...
- vue之子父组件通信
一. 子-父组件间通信: let children = { # 定义子组件 template: `<div> <button @click="send"&g ...
- 关于Exgcd
%%lkx 学习博客 exgcd(扩展欧几里得) 可以用来判断并求解形如\(ax+by=c\)的方程,当且仅当\(gcd(a,b)|c\)时,存在整数解\(x,y\) 也就是说,\(exgcd\)可以 ...
- 洛谷 p2055 假期的宿舍 题解
好长时间没更博客了 因为实在太蒻了 这让本蒟蒻怎么办 今天终于遇到了一道模板题(之前也有,不过太蒻了都不会) 不过...写代码5分钟,调试2小时 分界线:回归正题 这个就是普通的匈牙利算法 差不多 思 ...