2013-09-24 157 views
56

有沒有辦法來改變node_modules文件夾的位置?更改node_modules位置

例如:

- dir1 
- dir2 
- node_modules 

到:

- dir1 
- dir2 
    - node_modules 
+4

我想你正在尋找一種方法來在不同的文件夾中安裝依賴關係,對吧?如果是這樣,你只需要在'dir2'裏面移動'package.json'文件,然後從dir2運行'npm install'。 – Kamrul

+0

@Kamrul但是我將不得不運行dir2的應用程序? –

+0

@Kamrul它爲我做了詭計!只需使用shell腳本啓動服務器,而不是默認的npm start。請將它作爲答案發布,以便我可以接受它。 –

回答

42

以下是在默認情況下看起來的int node_modules文件夾

Module.prototype.load = function(filename) { 
    debug('load ' + JSON.stringify(filename) + 
     ' for module ' + JSON.stringify(this.id)); 

    assert(!this.loaded); 
    this.filename = filename; 
    this.paths = Module._nodeModulePaths(path.dirname(filename)); 

    var extension = path.extname(filename) || '.js'; 
    if (!Module._extensions[extension]) extension = '.js'; 
    Module._extensions[extension](this, filename); 
    this.loaded = true; 
}; 

因此,代碼,以下是詳細的搜索模式:

  1. Node.JS查看是否給定的模塊是核心模塊。 (例如httpfs等)總是優先於裝載 模塊。

  2. 如果給定的模塊不是核心模塊(例如httpfs等),Node.js的然後將開始搜尋一個新的目錄,node_modules

    它將從當前目錄(相對於Node.JS中當前正在執行的文件)開始,然後沿着文件夾層次結構前進,檢查每個級別的node_modules文件夾。 一旦Node.JS發現node_modules文件夾,則它將嘗試加載給定的模塊或者作爲(的.js)JavaScript文件或命名子目錄;如果它找到了指定的子目錄,它將嘗試以各種方式加載文件。因此,例如

  3. 如果您的請求加載模塊「utils的」,其目錄不是.js文件然後:
    Node.JS將搜索分層目錄在下列方式node_modulesutils

    ./node_modules/utils.js 
    ./node_modules/utils/index.js 
    ./node_modules/utils/package.json 
    
  4. 如果Node.JS仍然無法找到上述步驟的文件,Node.js的就會開始尋找到的目錄路徑從環境變量,即您的機器上NODE_PATH集(明顯受到Node.js的設置安裝程序文件,如果你在Windows上) 在所有然後上述步驟沒有找到,將打印一個堆棧跟蹤stder
    例如Error:Cannot find module 'yourfile'
    欲瞭解更多信息:鏈接是here甚至循環需要()解釋非常好..

+4

非常感謝你對這個很好的解釋。所以把它放在一起 - 由於與其他模塊的兼容性,有沒有簡單的方法來做到這一點,或不應該做的? –

+1

你可以用你的require('./ pathFolder/PathFile');' –

+0

但是這不是我想要達到的目的。我想要的只是將node_modules文件夾放在其他地方。 –

1

事實上,我們甚至可以編輯nodevars.bat文件中的最後一行是:

if "%CD%\"=="%~dp0" cd /d "%HOMEDRIVE%%HOMEPATH%"

我們可以指定,而不是用戶的主目錄照顧我們自己的目錄中:

%HOMEDRIVE%%HOMEPATH%

這樣node-modules-location會自動關閉。