nodejs 路径解析顺序

nodejs 路径解析顺序

前言

在nodejs中引入各个模块包是基于require机制来的,那么nodejs解析这些模块路径顺序是怎样的?

相对路径解析顺序

假设有一个文件路径为/root/src/moduleA.js,包含了一个导入var x = require(“./moduleB”);,也就是导入了一个相对路径的一个模块,那么Node.js以下面的顺序解析这个导入:

  • /root/src/moduleB.js这个路径是否存在,如果不存在进入下一步。
  • 检查/root/src/moduleB目录是否包含一个package.json文件,且package.json文件指定了一个“main”模块,比如,Node.js发现文件/root/src/moduleB/package.json包含了{ “main”: “lib/mainModule.js” }, 那么nodejs就会去/root/src/moduleB/lib/mainModule.js。
  • 如果没有main字段,nodeJS会检查/root/src/moduleB目录是否包含一个index.js文件,这个文件会被隐世的当做那个文件夹下的“main“模块。

绝对路径解析顺序

假设有一个文件路径为/root/src/moduleA.js,里面包含了一个导入var x = require(‘moduleB’);,也就是绝对路径的一个模块,那么NodeJs以下面的顺序解析这个导入:

  • /root/src/node_modules/moduleB.js
  • /root/src/node_modules/moduleB/package.json (里面指定了main字段,跟上面相对路径是一样的)
  • /root/src/node_modules/moduleB/index.js

如果上面三个没有找到,往上一级目录寻找:

  • /root/node_modules/moduleB.js
  • /root/node_modules/moduleB/package.json
  • /root/node_modules/moduleB/index.js

如果还没有找到,继续往上一级找:

  • /node_modules/moduleB.js
  • /node_modules/moduleB/package.json
  • /node_modules/moduleB/index.js