nodejs模块引入机制(module&&exports)
发布于 9 年前 作者 slashhuang 13368 次浏览 最后一次编辑是 8 年前 来自 分享

##测试module和exports变量

均为对象类型

var type_module_exports = typeof module.exports ;
var type_exports = typeof exports;

本地变量

exports module __dirname __filename 和所有用var声明并在作用域顶端的数据等
在内存中 exports和module分别占据两块地址。
exports单纯的存储所有对外的接口变量组成对象
module存储 exports(指向exports(如果exports是对象的话) )

filename (当前文件) paths 存储 (node_modules加载路径) 等变量。
可以采用exports.[name] = variable; module.exports = variable; module.exports[name]= variable 这三类是常用的定义对外接口 形式。
module.exports定义总的对外接口 但是不能采用exports={}定义接口,因为exports指向新的内存地址,变量被覆盖。 !!! [导出的所有的内容都体现在process.mainModule.module.exports里面]

在node加载文件的时候,会传入exports,module,__filename,__dirname,在作用域的顶端接收存储变量
全局变量 process global root 和所有直接声明的变量(如这里的变量test)等
process属性列表 config存储所有node的配置信息
version存储node各类解析器的版本,包括最重要的openssl,v8引擎等
mainModule真正存储信息的地方
cwd()函数
abort()
assert()
binding()
chdir()
exit()
kill(pid,sig)
memoryUsage()
moduleLoadList 加载所有的二进制模块
events (毕竟基于事件驱动)

global属性列表

JSON解析器(!!!轻量级数据格式,它只有parse和stringify两个方法)
Math对象
NaN
undefined
console对象
Error等
其他变量原型
setTimeout
setInterval
这里不是挂载在window对象下了,而是global

测试文件test.js

	test = {hello:"hello"};//global variable
	var test1={hello:"hello"};//local variable
	console.log(exports == module.exports); // true:exports和module.exports指向相同的地址
	global.setTimeout(function(){
   	    process.exit();
	},1000);
	try{
    	throw global.TypeError('must be an object')
	}
	catch(e){
    console.error(e)}
	module.exports={test:'test'};
	console.log(process.mainModule);

index.js

	console.log(require('./test'));
	module.exports={
    index:'index'
	};	
	console.log(process.mainModule);
以下为打印的内容,可以看到node通过children,parent的形式【类似dom树的形式】加载模块依赖
Module {  id: '.',
exports: { index: 'index' },
parent: null,
filename: '/Users/slashhuang/个人项目库/personal/node-demo/modules/module-exports/index.js',
loaded: false,
children:[ Module {
                id: '/Users/slashhuang/个人项目库/personal/node-demo/modules/module-exports/test.js',
                exports: [Object],
                 parent: [Circular],
                filename: '/Users/slashhuang/个人项目库/personal/node-demo/modules/module-exports/test.js',
                loaded: true,
                children: [],
                paths: [Object] } ],
                paths:
                [ '/Users/slashhuang/个人项目库/personal/node-demo/modules/module-exports/node_modules',
                  '/Users/slashhuang/个人项目库/personal/node-demo/modules/node_modules',
            '/Users/slashhuang/个人项目库/personal/node-demo/node_modules',
            '/Users/slashhuang/个人项目库/personal/node_modules',
        '/Users/slashhuang/个人项目库/node_modules',
        '/Users/slashhuang/node_modules',
        '/Users/node_modules',
        '/node_modules' ] }
4 回复

能好好编辑一下嘛?markdown啊

@i5ting sorry,了解。今天刚刚注册的账号,贴了自己的代码,手动发的太快了。 不过cnode社区好像好久没有维护了,界面不太友好啊。。。

@slashhuang 具体哪方面界面?

@alsotang 发表文章的界面,可以显式的展现‘编辑’,‘删除’。 现在还好啦,刚来这个社区对功能不是很熟,逛了一圈还是不错的

回到顶部