Skip to content

nodejs模块化细节 ​

module对象 ​

nodejs的模块化标准用的是commonjs,使用的require函数来导入,require函数里面的参数就是一个路径,这里介绍一下关于这个路径的细节

绝对路径:相对于根目录的路径

相对路径:相对于当前模块去导入

所有的相对路径最终都会转化为绝对路径

如果不用./或../开头,就会按照以下规则导入

  1. 检查是否为内置模块
  2. 检查当前目录中的node_modules中有没有这个模块
  3. 检查上级目录中的node_modules
  4. 转化为绝对路径
  5. 加载模块

导入模块可以不给后缀名,不给后缀名会自动补全以下后缀名 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等等实际上都是通过函数的参数传进去的,所以函数内部也可以直接用.

以笔记为镜,可以知得失