摘要:中最常用的恐怕就是,以及了,那么和这两者有什么区别,在什么情况下使用,又在什么时候使用。在拼接之后的代码中,给这个函数传入的是,也就是说和引用的是同一个对象。如果我们给增加属性,那么因为也会增加相同的属性,此时。
Node.js中最常用的恐怕就是 require, exports 以及 module.exports 了,那么 exports 和 module.exports 这两者有什么区别,在什么情况下使用 exports,又在什么时候使用 module.exports。
先举个官网的例子:
// circle.js var PI = Math.PI; exports.area = function (r) { return PI * r * r; }; exports.circumference = function (r) { return 2 * PI * r; };
在 circle.js 中写的源字符串是上面贴出的代码,然而实际 Node.js 在加载的时候会在原字符串上外面拼出一个闭包,拼出之后的代码如下(有想了解为什么会拼出这个代码的朋友,请看我之前一篇文章):
(function(exports, require, module, __dirname, __filename) { // circle.js var PI = Math.PI; exports.area = function (r) { return PI * r * r; }; exports.circumference = function (r) { return 2 * PI * r; }; })
Node.js 调用这段代码的为:
function Module(id, parent) { this.id = id; this.exports = {}; this.parent = parent; if (parent && parent.children) { parent.children.push(this); } this.filename = null; this.loaded = false; this.children = []; } Module.prototype._compile = function(content, filename) { var self = this; function require(path) { return self.require(path); } var dirname = path.dirname(filename); var args = [self.exports, require, self, filename, dirname]; return compiledWrapper.apply(self.exports, args); };
从上面这段代码可以看到 exports 是 module 的一个属性,exports 值为 {}。在拼接之后的代码中,给这个函数传入的 exports 是 module.exports, 也就是说 exports 和 modules.exports 引用的是同一个对象。如果我们给 exports 增加属性,那么因为 modules.exports 也会增加相同的属性,此时 modules.exports === exports。然而如果对 exports 赋值的话,那么就会造成 modules.exports 和 exports 不指向同一个对象,此时再对 exports 做任何动作都跟 modules.exports 没有任何关系了,用一段代码模拟就是:
var module = { exports: {}}; var exports = module.exports; exports.a = 1; console.log(module.exports); // {a: 1} exports = {b:2}; console.log(module.exports); // {a: 1}
所以从上面的代码可以看出,如果我们想在模块文件中提供其他模块可以访问的接口,最好写成
exports["key"] = value 或者 module.exports = {key: value} 的形式, 总之别对 exports 赋值。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/78307.html
摘要:看了好多篇博客,对于和区别的解释众说纷纭有点迷糊,还是自己写来感受一下吧。会造成被另外一个内存地址替换,也就中断得了和的联系。调用了我调用了我调用了我两者的值又相同。小弟才疏学浅,讲解较为啰嗦,亦是初次写之,若有疏漏,妄不吝赐教,特此感谢。 看了好多篇博客,对于module.exports和exports区别的解释众说纷纭有点迷糊,还是自己写demo来感受一下吧。 module.exp...
摘要:依赖全部加载完成后,调用回调函数规范异步加载模块规范和很相似,简单,并与和的规范保持了很大的兼容性在规范中,一个模块就是一个文件。 抛出问题: 在开发中在导入模块时经常使用require和import; 导出模块时使用module.exports/exports或者export/export default; 有时候为了引用一个模块会使用require奇怪的是也可以使用import?...
摘要:依赖全部加载完成后,调用回调函数规范异步加载模块规范和很相似,简单,并与和的规范保持了很大的兼容性在规范中,一个模块就是一个文件。 抛出问题: 在开发中在导入模块时经常使用require和import; 导出模块时使用module.exports/exports或者export/export default; 有时候为了引用一个模块会使用require奇怪的是也可以使用import?...
摘要:主要区别是需要在声明模块时指定所有的依赖,通过形参传递依赖到模块内容中。 前言 昨天,公司同事问了我如下一个问题: showImg(https://segmentfault.com/img/bVWXYP?w=548&h=346); 说他在看一个插件时,看到了源码结构如截图所示,他知道(function(){})()是一种立即执行函数,但是在截图中,最后的那个圆括号里又写了一个函数fun...
阅读 2345·2021-11-24 09:39
阅读 3083·2021-10-09 09:53
阅读 1098·2021-09-22 16:06
阅读 4395·2021-09-02 10:18
阅读 761·2021-08-23 09:42
阅读 1705·2021-08-17 10:11
阅读 2659·2019-08-30 13:02
阅读 2090·2019-08-30 12:49