Process.chdir()对require没有影响

时间:2015-08-12 03:10:23

标签: javascript node.js module commonjs working-directory

给定结构目录结构:

.
├── 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.jscd foo && node ./beta.js

有什么方法可以在文件中添加或设置require使用的目录吗?

1 个答案:

答案 0 :(得分:3)

来自node.js doc for require()

  

如果传递给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提供的任何文件名都不是相对的,并且不以“。”开头。将相对于当前工作目录加载。如果您希望甚至允许"."".."相对于当前工作目录,则可以从该函数中删除'.'的该测试。