如果我有一个node.js应用程序,它有数百个引用模块的文件(比如下划线),我想用另一个模块替换那个模块(比如lodash),那么做这个替换的显而易见的方法就是全局名称替换并切换package.json文件中的模块。
无论如何只是更改名称所引用的模块,以便当node.js看到require('moduleA')时,它实际上会加载'moduleB'吗?现在我知道这会导致命名地狱,因为任何在项目上工作的人都会看到require('moduleA')并且不知道正在加载的真实模块是'moduleB'所以最终你可能想要第一个解。我正在考虑的用例是,如果您想尝试一些API兼容模块的替代方案来测量应用程序的性能(例如)与每个模块。
答案 0 :(得分:2)
如果这是一个正在进行的事情,并且您希望保持以编程方式在选项之间切换的能力,例如在测试中:
而不是在整个代码库中使用require("underscore");
,而是需要一个本地文件,而不是require("./lib/underscore");
,并让该文件有条件地重新导出下划线或不同的库:
if (global.USE_LODASH) {
module.exports = require("lodash");
} else {
module.exports = require("underscore");
}
如果在决定切换之前尝试替代库是一次性的事情,并且您希望在没有查找和替换所有文件的情况下快速执行此测试:强>
进入node_modules
文件夹,删除或重命名underscore
文件夹,并将名为underscore的符号链接添加到替换模块的文件夹中。我不建议将其作为长期解决方案:再次运行npm install
可能会撤消此黑客攻击,大多数项目都会选择避免将node_modules
文件夹检入其源存储库。
答案 1 :(得分:0)
尝试使用mock-require
模块。