2012-05-10 69 views
6

我已經注意到,在嘗試使用npm安裝看似簡單的節點包(例如nerve,一個「微框架」)時,我常常遇到某種形式的依賴性疼痛。經過一番深入的研究,我發現bcrypt模塊顯然是用C/C++編寫的,必須在軟件包管理器下載後才能編譯。Node.js/npm - 無論如何告訴如果一個包是純JS還是不是?

不幸的是,它似乎是如果你希望這在Windows上工作,答案是(從一個bcrypt問題線程)「安裝Linux VM」。所以在今天早些時候,我做到了這一點,並開始運行到其他依賴項(即使安裝GCC,您甚至可以考慮安裝之前需要安裝certain unnamed apt packages),然後最終在看到另一個C編譯器錯誤(關於某些軟件包或其他未存在的錯誤能夠找到「Arrays.c」我認爲),我實際上放棄了,而是從神經轉爲表達。具有諷刺意味的是,在Linux和Windows上安裝npm的時候,更大更復雜的表達式沒有任何問題。

所以,我的問題是:是否有任何過濾器/依賴關係跟蹤可用,讓你看看一個包是否有除了節點核心之外的附加依賴關係?因爲對我來說節點的魅力是「Javascript中的一切」,而這種東西很不愉快地消除幻覺。事實上,儘管我在C/C++上工作的時間已經超過了我的時間,但是現在每當我看到「製造」某些東西的需求時,我通常就會朝另一個方向尖叫。 :)

+1

我覺得你的痛苦戴夫,但有些時候我們通過優化和資源需求壓低到C/C++。在研究了幾個本地節點模塊並試圖不重複任何操作並使用合理的依賴關係之後,我遇到了一些問題。也許最理性的節點模塊是那些調用或執行本地代碼而不是編譯和鏈接它的節點模塊。 –

回答

4

注意package.json中的「腳本」字段。

如果它包含類似

"scripts": { 
    "install": "make build", 
} 

,並在根目錄下生成文件,有一個很好的可能性,該包裝具有將必須被編譯並建立了一些本機模塊。許多軟件包僅包含一個Makefile來編譯測試。

對包文檔的這種檢查並不排除必須編譯和構建某些依賴項的可能性。這將意味着對package.json中的每個依賴項及其依賴關係等重複此過程。

也就是說,許多模塊已經更新,無需在Windows上構建即可安裝。但是,不能保證所有包。

使用Linux VM似乎是最好的選擇。 Developing Node.js applications on Window爲您提供了安裝VM,Node.js和Express的分步說明。

2

節點不是「一切JavaScript」,因爲擴展節點核心的一種方式是編寫c/C++插件。

所以Node是一個圍繞使用V8的c/C++模塊的javascript包裝。

你怎麼能在純JavaScript中編寫高效的數據庫驅動?這將是可能的但緩慢。

至於過濾器,取決於作者記錄他的包。沒有自動過濾器。

+1

你的意思是像https://github.com/felixge/node-mysql? – Dave

+0

正如我所說,這是可能的(編寫純js數據庫驅動程序),但你真的測試過軟件包嗎?我做到了。 – mpm

+3

我剛剛發現這個比較純JS實現和libmysql的比較:https://github.com/Sannis/node-mysql-bindings-benchmarks/wiki它看起來像https://github.com/sidorares/ nodejs-mysql-native與連接到mysql lib的一樣快。它根本不會讓我感到驚訝 - 這個東西的瓶頸肯定是網絡和數據庫CPU/I/O,而不是客戶端本身? – Dave

7

第一個解決方案不會告訴您,依賴項是否使包不純或不包含。更好的搜索GYP生成的輸出:

find node_modules/ | grep binding.gyp || echo pure 
+0

是的,它提供了一個答案,在這種情況下,它甚至與第一個答案不同。你無法從「構建」中得知它的作用。它可能會構建一些不是純粹的腳本,但它可能不是。而且這個答案也不檢查任何依賴。唯一正確的答案是搜索node-gyp的任何證據,即構建任何不純的東西。 –

相關問題