给定结构目录结构:
.
├── alpha.js
└── foo
└── beta.js
文件内容
alpha.js
module.exports = "alpha"
富/ beta.js
var cwd = process.cwd()
process.chdir('../')
var alpha = require('./alpha.js')
console.log(alpha)
process.chdir(cwd)
从foo/beta.js
开始。我希望能够让require
认为当前的工作目录是项目根目录。运行以下示例时,上述示例无效。
node ./foo/beta.js
但是,如果我将代码切换到foo/beta.js
以下内容。从系统中读取文件并将其传递给npm模块_eval
。
更新了foo / beta.js
var path = require('path')
var cwd = process.cwd()
process.chdir(path.join(__dirname, '..'))
var fs = require('fs')
var _eval = require('eval')
var alpha = _eval(fs.readFileSync('./alpha.js'))
console.log(alpha)
process.chdir(cwd)
这确实有效,这证明了require
也应该可行。无论你在哪里运行,如果从它总是需要文件。 node ./foo/beta.js
或cd foo && node ./beta.js
有什么方法可以在文件中添加或设置require
使用的目录吗?
答案 0 :(得分:3)
如果传递给require()的模块标识符不是本机模块, 并且不以'/','.. /'或'./'开头,然后节点从 当前模块的父目录,并添加/ node_modules和 尝试从该位置加载模块。
如果在那里找不到它,那么它会移动到父目录,然后 等等,直到达到文件系统的根目录。
通过此,您可以看到当前目录未用于加载模块。这里的主要内容应该是模块路径相对于当前模块的位置。这允许模块以独立的方式加载子模块,而不必知道父目录在目录结构中的位置。
这是一个解决方法,如果传递给它的文件名不以路径分隔符或.
开头,则从当前目录加载模块文件描述符。
var path = require('path');
function requireCWD(fname) {
var fullname = fname;
if (fname && fname.length &&
!path.isAbsolute(fname) &&
fname.charAt(0) !== '.') {
fullname = path.join(process.cwd(), fname);
}
return require(fullname);
}
然后,您向requireCWD提供的任何文件名都不是相对的,并且不以“。”开头。将相对于当前工作目录加载。如果您希望甚至允许"."
和".."
相对于当前工作目录,则可以从该函数中删除'.'
的该测试。