nodejs模块化细节
module对象
nodejs的模块化标准用的是commonjs,使用的require函数来导入,require函数里面的参数就是一个路径,这里介绍一下关于这个路径的细节
绝对路径:相对于根目录的路径
相对路径:相对于当前模块去导入
所有的相对路径最终都会转化为绝对路径
如果不用./或../开头,就会按照以下规则导入
- 检查是否为内置模块
- 检查当前目录中的node_modules中有没有这个模块
- 检查上级目录中的node_modules
- 转化为绝对路径
- 加载模块
导入模块可以不给后缀名,不给后缀名会自动补全以下后缀名 js json node mjs
如果只写目录,不写文件,那么默认会找index.js,可以通过package.json里面的main字段修改
在commonjs中,我们用到了module对象来实现导出,使用require函数实现导入,实际上module对象下除了exports,还有很多别的东西,以下属性很好理解,其中模块id就是模块的路径,也就是模块的唯一识别码,主模块的模块路径为一个点,这个对象其实就是模块对象,它就可以代表这个模块.

这里记录了一些当前模块的信息
require函数
而除了module对象以外,require作为一个函数,他上面也有一些静态的属性和方法,参考下代码

下面介绍一些
- resolve函数 传入一个相对路径,返回一个绝对路径
- main为主模块的module对象.
- extensions为扩展名的处理函数.
- cache为当前已经缓存的模块
下面主要介绍一下require函数实现的一些具体细节,这里只是简单的原理模拟,主要针对面试题.

可以看到在初始化module对象时,module.exports,exports,this,都是完全相等的,并且导入模块的时候,函数运行实际上是在一个函数内,所以不会污染全局变量,而模块内部的this,module,exports,__dirname等等实际上都是通过函数的参数传进去的,所以函数内部也可以直接用.