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对象的更多相关文章

  1. 原生JS:Function对象(apply、call、bind)详解

    Function对象(apply.call.bind) 原创文章,转摘请注明出处:苏福:http://www.cnblogs.com/susufufu/p/5850180.html 本文参考MDN做的 ...

  2. angular源码阅读,依赖注入的原理:injector,provider,module之间的关系。

    最开始使用angular的时候,总是觉得它的依赖注入方式非常神奇. 如果你跳槽的时候对新公司说,我曾经使用过angular,那他们肯定会问你angular的依赖注入原理是什么? 这篇博客其实是angu ...

  3. python动态获取对象的属性和方法 (转载)

    首先通过一个例子来看一下本文中可能用到的对象和相关概念. #coding:utf-8 import sys def foo():pass class Cat(object): def __init__ ...

  4. node.js module初步理解

    在开发一个复杂的应用程序的时候,我们需要把各个功能拆分.封装到不同的文件,在需要的时候引用该文件.没人会写一个几万行代码的文件,这样在可读性.复用性和维护性上都很差,几乎所有的编程语言都有自己的模块组 ...

  5. nodejs里的module.exports和exports的关系

    关于node里面的module.exports和exports的异同,网上已经有很多的资料,很多的文章,很多的博客,看了很多,好像懂了,又好像不懂,过几天又不懂了...大致总结是这样的: //下面这种 ...

  6. Node.js module.exports和exports的区别

    require 用来加载代码,而 exports 和 module.exports 则用来导出代码,从接触node.js就不会它们两陌生,上代码: foo.js exports.a = functio ...

  7. nodejs的模块系统(实例分析exprots和module.exprots)

    前言:工欲善其事,必先利其器.模块系统是nodejs组织管理代码的利器也是调用第三方代码的途径,本文将详细讲解nodejs的模块系统.在文章最后实例分析一下exprots和module.exprots ...

  8. JavaScript module pattern精髓

    JavaScript module pattern精髓 avaScript module pattern是一种常见的javascript编码模式.这种模式本身很好理解,但是有很多高级用法还没有得到大家 ...

  9. module、export、require、import的使用

    module 每个文件就是一个模块.文件内定义的变量.函数等等都是在自己的作用域内,都是自身所私有的,对其它文件不可见. 每个文件内部都有一个module对象,它包含以下属性 id: 模块的识别符,通 ...

随机推荐

  1. angular 小技术点

    angular 标签 ng-options ng-model ng-checked ng-true-value ng-false-value ng-if ng-src delete $location ...

  2. CentOS7.5 系统最小化安装与初始化配置

    CentOS7.5 系统最小化安装与初始化配置 1.安装标准化的系统 1.1.系统安装期间的语言 选择:中文-简体中文,安装完成也会默认支持中文输出,便于管理 1.2.时区选择 亚洲上海,CST时区( ...

  3. MySQL版本问题导致的SQLException

    背景 ​ 学习使用 SpringCloud 时,使用 消费者 调用 生产者 时抛出 SQLException,持久层框架为 MyBatis,数据库为最新版本的 MySQL 版本如下: Server v ...

  4. 【CF573E】Bear and Bowling

    [CF573E]Bear and Bowling 题面 洛谷 题解 首先有一个贪心的结论: 我们一次加入每个数,对于\(\forall i\),位置\(i\)的贡献为\(V_i = k_i\times ...

  5. 【BZOJ3837】[PA2013]Filary

    [BZOJ3837][PA2013]Filary 题面 darkbzoj 题解 考虑到模数为\(2\)时答案至少为\(\frac n2\),这是我们答案的下界. 那么我们对于任意的一个数,它们答案集合 ...

  6. git使用问题与技巧

    1.修改gitolite管理员 如果gitolite原来的管理员已经没了,那么需要把当前的公钥放到服务器覆盖,然后替换目录下.ssh/authorized_keys内容 2.clone报告超过限制 w ...

  7. 2019-2020-1 20181218《Linux内核原理与分析》第一周作业

    目录 问题和参考 有趣/有用的Linux命令 小作业和解答 一些图片 相关学习 本文是学习Linux基础入门(新版)后的总结. 问题和参考 虚拟机莫名崩溃,一天重启了几十次电脑,重装两次系统,心累.想 ...

  8. MinGW g++.exe 编译 DLL 时,导出函数名带@的问题

    今天尝试用CodeBlocks写了一个简单的Dll,发现生成的 dll 文件导出的函数名后面都有一个 @xxx 从生成的 libDll2.def 中看到: EXPORTS DllMain@ @ Max ...

  9. CentOS安装PinPoint

    1.软件准备 jdk-8u191-linux-x64.tar.gz,下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8 ...

  10. 【发现】visualvm是jdk自带的一款监控工具

    visualvm是jdk自带的一款监控工具.它提供了一个可视界面,用于查看 Java 虚拟机上运行的基于 Java 技术的程序的详细信息.VisualVM 对 Java Development Kit ...