【问题标题】:Override require to start from root and check node modules without changing it's name覆盖需要从根开始并检查节点模块而不更改其名称
【发布时间】:2018-01-02 06:55:11
【问题描述】:

我正在尝试共享我的客户端和服务器代码,并且我想要一种整洁的方式来要求我的依赖项。

我目前正在使用 webpack 作为我的构建工具,并且我已将其设置为解析为我的 assets/js 文件夹,因此我对客户端的依赖项如下所示:

require('validators/login.js');

我想在服务器上共享完全相同的代码,但我不想放入 if 语句来检查是否是服务器或客户端在做要求,所以我可以做类似的事情

if server
  rootRequire..
else
  require

我希望服务器像客户端一样使用 require 并从根目录开始,但我也不想剥夺它的功能来搜索 node_modules 文件夹,如果它不返回结果。

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

是否有人对如何正确覆盖 require 有一些好的建议?我已经阅读了大多数 hacky 解决方案,例如使用符号链接或将东西放在 node_modules 中,我不是在寻找那些答案,我想要一些干净并且实际上可以正确覆盖 require 的东西。

【问题讨论】:

    标签: javascript node.js webpack dependencies require


    【解决方案1】:

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

    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);
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 2014-07-08
      • 2018-05-12
      • 1970-01-01
      • 2021-09-17
      相关资源
      最近更新 更多