-
Notifications
You must be signed in to change notification settings - Fork 118
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Node.js module.exports与exports #2
Comments
总结得真好~ |
thanks,对我很有帮助~ |
👍 |
这个总算明白了,之前参考别人写的模块也是这样写,但不是很明白。再开新项目,又再抄一扁,今天看到这篇,终于明白了。 |
最后一行有个笔误 |
看了几篇终于理顺了 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
折腾Node.js有些日子了,下面将陆陆续续记录下使用Node.js的一些细节。
熟悉Node.js的童鞋都知道,Node.js作为服务器端的javascript运行环境,它使用npm作为通用的包管理工具,npm遵循CommonJS规范定义了一套用于Node.js模块的约定,关于npm实现Node.js模块的更多细节请细读深入Node.js的模块机制,这里简单讲下书写Node.js代码时
module.exports
与exorts
的区别。在浏览器端js里面,为了解决各模块变量冲突等问题,往往借助于js的闭包把所有模块相关的代码都包装在一个匿名函数里。而Node.js编写模块相当的自由,开发者只需要关注
require
,exports
,module
等几个变量就足够,而为了保持模块的可读性,很推荐把不同功能的代码块都写成独立模块,减少各模块耦合。开发者可以在“全局”环境下任意使用var
申明变量(不用写到闭包里了),通过exports
暴露接口给调用者。我们经常看到类似
export.xxx = yyy
或者module.exports = xx
这样的代码,可实际在通过require
函数引入模块时会出现报错的情况,这是什么原因导致的呢?Node.js在模块编译的过程中会对模块进行包装,最终会返回类似下面的代码:
其中,
module
就是这个模块本身,require
是对Node.js实现查找模块的模块Module._load
实例的引用,__filename
和__dirname
是Node.js在查找该模块后找到的模块名称和模块绝对路径,这就是官方API里头这两个全局变量的来历。关于module.exports与exorts的区别,了解了下面几点之后应该就完全明白:
模块内部大概是这样:
exports.xxx
,相当于在导出对象上挂属性,该属性对调用模块直接可见exports =
相当于给exports对象重新赋值,调用模块不能访问exports对象及其属性module.exports
,这样调用者就是一个类构造器,可以直接new实例客官如果看明白咋回事儿了下面的内容可以忽略:)
假如有模块a.js代码如下:
对a模块的调用:
这样用是对的,如果改造a如下:
在调用a模块时自然没用
fn
属性了。再改造下a模块:
这时a模块其实就是fn函数的引用,也就是说可以
require('./a')()
这样使用,而同时不再有str属性了。下面直接导出一个类:
调用:
总结下,有两点:
exports
对象上module.exports
对象上,不要和导出属性值混在一起最后,不用再纠结
module.exports
与exorts
什么时候该用哪个了吧~The text was updated successfully, but these errors were encountered: