如何知道在 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
,下面给出了两种情况
如果 modelname
在同一个目录下那么你可以使用 require("./modelname")
如果调用目录不同并且比您的 modelname
目录高一级,那么您必须使用 require("../modelname")
.
使用 webstorm 工具,如果你有像我们在 eclipse 中一样的调试工具,在调试模式下启动你的应用程序并放置断点。
全部:
当我使用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
,下面给出了两种情况
如果
modelname
在同一个目录下那么你可以使用require("./modelname")
如果调用目录不同并且比您的
modelname
目录高一级,那么您必须使用require("../modelname")
.
使用 webstorm 工具,如果你有像我们在 eclipse 中一样的调试工具,在调试模式下启动你的应用程序并放置断点。