如何知道在 Node 中为 require 指定什么路径

How to know what path to specify in Node for require

全部:

当我使用Express.js时(但我相信这更像是一个Node问题),如果我想导入一些模块,我需要使用require(module path)。

但是我有点困惑应该为每个需求使用什么根路径,它们都与我们执行节点命令的路径相同吗?

有时,当我使用 require("../modelname") 时它会起作用,而有时即使我没有更改 modelname.js 位置也需要 require("./modelname")。

谢谢

当您执行 require( 'express' ) 时,节点将从您的当前文件夹开始,并逐步增加文件树,直到找到其中包含 package.json 的文件夹。

找到此文件后,它将检查 node_modules 文件夹并寻找 node_modules/express。然后它将遵循 node_modules/express/package.json 中关于如何包含该模块的说明。

如果您想要自己的代码缺少 package.json,您可以这样做。

require( './router' )

require( '../middleware/site-data' )

在第一个示例中,. 指的是执行导入的文件所在的文件夹,并且将导入 ./router.js./router/index.js,具体取决于哪个存在。在 require 中,. 有效地转换为 __dirname + '/'

在第二个示例中,.. 指的是导入文件所在目录的父目录。在 require 中,.. 有效地转换为 __dirname + '/../' .

祝你好运!

Node 文档提供了 pseudo-code algorithm 如何解析 require()

的路径

总结一下:

require(X) from module at path Y
If X begins with './' or '/' or '../'
   a. LOAD_AS_FILE(Y + X)
   b. LOAD_AS_DIRECTORY(Y + X)

LOAD_AS_FILE(X)
1. If X is a file, load X as JavaScript text.  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_AS_DIRECTORY(X)
1. If X/package.json is a file,
   a. Parse X/package.json, and look for "main" field.
   b. let M = X + (json main field)
   c. LOAD_AS_FILE(M)
2. If X/index.js is a file, load X/index.js as JavaScript text.  STOP
3. If X/index.json is a file, parse X/index.json to a JavaScript object. STOP
4. If X/index.node is a file, load X/index.node as binary addon.  STOP

如果您在要访问的目录中modelname,下面给出了两种情况

  1. 如果 modelname 在同一个目录下那么你可以使用 require("./modelname")

  2. 如果调用目录不同并且比您的 modelname 目录高一级,那么您必须使用 require("../modelname").

使用 webstorm 工具,如果你有像我们在 eclipse 中一样的调试工具,在调试模式下启动你的应用程序并放置断点。