包 require
本身及其子系统可以吗?
例如有模块:
src/deep/path/to/module.js
这需要要求
src/another/module.js
代替:
require('./../../../another/module.js');
一个可以:
require('<self>/another/module.js');
?
例如,这在测试中可能很有用:测试单元可以引用其测试对象,而无需长长的上下式路径。
我有两个考虑(但都不能完全满足这个问题):
如果包已经在
node_modules
文件夹中,它可以通过它自己引用 规范名称(在其package.json
中)。包可以在它自己的
node_modules
文件夹中创建指向它自己的符号链接(symbolic link)(原文如此!)。还没有尝试过,可能会在一些解决的情况下导致死循环。
最佳答案
解决方案1
将其拆分为不同的子项目,将每个子项目放入不同的文件夹中。例如:
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")
这可以删除 '../../...' 相对路径。
注意:它可以在同一个文件夹/项目中完成,通过这样做,
在子文件夹中,可以轻松引用项目self。
例如,当 sub.project.1
和 sub.project.2
都被 my.project
替换时。当然,所有的名字都应该是npm初始化的package.json
中的name
。
解决方案2
在文件夹 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")
因此“../../...”可以更改为更容易读取的路径。
如果 myProjectRootDir
恰好是项目名称并且
package.json
中的包名,没问题。
解决方案 3
有npm包:require-self
, install-self
,
他们做类似的事情。
解决方案4
在容易require
的地方写一个新的.js
文件,
然后将所有烦人的相对引用放入其中。
例如写在node_modules/mymods.js
// mymod.js
module.exports.mod_one = require("../path/to/mod/one.js");
//...
然后 require('mymod')
可以给所有其他模块。
这不是最好的解决方案,需要的所有引用资料
需要手工完成。但它是一个文件,所以它是
可管理,并集中了 future 部署的引用。
这个解决方案的一个缺点是,如果你把它放在
node_modules/
文件夹,此文件夹在 git 仓库中被忽略,在推送或分支 git 仓库时需要小心。
删除node_modules文件夹时,也会误删文件。
可能还有更多我不知道的解决方案。
关于javascript - Node.js 包自引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22442697/