Node require() 加載規則


  1. 核心模塊 http,fs 等直接返回模塊
  2. / 開頭加載全局的文件,再加載文件夾
  3. ./ 和 ../ 開頭先加載文件,再加載文件夾
  4. 非核心模塊,路徑里也沒有 / ./ ../ 的則去 node_module 里加載文件夾

加載文件 X:X -> X.js -> X.json -> X.node

加載文件夾: X/package.json 里得到 main 字段為 M,加載文件 M。找不到再 加載文件 index

對此,node 官網文檔有一段偽代碼描述:

require(X) from module at path Y

1. If X is a core module,
   a. return the core module
   b. STOP
  
2. If X begins with '/'
   a. set Y to be the filesystem root

3. If X begins with './' or '/' or '../'
   a. LOAD_AS_FILE(Y + X)
   b. LOAD_AS_DIRECTORY(Y + X)
   c. THROW "not found"

4. LOAD_SELF_REFERENCE(X, dirname(Y))

5. LOAD_NODE_MODULES(X, dirname(Y))

6. THROW "not found"

LOAD_AS_FILE(X)
1. If X is a file, load X as its file extension format.  STOP
2. If X.js is a file, load X.js as JavaScript text.  STOP
3. If X.json is a file, parse X.json to a JavaScript Object.  STOP
4. If X.node is a file, load X.node as binary addon.  STOP

LOAD_INDEX(X)
1. If X/index.js is a file, load X/index.js as JavaScript text.  STOP
2. If X/index.json is a file, parse X/index.json to a JavaScript object. STOP
3. If X/index.node is a file, load X/index.node as binary addon.  STOP

LOAD_AS_DIRECTORY(X)
1. If X/package.json is a file,
   a. Parse X/package.json, and look for "main" field.
   b. If "main" is a falsy value, GOTO 2.
   c. let M = X + (json main field)
   d. LOAD_AS_FILE(M)
   e. LOAD_INDEX(M)
   f. LOAD_INDEX(X) DEPRECATED
   g. THROW "not found"
2. LOAD_INDEX(X)

LOAD_NODE_MODULES(X, START)
1. let DIRS = NODE_MODULES_PATHS(START)
2. for each DIR in DIRS:
   a. LOAD_PACKAGE_EXPORTS(DIR, X)
   b. LOAD_AS_FILE(DIR/X)
   c. 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 = [GLOBAL_FOLDERS]
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

......


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM