node.js学习记录——模块系统
一个 Node.js 文件就是一个模块。
-
内置模块(内置模块是由Node.js 官方提供的,例如fs、path、http等) 自定义模块(用户创建的每个.js 文件,都是自定义模块) 第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载)
这三种模块都是通过调用require方法加载,加载载模块就会执行里边的代码。require方法返回的是module.exports所指向的对象。
和函数作用域类似,在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域。
在每个.js自定义模块中都有一个module对象,它里面存储了和当前模块有关的信息,打印如下:
Module { id: ., path: C:\Users\XEH\Desktop\web practice\跟随练习\nodejs, exports: {}, filename: C:\Users\XEH\Desktop\web practice\跟随练习\nodejs\03.module系统.js, loaded: false, children: [], paths: [ C:\Users\XEH\Desktop\web practice\跟随练习\nodejs\node_modules, C:\Users\XEH\Desktop\web practice\跟随练习\node_modules, C:\Users\XEH\Desktop\web practice\node_modules, C:\Users\XEH\Desktop\node_modules, C:\Users\XEH\node_modules, C:\Users\node_modules, C:\node_modules ] }
可以通过module.exports向外共享变量或方法
//向module.exports 对象上挂载username属性 module.exports.username = zs //向module.exports对象上挂载 sayHello方法 module.exports.sayHello = function() t console.log( Hello!) }
这时定义的常量就可以接收到包含属性和方法的module.exports对象。
//让module.exports指向一个全新的对象 module.exports = { nickname: 小黑,sayHiO { console.logCHil2 } }
如果让module.exports指向一个全新的对象,那么返回的对象就是这个新的而不是之前的。
我觉得这个可以这样理解,这个exports起初指向的是一个空对象 {} ,第一种方式是在往这个空对象中添加属性或者方法,第二种是直接指向了另一个对象,所以之前的那个就不存在了返回的就是新指向的。
由于module.exports单词写起来比较复杂,为了简化向外共享成员的代码,Node 提供了exports对象。默认情况下,exports和 module.exports 指向同一个对象。最终共享的结果,还是以module.exports指向的对象为准。
const username = zs exports. username = username exports.age = 20 exports.sayHello = function() { console.log(大家好!)
这个是截取菜鸟教程的一张图片
如果既通过exports暴露了属性和对象,又通过module.exports指向了新的对象,那么最终结果和之前说的一样,返回的是这个新的对象。
反之,如果让exports指向了新的对象,而module.exports还是之前的那个默认对象,那么返回的就这个默认对象。
总之一句话,exports只是module.exports的一个引用,最终以module.exports为准。
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
EM算法及用EM估计HMM的参数