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 模块,或者通过 点击对应菜单 进行查看;



AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

目前重心已经放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>