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为准。

经验分享 程序员 微信小程序 职场和发展