Process.chdir() 对 require 没有影响

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使用的目录吗?

jfr*_*d00 6

来自node.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"."".."相对于当前工作目录,则可以'.'从函数中删除该测试。