2014-01-19 91 views
16

今天之後,我得到了奇怪的事情,我在全球安裝異步後,報告的NodeJS無法找到module.following是工作流找不到異步安裝

  1. 安裝異步

    NPM安裝-g異步

  2. 確保異步存在

    NPM列表-g異步

得到如下的輸出:

 
/usr/local/lib 
├── [email protected] 
└─┬ [email protected] 
    └─┬ [email protected] 
    └─┬ [email protected] 
     └── [email protected] 

3.try使用它。

 
I create a simple js file which only contains one statement: 
var async=require('async'); 
then execute the file via node, I get exception: 
 
Error: Cannot find module 'async' 
    at Function.Module._resolveFilename (module.js:338:15) 
    at Function.Module._load (module.js:280:25) 
    at Module.require (module.js:364:17) 
    at require (module.js:380:17) 
    at Object. (/lxzhu/nodejs/asynctest/test.js:1:73) 
    at Module._compile (module.js:456:26) 
    at Object.Module._extensions..js (module.js:474:10) 
    at Module.load (module.js:356:32) 
    at Function.Module._load (module.js:312:12) 
    at Function.Module.runMain (module.js:497:10) 
+0

你爲什麼要在全球安裝它?通常,您全局安裝的唯一東西是您依賴於可執行文件的軟件包。 –

+0

我想知道爲什麼 - 不管最佳實踐如何。我會認爲它會工作 – cyberwombat

回答

15

這是因爲你在全球範圍內安裝異步。

npm install async將放入一個名爲node_modules的目錄,並且require查找算法會在那裏找到它。

+0

,所以它永遠不會查找全球安裝?我在全球安裝它,因爲我想在我的電腦的兩個項目中使用它。 –

+0

我知道我可以在沒有-g選項的情況下使用這個選項 –

+1

iirc當你試圖以編程方式使用模塊時(例如,通過'require')它不會查找你的全局安裝。兩個不同的項目應該有自己的'package.json'文件,每個文件都有異步作爲依賴項。 – bendecoste

0

最後,我從http://nodejs.org/api/modules.html得到答案。

全局安裝後,我需要把它的子目錄放到NODE_PATH中,使它出現在節點的搜索路徑中。

另外,正如文檔所述,建議在本地存儲模塊,NODE_PATH用於版本兼容性,我們不應該再使用它。

6

全局安裝的NPM並不總是意味着該模塊可以共享多個項目。這是一個非常流行的誤解。您可以閱讀this blog post on nodejs.org以獲取更多信息,但一般來說,全局模塊用於命令行工具和其他系統實用程序,而不是用於代碼中使用的模塊。

因此,理想情況下,您需要本地模塊爲您的每個項目。

1

在多個項目中使用全球安裝的模塊的正確方法是使用npm link命令

npm link將創建全球已安裝的軟件包的符號鏈接到您的應用程序node_modules目錄

編輯:既然NPM @ 5做一個本地安裝npm install foo將鏈接從系統緩存類似紗線的策略。因此,即使在全局安裝相同模塊時,也可以使用npm install作爲本地安裝

3

全局安裝的異步。爲此,我們必須創建並安裝異步模塊。

NPM安裝異步--save

此命令行中node_modules文件夾中添加文件。