我期待monkey-patch require()用我自己的函数替换它的文件加载。我想,在内部需要(是模块)确实是这样的:更改nodejs如何require()获取文件
- 转换是模块到一个文件路径
- 负载为一个字符串
- 编译字符串转换成一个模块对象的文件路径,并设置各种全局正确
我正在寻找替换步骤2而不重新执行步骤1 + 3.看看公共API,需要()哪些做1-3,和require.resolve()哪个做1。一种将步骤2与步骤3分离的方法?
我已经看过require嘲弄工具的来源,例如mockery - 他们似乎正在做的是用一个函数替换require(),该函数拦截某些调用并返回用户提供的对象,并传递其他调用本地require()函数。
对于上下文,我试图编写一个函数require_at_commit(module_id,git_commit_id),它加载了一个模块和任何该模块的要求,因为它们是在给定的提交。
我想要这个函数,因为我希望能够编写某些函数,这些函数a)依赖于我的代码库的各个部分,并且b)保证当我演变我的代码库时不会改变。我想在各个时间点“冻结”我的代码,所以认为这可能是一种避免打包20个代码库副本的简单方法(另一种方法是使用“my_code_v1”:“git:// .. 。“在我的package.json中,但我觉得这将是臃肿和缓慢的20个版本)。
更新:
所以对于加载模块的源代码是在这里:https://github.com/joyent/node/blob/master/lib/module.js。具体来说,要做这样的事情,你需要重新实现Module._load,这非常简单。然而,还有一个更大的障碍,那就是第1步,将module_id转换为文件路径,实际上比我想象的更难,因为resolveFilename需要能够调用fs.exists()来知道在哪里终止搜索...所以我不能只替换单个文件,我必须替换整个目录,这意味着只需将整个git修订版导出到目录并在该目录下指向require(),而不是重写require() 。
更新2:
端了完全采用了不同的方法...看到我的回答下面添加
你可以改为在你的git提交中包含'node_modules'文件夹吗?这样,当你签出一个提交时,你可以获得整个项目的完整快照,包括特定的模块版本。在这里看到更多的信息http://www.futurealoof.com/posts/nodemodules-in-git.html – Noah
谢谢...我试图从我的代码的更高版本访问我的代码的早期版本,虽然,所以我认为这不会起作用。另外,当我开始使用nodejs时,我沿着检查node_modules进入git的路径,这似乎以非常糟糕的方式对二进制编译模块造成严重破坏...... – josh