阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      Node.js module 模块查找顺序

      Node.js module 模块查找顺序

      想要获得调用 require() 时加载的确切的文件名,使用 require.resolve() 函数。

      综上所述,以下用伪代码描述的高级算法,解释 require.resolve() 做了些什么:

      require的查找处理

      require(X) 来自路径Y的模块
      1. 如果X是核心模块
         a. 返回核心模块
         b. STOP
      2. 如果X以'/'开头
         a. 将Y设置为文件系统根目录
      3. 如果X以'./'或'/'或'../'开头
         a. 作为文件加载(Y + X)
         b. 作为目录加载(Y + X)
      4. 加载 NODE_MODULES (X, dirname(Y))
      5. 报错 "not found"
      

      作为文件加载

      作为文件加载(X)

      1. 如果 X 是一个文件, 默认将X加载为 JavaScript 文本. STOP
      2. 如果 X.js 是文件, 则将 X.js 作为JavaScript文本加载。 STOP
      3. 如果 X.json 是文件,则将 X.json 解析为JavaScript对象。 STOP
      4. 如果 X.node 是文件,则将 X.node 加载为二进制插件。 STOP

      如果仅仅写了目录,默认加载目录下的 index.xxx,逻辑如下

      LOAD_INDEX(X),

      1. 如果 X/index.js 是文件,则将 X/index.js 作为JavaScript文本加载。 STOP
      2. 如果 X/index.json 是文件,则将 X/index.json 解析为JavaScript对象。 STOP
      3. 如果 X/index.node 是文件,则将 X/index.node 加载为二进制插件。 STOP

      作为目录加载

      作为目录加载(X)

      1. 如果 X/package.json 是一个文件,

          1. 解析 X/package.json,并查找“main”字段。     2. let M = X + (json main field)     3. M作为文件加载     4. 加载索引(M)

      1. 加载索引(X)

      加载 NODE_MODULES (X, START)

      下面是伪代码

      LOAD_NODE_MODULES(X, START)
      1. let DIRS=NODE_MODULES_PATHS(START)
      2. for each DIR in DIRS:
         a. LOAD_AS_FILE(DIR/X)
         b. LOAD_AS_DIRECTORY(DIR/X)
      
      NODE_MODULES_PATHS(START)
      1. let PARTS = path split(START)
      2. let I = count of PARTS - 1
      3. let DIRS = []
      4. while I >= 0,
         a. if PARTS[I] = "node_modules" CONTINUE
         b. DIR = path join(PARTS[0 .. I] + "node_modules")
         c. DIRS = DIRS + DIR
         d. let I = I - 1
      5. return DIRS
      

      更多内容请参考:Node.js module 模块,或者通过 点击对应菜单 进行查看;


      目录
      目录