Node.js模块化

  • 一、模块化的基本概念
  • 二、Node.js中的模块化
  • 1.Node.js中模块的分类
  • 加载模块
  • 2.模块作用域
  • 3 向外共享模块作用域中的成员
  • 3.1 module对象
  • 3.2 module.exports对象
  • 3.3 共享成员时的注意点
  • 3.4 exports对象
  • 3.5 exports与module.exports的使用误区
  • 4. Node.js中的模块化规范


一、模块化的基本概念

指的是解决一个复杂问题时,自上而下逐层将系统划分为若干模块的过程。对于整个系统来说,模块是可组合、分解和更换的单元。
编程中,遵循固定的得规则,把一个大文件拆分成独立并互相依赖的小模块。
如:使用什么样的语法格式来引用模块
在模块中使用什么样的语法格式向外暴露成员

二、Node.js中的模块化

1.Node.js中模块的分类

  • 内置模块(官方提供的fs path http)
  • 自定义模块(用户创建的,每个.js文件,都是自定义模块)
  • 第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载)

加载模块

//1.加载内置的fs模块
const fs=require('fs')
//2.加载用户的自定义模块
const custom=require('./custom.js')
//3.加载第三方
const moment=require('moment')

2.模块作用域

在自定义模块中定义的变量,方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域

防止了全局变量污染的问题

3 向外共享模块作用域中的成员

3.1 module对象

每个.js自定义模块中都有一个module对象,它里面存储了和当前模块有关的信息。.

那么module包括哪些信息?我们在控制台打印一下module对象

console.log(module)

node_modules 怎么引入_node.js

3.2 module.exports对象

在自定义模块中,可以使用module.exports对象,将模块内的成员共享出去,供外界使用。外界require()方法导入自定义模块时,得到的就是module.exports所指向的对象

首先定义一个自定义模块,去挂载要暴露的属性

//在一个自定义模块中,默认情况下,module.exports={}
//向module.exports对象上挂载username属性
module.exports.username = 'zs'
    //向module.exports对象上挂载sayHello方法

module.exports.sayHello = function() {
    console.log('Hello');
}

创建一个测试文件:能否接受自定义模块挂载的新属性

//在外界使用require导入一个自定义模块的时候,得到的成员
//就是那个模块中,通过module.exports指向的那个对象
const m = require('./11.自定义模块')
console.log(m);

得到的结果如下:即测试对象成功接收自定义模块暴露的对象

node_modules 怎么引入_javascript_02

3.3 共享成员时的注意点

使用require()方法导入模块时,导入的结果,永远以module.exports指向的对象为准

//在一个自定义模块中,默认情况下,module.exports={}
//向module.exports对象上挂载username属性
module.exports.username = 'zs'
    //向module.exports对象上挂载sayHello方法

module.exports.sayHello = function() {
        console.log('Hello');
    }
    //让module.exports指向一个全新的对象
module.exports = {
    nickname: '小黑',
    sayHi() {
        console.log('hi');
    }

}

当让module.export指向一个全新的对象时,得到的结果如下,可以看出module.export指向已经发生了变化

node_modules 怎么引入_node_modules 怎么引入_03

3.4 exports对象

由于module.exports单词写起来比较复杂,为了简化,默认情况下,exports和module.exports指向同一个对象。 在module.exports上挂载就是在exports上挂载
但最终共享的结果,还是以module.exports指向的对象为准

console.log(exports);
console.log(module.exports);
console.log(exports === module.exports);

node_modules 怎么引入_node.js_04

3.5 exports与module.exports的使用误区

时刻谨记,require()模块时,得到的都是module.exports指向的对象

在自定义模块中分别定义exports与module.exports,但是当require()这个自定义模块时,接受的是module.exports暴露的内容

node_modules 怎么引入_自定义_05


同一个模块中不要混着用exports与module.exports

4. Node.js中的模块化规范

遵循了CommonJS模块化,commonJS规定了模块的特性和各模块之间如何相互依赖。
CommonJS规定:

  • 1.每个模板内部,module变量代表当前模块。
  • 2.module变量是一个对象,它的exports属性(module.exports)是对外的接口
  • 3.加载某个模块,其实是加载该模块的module.exports属性,require()方法用于加载模块。