覆盖需要从root用户启动并检查节点模块而不更改其名称

时间:2017-07-26 19:16:08

标签: javascript node.js webpack dependencies require

我试图分享我的客户端和服务器代码,我想要一种需要我的依赖关系的整洁方式。

我目前正在使用webpack作为我的构建工具,并且我已将其设置为解析为我的assets / js文件夹,因此我对客户端的依赖关系看起来像这样:

require('validators/login.js');

我希望在整个服务器上共享完全相同的代码,但我不想将if语句放入以检查它是否是服务器或客户端正在执行的操作要求所以我可以做像

这样的事情
if server
  rootRequire..
else
  require

我喜欢的是服务器使用需要像客户端那样从根目录开始,但我也不想剥夺它的功能来搜索node_modules文件夹,如果它不会返回结果。

我也希望在不将所有代码放在node_modules文件夹中的情况下完成此操作。

有没有人对如何正确覆盖要求有一些好的建议?我已经阅读了大多数hacky解决方案,例如使用符号链接或在node_modules中放置内容,而且我没有找到那些答案,我喜欢干净的东西,实际上覆盖需要正确。

1 个答案:

答案 0 :(得分:0)

我想我已经提出了一个我非常满意的解决方案,我想与其他需要答案的人分享。

var module = require('module');
var baseRequire = module.prototype.require;

module.prototype.require = function()
{
    // Add any extra paths here...
    var extraPaths = [
        __dirname
    ];

    for (var i = 0, len = extraPaths.length; i < len; i++) {
        if (this.paths.indexOf(extraPaths[i]) == -1) {
            this.paths.push(extraPaths[i])
        }
    }

    return baseRequire.apply(this, arguments);
};