node中的CommonJS模块规范

84 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

node中的模块化规范,是由node自己实现的,模块化主要为了把复杂的代码拆分成小的模块,并且每个模块之间的内容都是相互独立,并且互不影响的,这样就方便代码的管理和维护。

CommonJs的模块规范

模块的意义在于将方法和变量放在私有的作用域中,同时支持引入和导出功能用来连接上下游依赖。每个模块都具有独立的空间,互不影响,引用时也干净利落。CommonJs构建的模块导出和引入机制使得开发者不用考虑变量污染、命名空间等。

CommonJs中对模块规范比较简单,主要包括模块定义、模块引用和模块标识。

模块定义

每一个文件都是一个模块,如果我们希望模块中的变量或者方法被其他模块使用,就可以使用exports 对象导出当前模块的变量或方法,exports对象是模块中唯一导出的出口,例如:

// math.js文件
exports.add = function(a, b) {
    return a + b
}

这样我们就将模块中的add方法进行了导出,其他模块就可以引用add方法。

模块引用

CommonJs中通过require()方法来进行模块的引用,如下:

// index.js文件
const math = require('math')
exports.increment = function (val) {
    return math.add(val, 1)
}

上述代码中,首先通过require()方法引用了math模块,然后调用了math模块中定义的add方法,并且在此模块中也可以进行方法的导出,其互不影响。

模块标识

模块标识就是require()方法的参数,它可以是一个字符串,也可以是一个相对路径或者绝对路径。

Node中的模块规范

node中的模块在实现时,并非完全是按照规范来实现,而是对其进行了一定的取舍,同时也增加了一些特性。 node中的模块主要有两种:

  • 核心模块:核心模块是node内置的模块,也不用安装就可以直接使用,例如,require('fs')、require('http'),fs和http均可以直接
  • 文件模块:是用户编写的模块,主要有两种引用方式:
  1. 一种是第三方的模块,需要通过npm install进行安装,然后就可以直接引用
  2. 另一种是自己写的模块,引用时需要通过路径(相对路径或绝对路径)来进行引用,例如,require('./list')

不同的模块在引用时所经历的过程也不一样,在node中引入模块一般需要经过路径分析文件定位编译执行三个步骤,对于核心模块,在node启动的过程中,核心模块就直接被加载,所以核心模块在引用时是不需要文件定位和编译执行的;对于文件模块的引用,则是在运行时动态加载的,需要完整的路径分析、文件定位和编译执行过程,所以加载过程会比核心模块要慢。