Node.js包自引用
包可以require
本身及其子系统吗?
例如,有一个模块: src/deep/path/to/module.js
,需要src/another/module.js
代替:
require('./../../../another/module.js');
可以只是:
require('<self>/another/module.js');
?
例如,在testing中这可能是有用的:testing单元可以引用其testing对象,而不需要长时间的上下式path。
我有两个考虑(但他们不完全满足这个问题):
-
如果包已经在
node_modules
文件夹中,它可以通过它的规范名称(在package.json
)引用自己。 -
包可以在自己的
node_modules
文件夹中创build符号链接(sic!)。 还没有尝试,可能会导致一些解决案件的无限循环。
解决scheme1
将其拆分为不同的子项目,将其放入不同的文件夹中。 举个例子:
sub.project.1/ sub.project.2/
在子项目1 /
# cd ../sub.project.1 npm link # cd ../sub.project.2 npm link sub.project.1
然后在sub.project.2中,你可以简单地做到这一点:
var something = require(“sub.project.1”)
这可以删除'.. / .. / …'相对path。
注意:可以在相同的文件夹/项目中完成,通过这样做,在子文件夹中,项目自我可以很容易地被引用。 例如,当sub.project.1
和sub.project.2
被sub.project.2
replacemy.project
。 当然,所有的名字都应该是由npm初始化的package.json
的name
。
解决scheme2
在文件夹node_modules/
# cd node_modules ln -s .. myProjectRootDir # # where: .. : means parent directory in linux shell # '#' means comments in linux shell #
那么它可以在同一级目录树下使用:
var something = require("myProjectRootDir/path/to/js/file")
因此“.. / .. / …”可以更容易地更改为path读取。 如果myProjectRootDir
恰好是package.json
的项目名称和包名称,那没问题。
解决scheme3
有npm包: require-self
, install-self
,他们做类似的事情。
解决scheme4
写一个新的.js
文件,它很容易require
,然后把所有恼人的相对引用。
例如,把它写在node_modules/mymods.js
// mymod.js module.exports.mod_one = require("../path/to/mod/one.js"); //...
然后require('mymod')
可以给所有其他模块。 这不是最好的解决办法,所有需要的手段都需要手工完成。 但它是一个单一的文件,所以它是可pipe理的,并集中参考未来的部署。
这个解决scheme的缺点之一是,如果你把它放在node_modules/
文件夹中,并且这个文件夹在git仓库中被忽略,那么在推送或者分支git仓库的时候需要小心。
删除node_modules文件夹时,文件也可能被意外删除。
可能有更多的解决scheme我不知道。
那么你可以缩短一点。 在这种情况下,您不需要领先的./
require("../../../another/module.js");
再去掉尾随的.js
require("../../../another/module");
另一个答案是build议使用process.cwd()
但要非常小心。 只有当应用程序从同一目录初始化时,您的require
调用才会有效。
从它的声音来看,4个目录已经很深了。 您可能想要考虑将您的大型项目分解为更小,单一用途的模块。 我们需要更多关于该项目的信息,以了解这是否是正确的决定。
我经常使用process.cwd()
来使这个事情变得更易于pipe理。 这将返回节点应用程序实际运行的位置,并允许您以更简洁的方式创buildpath。
有些东西可能像var x = require(process.cwd() + '/lib/module')
没有看到你正在做什么; 我不确定这是否会有所帮助,但是您也可以执行var connect = require('express/connect')
等操作。 基本上你可以传递已安装的本地模块,然后创buildpath。