0

我想做这样的事情:

var jsonFileName = aDynamicallyGeneratedJsonFileName(),
    defaultObject = {'my': 'default', 'json': 'object'};

var cachedOrRequiredObject = require(jsonFileName, defaultObject);

如果不存在,我希望cachedOrRequiredObject得到,并且defaultObject即使jsonFileName不存在,我也希望 require 缓存作为jsonFileName键保留。defaultObjectjsonFileName

当然这不起作用——尤其是在找不到文件时需要错误。我可以做类似的事情:

function myRequire (file, defaultObj) {
   try {
       return require(file);
   catch () {
       return defaultObj;
   }
}

但是每次执行require都会访问文件系统以尝试查找file它何时不存在。除了复制 require 的功能和维护我自己的缓存之外,我有没有更好的方法来做到这一点?

4

1 回答 1

2

您必须为不存在的文件维护自己的缓存,require没有理由这样做。一个非常简单的对象缓存就足够了(并且是 require() 内部使用的):

function requireWithDefault(path, default){
    var module
    if ((module = requireCache[path]) === undefined){
        try {
            module = require(path)
        } catch(e) {
            module = requireCache[path] = default
        }
    }
    return module
}
于 2012-09-09T02:08:19.120 回答