【问题标题】:How to know what path to specify in Node for require如何知道在 Node 中为 require 指定什么路径
【发布时间】:2015-05-21 18:31:51
【问题描述】:

全部:

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

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

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

谢谢

【问题讨论】:

标签: node.js require


【解决方案1】:

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

【讨论】:

  • 所以这意味着路径与运行require的文件位置有关,而不是运行节点命令的位置?
  • 谢谢。我想知道您是否可以帮助我解决另一个问题:我搜索了一些有关如何调试节点的帖子。您使用哪种方式进行调试?我只是想找到像 chrome 控制台一样简单的方法。
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢。我想知道您是否可以帮助我解决另一个问题:我搜索了一些有关如何调试节点的帖子。您使用哪种方式进行调试?我只是想找到像 chrome 控制台一样简单的方法。
【解决方案3】:

当您执行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 + '/../'

祝你好运!

【讨论】:

  • 谢谢,如果我同时拥有路由器文件夹(其中包含 index.js)和 router.js,如果使用 resuire("../router") 会导入哪个文件夹?
  • @Kuan 默认为router.js
  • 谢谢。我想知道您是否可以帮助我解决另一个问题:我搜索了一些有关如何调试节点的帖子。您使用哪种方式进行调试?我只是想找到像 chrome 控制台一样简单的方法。
  • @Kuan 最好提出一个单独的问题,但我通常只使用console.log 很多,那样不好。
  • 谢谢。有时我觉得控制台真的很难显示对象,这就是我寻找其他工具的原因
【解决方案4】:

使用 webstorm 工具,您可以像我们在 eclipse 中那样拥有调试工具,在调试模式下启动您的应用程序并放置断点。

【讨论】:

    猜你喜欢
    • 2016-08-27
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2020-09-26
    相关资源
    最近更新 更多