Tho*_*ggi 4 javascript module working-directory commonjs node.js
鉴于结构目录结构:
.
??? alpha.js
??? foo
??? beta.js
Run Code Online (Sandbox Code Playgroud)
和文件内容
阿尔法.js
module.exports = "alpha"
Run Code Online (Sandbox Code Playgroud)
foo/beta.js
var cwd = process.cwd()
process.chdir('../')
var alpha = require('./alpha.js')
console.log(alpha)
process.chdir(cwd)
Run Code Online (Sandbox Code Playgroud)
从内foo/beta.js。我希望能够require将当前工作目录视为项目根目录。运行以下命令时,上面的示例不起作用。
node ./foo/beta.js
Run Code Online (Sandbox Code Playgroud)
但是,如果我将代码切换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)
Run Code Online (Sandbox Code Playgroud)
这确实有效,这证明它也应该是可能的require。无论你在哪里运行,如果它总是需要该文件。node ./foo/beta.js或者cd foo && node ./beta.js
有什么方法可以预先设置或设置文件中require使用的目录吗?
如果传递给 require() 的模块标识符不是本机模块,并且不以“/”、“../”或“./”开头,则 node 从当前模块的父目录开始,并添加/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);
}
Run Code Online (Sandbox Code Playgroud)
然后,您提供给 requireCWD 的任何文件名都不是相对的且不以“.”开头。将相对于当前工作目录加载。如果要允许 even"."和".."相对于当前工作目录,则可以'.'从函数中删除该测试。
| 归档时间: |
|
| 查看次数: |
4115 次 |
| 最近记录: |