【问题标题】:nodeJS require.paths resolve problemnodeJS require.paths 解决问题
【发布时间】:2011-07-20 10:32:06
【问题描述】:

我试图相对神秘地要求一个文件,发生了以下情况

这很好,指向/Users/marcos/Desktop/Taper/lib/utils.js

myPath = "/Users/marcos/Desktop/Taper/lib/./utils";
require(myPath);

这不是,但它应该指向完全相同的文件:

require.paths.unshift("/Users/marcos/Desktop/Taper/lib")
require("./utils"); //Doesn't work with './'
require("utils"); //Works Fine

任何人都知道为什么在这种情况下我仍然不能使用./ 来加载路径,因为

require("path").resolve("/Users/marcos/Desktop/Taper/lib", "./utils")

结果:

"/Users/marcos/Desktop/Taper/lib/utils"

不管怎样?

提前致谢

【问题讨论】:

  • 谢谢 Martjin 我同意,但问题是这是一个简单的文本伴侣包,它读取 STDIN 并将当前 process.cwd() 添加到需要路径,因此用户将能够运行节点代码快速,无需更改其当前的需求路径。
  • Node 0.6 声明 require.paths 已删除 使用 node_modules 文件夹或 NODE_PATH 环境变量。

标签: javascript node.js relative-path require commonjs


【解决方案1】:

更新:

来自documentation

'/' 为前缀的模块是文件的绝对路径。为了 例如,require('/home/marco/foo.js') 将加载文件 /home/marco/foo.js.

'./' 为前缀的模块与调用require() 的文件相关。 即circle.js必须和foo.js在同一目录下 require('./circle') 找到它。

如果没有前导 '/' 或 './' 来指示文件,则模块是 “核心模块”或从node_modules 文件夹加载。

如果给定路径不存在,require() 将抛出一个错误 其code 属性设置为'MODULE_NOT_FOUND'


这是原始答案,指的是require.paths(不再支持):

来自documentation

在节点中,require.paths 是一个字符串数组,表示要搜索的模块路径当它们没有以'/''./''../' 为前缀时。

(强调我的)

【讨论】:

  • 啊,好吧,现在说得通了 :) 所以,如果上面提到了一些字符串,它只会忽略路径部分。所以我想不幸的是,没有办法实现这一点,谢谢 Martjin
  • 也许一个很好的解决方案是从process.stdin 中找到并替换这些前缀并将process.cwd() 附加到它:) 可能会起作用
  • @ludicco:您的用户是否可以将utils.js 放在路径上方的node_modules/ 目录中?
【解决方案2】:

你可以使用NODE_PATH传递它

例子:

NODE_PATH=`pwd` node app.js

【讨论】:

  • 你是救世主! Bc 有些人只是像这样管理他们的整个代码库:require('lib/mongo/get-db');。而且我必须弄清楚如何运行这个东西!
【解决方案3】:

我创建了一个名为 rekuire 的新节点模块。

它允许您在不使用相对路径的情况下“要求”。

在测试/重构方面可以节省大量时间。

https://npmjs.org/package/rekuire

【讨论】:

  • 我正在查看 rekuire 的源代码,发现它通过执行 ./../../../ 开始搜索 js 文件。这是否意味着如果我在同一个根文件夹中有几个节点项目,它们最终可能会共享代码?
  • 不,只是建立基本文件夹,我特意防止模块之间的依赖关系。
猜你喜欢
  • 2019-06-29
  • 2021-04-17
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 2021-06-25
  • 2018-09-18
  • 2018-12-22
  • 1970-01-01
相关资源
最近更新 更多