我正在编写一个模块,它将用作Node.js应用程序的依赖项。在某些情况下,它将是依赖项的依赖项,这意味着路径解析将发生变化,目前我遇到了问题。也就是说,当我的模块是依赖项的依赖项时,我的模块仍然会查看应用程序根目录,而不是依赖项的根目录。
我认为提出如何解决这个问题的最简单方法是找出确定模块是否依赖的最佳方法。
所以这样做的方法是在我的模块的索引中获取文件的__dirname
,然后向上导航到一个目录以查看该目录是否被命名为node_modules
。
有更好的方法吗?有没有更好的方法来确定被调用的代码是从应用程序的依赖项还是从应用程序本身调用的?
从视觉上讲,它看起来像这样
--app
---/node_modules
-----/A
-----/B
我的模块名为A
A可以由app使用,也可以由B
使用如果它被app使用,我可以使用app-root-path模块快速确定root。但是如果B使用我的模块,我怎么知道呢?解决路径很重要。
以下是我模块中代码的完整性:
var appRoot = require('app-root-path');
var path = require('path');
var configs = {};
function checkIfDependency(){
var temp = path.resolve(path.normalize(__dirname + '/../'));
return path.basename(temp) === 'node_modules';
}
module.exports = function (identifier, pathToProvider) {
if (String(identifier).indexOf('*') < 0) {
throw new Error('did not pass in an identifier to univ-config');
}
if (configs[identifier]) {
return configs[identifier];
}
else {
if (pathToProvider) {
try {
var configPath;
if (path.isAbsolute(pathToProvider)) { //consumer of this lib has been so kind as to provide an absolute path, the risk is now yours
configPath = path.normalize(pathToProvider);
}
else if(checkIfDependency()){ //univ-config is being invoked from a dependency
configPath = path.normalize(??? + '/' + pathToProvider);
}
else{ //univ-config is being invoked from an app
configPath = path.normalize(appRoot + '/' + pathToProvider);
}
var f = require(configPath);
return configs[identifier] = f();
}
catch (err) {
throw new Error('univ-config could not resolve the path to your config provider module - given as:' + pathToProvider);
}
}
else {
throw new Error('no config matched the identifier but no path to config provider was passed to univ-config');
}
}
};