0

我想知道是否require(pkgName)会成功,即带有名称的包pkgName是否可用。我如何最好地测试呢?

我知道我能做到

try {
  require(pkgName)
} catch (err) {
  available = false
}

但这会吞下加载错误,require如果可能的话,我也想避免打包。

4

3 回答 3

3

最好的方法是使用require.resolve(),因为它实际上并不运行模块中包含的任何代码。

使用内部require()机制来查找模块的位置,而不是加载模块,只返回解析的文件名。

就像require,resolve如果找不到模块则抛出,所以它需要被包裹在try/中catch

于 2013-11-05T19:19:32.860 回答
1

不要认为您可以解决使用require,但您可以专门检查MODULE_NOT_FOUND错误:

function moduleExists(mod) {
  try {
    require(mod);
  } catch(e) {
    if (e.code === 'MODULE_NOT_FOUND')
      return false;
    throw e;
  };
  return true;
}
于 2013-11-05T17:59:30.957 回答
0

我正在展示“swig”模块。可能有更好的方法,但这对我有用。

var swig; 
try { 
    swig = require('swig');
} catch (err) {
    console.log(" [FAIL]\t Cannot load swig.\n\t Have you tried installing it? npm install swig");
}
if (swig != undefined) {
    console.log(" [ OK ]\t Module: swig");
}
于 2013-11-05T17:49:54.367 回答