在嘗試模塊化大型現有節點+快速+貓鼬 應用程序分爲多個安裝的應用程序,每一個開發爲 獨立的NPM包,我們想知道是否共享一個 貓鼬他們之間的實例是一個好主意?分享多個NPM之間的貓鼬實例程序包
比方說,我們有一套NPM軟件包,每個軟件包都包含客戶端資產, Mongoose模型以及使用Express實現的REST-API。他們確實共享 幾個共同的特徵,但基本上被認爲是獨立的 可重複使用的文物。主機應用程序,也快速爲基礎,根據不同的根的URI安裝這些 :
var discussions = require('discussions'),
tickets = require('tickets'),
events = require('events'),
express = require('express'),
app = express();
var environment = { ...see below... };
...
app.use('/events-api', events(environment));
app.use('/tickets-api', tickets(environment));
app.use('/discussions-api', discussions(environment));
現在,由於events
,tickets
和discussions
應用程序(獨立的NPM包 通過主機package.json
被拉)用貓鼬,如做主機應用程序本身,我們認爲我們會通過某種environment
對象傳遞主機Mongoose實例 對象,該對象還包括主機想要與安裝的應用程序共享的其他 對象。
您是否發現這種方法存在明顯的缺陷?在安裝應用程序 在這種情況下將不在其 各自package.json
指定貓鼬作爲依賴,他們將不require('mongoose')
的正常進行,而是從主機 負責將其連接到拿到貓鼬實例MongoDB的。
如果這是一個壞主意,你認爲各個子應用程序申報自己的依賴 對貓鼬,每個NPM包將得到貓鼬自己 副本,並會各有連接到MongoDB的,對不對?
一些背景資料:
- 我們真的想在一個主機應用程序的應用程序,在一個進程中運行 ,而具有多個節點的實例。 主機包含用於認證和其他事情的中間件。
- 我們希望將這些應用作爲單獨開發的NPM軟件包包括在內,作爲我們構建的各種主機應用程序的版本依賴關係,而不僅僅是將它們的源複製到主機應用程序。
- 我們意識到,重複使用多個 安裝的應用程序之間的相同Mongoose實例將使它們共享相同的模型名稱空間。
編輯:爲了澄清包結構中的所有已後npm install
ED:
host/
assets/
models/
routes/
node_modules/
express/ ...
mongoose/ ...
events/
assets/ ...
models/ ...
routes/ ...
tickets/
assets/ ...
models/ ...
routes/ ...
discussions/
assets/ ...
models/ ...
routes/ ...
即,events
,tickets
,和discussions
應用程序不包括 貓鼬(或快遞)的他們自己的,但旨在依靠總是存在的提供這些依賴關係的主機應用程序 。
我們在此假設的NPM包像tickets
不能簡單地從父 require
的東西,對不對?
非常感謝您的回答,但並不意味着說,核心問題是隻是把一個間接的水平?如果我們的每個「可掛載應用程序」NPM軟件包都包含這個新的「DB」包作爲依賴關係,它們都會在各自的'node_modules'中有一個嵌套的Mongoose實例,它們都需要連接到MongoDB?我目前的假設是,根/主機應用程序不足以聲明對其它NPM軟件包可以「需要」的DB包的依賴性。對不起,如果我誤解了你。 – Greg
哦,對不起,我很困惑。我以爲你只是在創建可重用的模塊,而不是你正在安裝的實際的NPM軟件包。 NPM真的是在項目之間共享包,而不是在單個項目中創建模塊。你希望獲得什麼,使用常規模塊不能解決?在我看來,你會重複很多順着NPM路徑的事情。 – Bill
爲我的問題添加了一個小小的說明。使用NPM包的基本原理是,它們很容易被聲明爲主機的依賴關係,在這種情況下,通過簡單的版本控制,多個主機可以直接從它的'package.json'使用不同版本的相同子應用程序。實際的NPM包有自己的Git回購和開發生命週期,但我想我們可以使用Git子模塊,而不是通過主機'package.json'管理它們?還是有另一種重用模塊的巧妙方式? – Greg