Commonjs规范中module.exports和exports的区别
程序员文章站
2023-12-23 22:19:39
...
经常能看到两种导出模块的方式:module.exports和exports。
穿插一个必备小知识:在文件a.js中用exports或module.exports导出的对象(方法、变量),可以在另一个文件b.js中通过require('./a')引用。
module和exports是Node.js给每个js文件内置的两个对象。
在node.js中打印console.log(module)可以看出 module 和 exports 都是node中提供的两个对象,其中module里包裹着exports
Module { id: '.', exports: {}, parent: null, filename: '', loaded: false, children: [], paths:[] }
实际上这两个对象指向同一块内存。这也就是说module.exports和exports是等价的。如图示:
例如:
exports.age = 18; module.exports.age = 18;
这两种写法是一致的(都相当于给最初的空对象{}添加了一个属性,通过require得到的就是{age: 18})。
但是这里有个重点,每个导出模块 node.js 默认会返回 return module.exports
;
当直接给module.exports或exports赋值时,就相当于改变了内存,两者指代的就不是同一内存,这样就会导致exports中的内容失效,因为module.exports所指向的内存永远是真正的内存
- 直接给module.exports赋值导致内存改变,新生成的内存依然是真正的内存,那exports原先指向的内存就无效了
例如:
//song.js
module.exports = {name: '樱花树下'};
exports = {name: '不吐不快'};
//main.js
let song= require('./song');
console.log(song);//输出:{name: '樱花树下'}
- 直接给exports赋值导致内存改变,那么exports所指的内存就是无效内存,所以会返回module.exports空对象
例如:
//song.js
exports = {name: '不吐不快'};
//main.js
let song= require('./song');
console.log(song);//输出:{}
有一种赋值特殊就是,exports = module.exports
这个用来重新建立引用关系的
就是重新把无效内存指向真正内存 这样 exports 和 module.exports 就重新建立了联系
.
推荐阅读
-
Commonjs规范中module.exports和exports的区别
-
Commonjs规范中module.exports和exports的区别
-
Node.js 中exports 和 module.exports 的区别
-
详解nodejs中exports和module.exports的区别
-
Node.js 中exports 和 module.exports 的区别
-
Node.js 中 exports 和 module.exports 的区别
-
JavaScript中ES6规范中let和const的用法和区别
-
详解Node.js中exports和module.exports的区别
-
详解Sea.js中Module.exports和exports的区别
-
(composer中psr-0和psr-4的区别)与(psr-0规范和psr-4规范的区别)是不一样的吧?