2017-07-26 26 views
1

我試圖分享我的客戶端和服務器代碼,並且我想要一種整潔的方式來要求我的依賴關係。覆蓋需要從根啓動並檢查節點模塊而不更改它的名稱

我目前使用的WebPack作爲我的構建工具,我已經將它設置爲解決我的資產/ JS文件夾,所以我的客戶端是這個樣子的依賴關係:

require('validators/login.js'); 

我想要共享服務器完全相同的代碼,但我不希望把如果語句來檢查,如果它是在做了要求,所以我可以做這樣的事情

if server 
    rootRequire.. 
else 
    require 

服務器或客戶端什麼我就像爲客戶端做的服務器使用require一樣,並從根目錄開始,但我也不想剝奪它的功能來搜索node_modules文件夾,如果它沒有返回結果。

我也想這樣做,而不是將所有的代碼放在node_modules文件夾中。

有沒有人有一些好的建議,以便如何正確覆蓋需求?我已經閱讀了大部分hacky解決方案,比如使用符號鏈接或者將其放置在node_modules中,而我並沒有在尋找這些答案,我希望這些東西是乾淨的,實際上覆蓋需要正確的。

回答

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