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。

我有两个考虑(但他们不完全满足这个问题):

  1. 如果包已经在node_modules文件夹中,它可以通过它的规范名称(在package.json )引用自己。

  2. 包可以在自己的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.1sub.project.2sub.project.2replacemy.project 。 当然,所有的名字都应该是由npm初始化的package.jsonname

解决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-selfinstall-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。