2013-03-09 71 views
3

我目前是使用JavaScript構建Windows 8應用程序團隊的一員。 我們使用npm和browserify來管理依賴關係,並將我們的模塊轉換爲AMD瀏覽器友好格式。用於複雜應用程序結構的NodeJS本地模塊

我們遇到的一個問題是瘋狂的需要路徑。這是因爲我們的應用程序「組件」中有一個頂級文件夾。該文件夾包含一堆嵌套的UI組件/模塊。這些模塊有時需要駐留在lib目錄中的lib utils和helper。

因此,例如,生活在「我的/應用/組件/產品/格/項目」模塊可能需要位於「我的/應用/ lib中/助理/視圖」的輔助模塊。

需求路徑有點瘋狂,非常難看: require(「../../../../ lib/helpers/view」);

我們正在盡最大努力以模塊化方式構建應用程序。現在我認爲解決這個問題的正確方法是讓我們的組件模塊依賴於這些util輔助模塊。我可以將lib幫助器放到他們自己的外部私人倉庫回購站中,但這對於讓其他團隊訪問(加上git私人回購緩慢)而言已經很痛苦。另外,由於這些模塊僅用於應用程序,所以進行更改,推送更改,然後返回到應用程序和npm更新是浪費時間。這對一些人來說很好,但如果我們真的把這個打破了,它可能會變得很快。

我所能做的NPM安裝的組件的package.json裏面的 「我的/應用/ lib中/助理/視圖」?但是npm install不會自動爲我們做這件事。

我知道其他一些方法(NODE_PATH,也許使用npm安裝鉤子或可能npm預安裝腳本),但想知道是否有其他人有類似的問題和良好的解決方案。

+0

我現在的方法是運行一個批處理腳本,只要我們爲NODE_PATH設置環境變量var。 – pbo 2013-03-09 19:11:05

+0

好吧,多玩點npm鏈接可能是去這裏的路。我讓我的應用程序模塊具有package.json文件,在這些模塊中的npm鏈接使它們可用,然後從頂層npm鏈接它們。只有這裏吸取的東西是我需要確保我們npm鏈接在全新安裝,因爲npm install不會爲我鏈接這些模塊。 – pbo 2013-03-09 19:39:12

+0

我認爲單獨的回購就是要走的路。 – Domenic 2013-03-13 02:24:51

回答

0

有一件事你可能做的是在你需要的配置爲您的助手的名稱...

require.config({ 
    paths: { 
     "helpers": "my/app/lib/helpers"  
    } 
}); 

這將減少對你的一些很長的路徑。

+0

這也適用於nodejs? – pbo 2013-03-09 18:32:51

+1

是的,我認爲這只是前面的requirejs,我們沒有使用。看上面,我們使用browserify來包裝我們的模塊。另外,我希望這個解決方案也可以在服務器上運行。 – pbo 2013-03-09 18:57:12

7

你可以把你的"my/app/components/product/grid/item"文件寫入node_modules/grid/item.js,然後當你在應用程序代碼中使用require('grid/item')時,你將得到你想要的文件,並且需要更多的需求路徑語法。只需檢查node_modules/grid/item.js和其他文件到git。該node_modules/目錄甚至不必在頂層,因爲由節點和browserify使用的需要算法將用於node_modules/目錄搜索從目前的路徑一路下跌到/,直到它找到一個匹配的模塊。

只要確保將"grid"添加到您的package.json中的"bundledDependencies"數組中,以便您不會意外地在它上面安裝某些東西。

你可以閱讀更多關於checking node modules into git

閱讀browserify handbook about avoiding ../../../../../../的部分獲取更多信息。

NODE_PATH總是一個壞主意,而browserify不支持它。永遠不要使用它。

+0

有趣。我知道NODE_PATH並不是最好的方法,但我最近剛剛觀看了TJ的模塊化網絡應用視頻(http://tjholowaychuk.com/post/38571504626/modular-web-applications-with-node-js-and-express)與快遞和他提到使用NODE_PATH。 – pbo 2013-03-10 03:22:26

+0

是的,我們git忽略node_modules/*,但我認爲shrinkwrap鎖定所有的依賴關係,甚至依賴關係。這篇文章似乎沒有提到這個事實。 – pbo 2013-03-10 03:24:44

+0

我寧願不把它們放在頂層,所以就像你提到的那樣,我可能會創建一個目錄結構,其中頂級node_modules用於第三方,然後在我的lib文件夾中,應用程序本地模塊可能有node_modules。我想這個方法的問題是你必須有一個本地模塊的平面列表。 – pbo 2013-03-10 03:29:02

0

require()函數的問題是路徑與當前文件是相對的。你可以把你的模塊放在node_modules目錄下,但這是你能做的最糟糕的事情。node_modules是存在所有第三方模塊的目錄。如果遵循這個簡單規則,保持始終保持最新狀態非常簡單方便,則可以刪除所有依賴關係(刪除node_modules),然後執行npm install

最好的解決方案是定義您自己的require函數並使其成爲全局函數。例如:

你的項目結構是:

my-project 
| tools 
|- docs 
|- logs 
|- conf 
`- src 
    |- node_modules 
    |- package.json 
    |- mod.js 
    |- a 
    | `- b 
    |  `- c.js 
    `- d 
     `- app.js 

mod.js

global.mod = function (file){ 
    return require ("./" + file); 
}; 

app.js

//This should be the first line in your main script 
require ("../mod"); 

//Now all the modules are relative from the `src` directory 
//You want to use the a/b/c.js module 
var c = mod ("a/b/c"); 

這一切,很容易。如果要獲取位於node_modules中的第三方模塊,請使用require()。如果你想讓你自己的模塊使用mod()。

請記住,node_modules僅適用於第三方模塊,規則nº1。

+0

像require(「./」+ file)這樣的自定義require函數不是靜態可分析的,並且不適用於browserify。把你自己的模塊放在'node_modules /'中是完全可以接受的,這就是爲什麼首先有''bundledDependencies''這樣的事情的原因。 – substack 2013-03-10 03:45:32

+0

如果它與browserify不兼容,請將其與browserify兼容。我的解決方案比將內容放在node_modules裏面更清潔 – 2013-03-10 09:32:42