模块化的相关概念
模块化规范就是对代码进行模块化的拆分与组合时,需要遵守的规则。
例如
- 使用什么样的语法格式来引用模块
- 在模块中使用什么语法向外暴露成员
Node.js中根据模块的来源不同,将模块分为3大类分别是:
- 内置模块(例如node官提供的 fs、http、path模块)
- 自定义模块(用户自己创建的任意一个js文件都是自定义模块)
- 第三方模块(由第三方开发出来的模块,并非官方内置模块,也不是用户自定义的文件,使用前需要下载)
加载模块
使用require()方法,可以加载内置模块、用户自定义模块、第三方模块。
- 使用require()方法加载其他模块时,会执行模块中的代码
例如在07test.js中require()了06m1.js,在06m1.js中写了console.log(‘加载了06这个用户自定义模块’),运行07test时控制台便将这句话打印出来了。并且后面还有一个空对象{ },这个空对象是自定义模块中的module对象,并且每个自定义模块都有一个module对象
向外共享模块作用域中的成员
module对象
在每个.js自定义模块中都有一个module对象,它里面存储了和当前模块有关的信息,打印如下:
module.exports对象
在自定义模块中,可以使用module.exports对象,将模块内的成员共享出去,供外界使用,外界用require()方法导入自定义模块时,得到的就是module.exports所指向的对象。如下面的代码所示:
以下有几种容易出错的情况,在定义的js文件中 利用 module.exports.属性 添加的属性会默认放到module.exports对象内部,如果将一个新对象整体重新赋值给module.exports对象 就相当于给module.exports重新创建了一个新对象 利用module.exports.属性赋给此对象的属性将不复存在。
exports对象
同时Node还提供了exports对象,默认情况下在一个js文件中,exports 对象和module.exports对象指向的是同一个对象。当最终共享的结果是以module.exports指向的对象为准。
案例一:
module.exports.username = ‘zs’
exports对象重新整体赋值了一个新对象,最终向外共享的成员只有module.exports.username = 'zs’提供的属性
案例二:
exports对象 和 module.exports对象 都利用 .属性 的方法赋值,最后向外共享的成员是两者一共的属性。
案例三:
案例总结
为了防止混乱,建议大家不要在同一个模块中同时使用exports和module.exports
node中的模块化规范
node.js遵循了CommonJS模块化规范,CommonJS规定了模块的特性以及模块之间如何相互依赖
CommonJS规定
- 每个模块内部,module变量表示当前模块
- module变量是一个对象,它的exports属性是对外的接口(即module.exports)
- 加载某个模块其实是在加载该模块的module.exports属性,require()方法用于加载模块