随着前端js代码复杂度的提高,js模块化是必然趋势,不仅好维护,同时依赖很明确,不会全局污染,在这里整理一下对JavaScript各种模块的理解。
为什么要使用模块化
使用一个技术肯定是有原因的,那么使用模块化可以给我们带来以下好处
- 解决命名冲突
- 提供复用性
- 提高代码可维护性
Common.js
参考链接: 阮一峰 common.js 规范
Node 应用由模块组成,采用 CommonJS 模块规范。
每个文件就是一个模块,有自己的作用域。在一个文件里面定义的变量、函数、类,都是私有的,对其他文件不可见。CommonJS规范规定,每个模块内部,module
变量代表当前模块。这个变量是一个对象,它的exports
属性(即module.exports
)是对外的接口。加载某个模块,其实是加载该模块的module.exports
属性。
- module对象
Node内部提供一个Module
构建函数。所有模块都是Module
的实例。
1 | function Module(id, parent) { |
每一个模块内部,都有一个module
对象,代表当前模块它有以下属性
1 | module.id 模块的识别符,通常是带有绝对路径的模块文件名。 |
- module.exports/export对象
module.exports
属性表示当前模块对外输出的接口
1 | var EventEmitter = require('events').EventEmitter; |
上面模块会在加载后1秒后,发出ready事件。其他文件监听该事件,可以写成下面这样。
1 | var a = require('./a'); |
exports = module.exports
因此,我们可以用下列的方式对exports
赋值
1 | exports.area = function (r) { |
但是不能对 exports
直接赋值。因为 var exports = module.exports
这句代码表明了 exports
和 module.exports
享有相同地址,通过改变对象的属性值会对两者都起效,但是如果直接对 exports
赋值就会导致两者不再指向同一个内存地址,修改并不会对 module.exports
起效。