持续创作,加速成长!这是我参与「掘金日新计划 · 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均可以直接
- 文件模块:是用户编写的模块,主要有两种引用方式:
- 一种是第三方的模块,需要通过npm install进行安装,然后就可以直接引用
- 另一种是自己写的模块,引用时需要通过路径(相对路径或绝对路径)来进行引用,例如,require('./list')
不同的模块在引用时所经历的过程也不一样,在node中引入模块一般需要经过路径分析、文件定位和编译执行三个步骤,对于核心模块,在node启动的过程中,核心模块就直接被加载,所以核心模块在引用时是不需要文件定位和编译执行的;对于文件模块的引用,则是在运行时动态加载的,需要完整的路径分析、文件定位和编译执行过程,所以加载过程会比核心模块要慢。