我想知道是否require(pkgName)
会成功,即带有名称的包pkgName
是否可用。我如何最好地测试呢?
我知道我能做到
try {
require(pkgName)
} catch (err) {
available = false
}
但这会吞下加载错误,require
如果可能的话,我也想避免打包。
最好的方法是使用require.resolve()
,因为它实际上并不运行模块中包含的任何代码。
使用内部
require()
机制来查找模块的位置,而不是加载模块,只返回解析的文件名。
就像require
,resolve
如果找不到模块则抛出,所以它需要被包裹在try
/中catch
。
不要认为您可以解决使用require
,但您可以专门检查MODULE_NOT_FOUND
错误:
function moduleExists(mod) {
try {
require(mod);
} catch(e) {
if (e.code === 'MODULE_NOT_FOUND')
return false;
throw e;
};
return true;
}
我正在展示“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");
}