我有一个应用程序,我希望它能够抵御缺少的依赖项。某种回退机制,如果依赖项丢失或损坏。
所以我有这个,哪些猴子补丁require(),理论上如果第一次无法加载,将重新安装一个依赖:
const cp = require('child_process');
const Mod = require('module');
const req = Mod.prototype.require;
Mod.prototype.require = function (d) {
try {
return req.apply(this, arguments);
}
catch (e) {
if (/^[A-Za-z]/.test(String(d))) {
console.error(`could not require dependency "${d}".`);
try {
var actualDep = String(d).split('/')[0];
console.error(`but we are resilient and we are attempting to install "${actualDep}" now.`);
cp.execSync(`cd ${_suman.projectRoot} && npm install ${actualDep}`);
return req.apply(this, arguments);
}
catch (err) {
console.error('\n', err.stack || err, '\n');
throw e;
}
}
else {
throw e;
}
}
};
但是上面的补丁没有按预期工作。问题是最初的try语句:
return req.apply(this, arguments);
它主要起作用,但它做了一些奇怪的事情......例如,它开始安装
bufferutil
utf-8-validate
这对我没有意义,因为require()通常没有任何错误,但是当使用补丁时,require()突然失败。
任何人都知道可能会发生什么?超级奇怪。
(注意它所做的只是尝试重新安装以字符[a-zA-z]开头的依赖项,它不会尝试安装以&#39开头的依赖项; ./'等等。)