javascript – Process.chdir()对require没有影响

给定结构目录结构:

.
├── 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.我希望能够欺骗要求认为当前工作目录是项目根目录.运行以下示例时,上面的示例不起作用.

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)

这确实有效,这证明它也应该可以满足要求.无论你在哪里运行,如果从它总是需要文件.节点./foo/beta.js或cd foo&&节点./beta.js

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

解决方法:

node.js doc for require()

If the module identifier passed to require() is not a native module,
and does not begin with ‘/’, ‘../’, or ‘./’, then node starts at the
parent directory of the current module, and adds /node_modules, and
attempts to load the module from that location.

If it is not found there, then it moves to the parent directory, and
so on, until the root of the file system is reached.

从这里,您可以看到当前目录未用于加载模块.这里的主要内容应该是模块路径相对于当前模块的位置.这允许模块以独立的方式加载子模块,而不必知道父目录在目录结构中的位置.

这是一个解决方法函数,如果传递给它的文件名不以路径分隔符或者..开头,则从当前目录加载模块文件描述符.

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的任何文件名都不是相对的,并且不以“.”开头.将相对于当前工作目录加载.如果你想允许甚至“.”和“..”相对于当前工作目录,然后您可以删除该测试’.’从功能.

上一篇:javascript – 如何在node.js中并排使用CommonJS和AMD


下一篇:javascript – 花括号内的变量启动