总的来说…

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

综上所述,以下用伪代码的形式来表述 require.resolve 中的高级算法是如何工作的:

  1. require(X) from module at path Y
  2. 1. If X is a core module,
  3. a. return the core module
  4. b. STOP
  5. 2. If X begins with './' or '/' or '../'
  6. a. LOAD_AS_FILE(Y + X)
  7. b. LOAD_AS_DIRECTORY(Y + X)
  8. 3. LOAD_NODE_MODULES(X, dirname(Y))
  9. 4. THROW "not found"
  10. LOAD_AS_FILE(X)
  11. 1. If X is a file, load X as JavaScript text. STOP
  12. 2. If X.js is a file, load X.js as JavaScript text. STOP
  13. 3. If X.json is a file, parse X.json to a JavaScript Object. STOP
  14. 4. If X.node is a file, load X.node as binary addon. STOP
  15. LOAD_AS_DIRECTORY(X)
  16. 1. If X/package.json is a file,
  17. a. Parse X/package.json, and look for "main" field.
  18. b. let M = X + (json main field)
  19. c. LOAD_AS_FILE(M)
  20. 2. If X/index.js is a file, load X/index.js as JavaScript text. STOP
  21. 3. If X/index.json is a file, parse X/index.json to a JavaScript object. STOP
  22. 4. If X/index.node is a file, load X/index.node as binary addon. STOP
  23. LOAD_NODE_MODULES(X, START)
  24. 1. let DIRS=NODE_MODULES_PATHS(START)
  25. 2. for each DIR in DIRS:
  26. a. LOAD_AS_FILE(DIR/X)
  27. b. LOAD_AS_DIRECTORY(DIR/X)
  28. NODE_MODULES_PATHS(START)
  29. 1. let PARTS = path split(START)
  30. 2. let I = count of PARTS - 1
  31. 3. let DIRS = []
  32. 4. while I >= 0,
  33. a. if PARTS[I] = "node_modules" CONTINUE
  34. b. DIR = path join(PARTS[0 .. I] + "node_modules")
  35. c. DIRS = DIRS + DIR
  36. d. let I = I - 1
  37. 5. return DIRS