2017-02-14 103 views
3

我對webpack的工作原理有些困惑。如果您在根目錄中運行npm install examplePackage,是否將軟件包安裝到硬盤上?那麼這是否意味着您可以隨時在任何文件中導入該軟件包?這與在項目中運行npm install examplePackage不同,這與之有何不同?是因爲當你將項目推送到Github時,會有一個package.json供其他人使用,並確保他們有必要的庫來運行你的應用程序?節點知道如何通過項目搜索包或硬盤驅動器?它只是先檢查你的圖書館,然後如果它沒有找到它,它會看你的硬盤?全球webpack安裝與項目特定的webpack安裝

回答

3

npm install examplePackage將在當前目錄的node_modules中安裝軟件包。當您使用require('examplePackage')導入Node.js中的模塊時,它首先檢查它是否是核心模塊(例如fs)。如果它不是核心模塊,則開始查找當前目錄的node_modules。如果在該目錄中找不到該模塊,則會移至父目錄並檢查其目錄。等到找到該模塊或到達文件系統的根目錄爲止。請參見https://nodejs.org/api/modules.html#modules_loading_from_node_modules_folders

這確實意味着您可以從文件系統的任何位置導入已安裝在/中的軟件包。儘管在/中只安裝所有依賴關係是可能的,但具有項目特定依賴關係的優點很多。可能最大的優點是,您可以輕鬆地與其他人共享您的項目,並且可以確保它能夠爲他們工作(假設兼容的Node.js版本)。

節點知道如何通過您的項目搜索包或硬盤?

它只在你的硬盤上,特別是在上面提到的node_modules目錄中。正如您已經注意到的,您可以在package.json中指定依賴關係,但節點本身對此信息不做任何處理。相反,您需要運行npm install,這將安裝所有列出的依賴關係package.json。之後,您可以正確導入這些模塊。

注:npm install examplePackage不添加examplePackagepackage.json,它只是安裝它。如果您想將其作爲依賴項添加,請使用npm install --save examplePackage或者將其作爲npm install --save-dev examplePackage的devDependency。 https://docs.npmjs.com/cli/install

CLI

命令行工具或通常與可執行文件,如包的WebPack,在node_modules/.bin,爲了執行它們可用,他們必須要麼在你的shell PATH或直接調用。由於項目調用本地安裝的可執行文件非常常見,因此您可以在package.jsonscripts部分使用它們,而無需在node_modules/.bin前添加它們。例如,爲了運行的WebPack你可以定義的腳本:

"scripts": { 
    "build": "webpack" 
} 

然後運行npm run build而不必運行./node_modules/.bin/webpack的。有關腳本的更多信息:https://docs.npmjs.com/misc/scripts

+0

對於webpack,如果你'npm install webpack -g',並且你運行'npm build',它不會工作,因爲它沒有在本地安裝到你的項目中?如果您將腳本部分放在package.json中,那麼它是否仍然能夠在根目錄中找到webpack? – stackjlei

+0

它會工作,如果它在你的shell的'PATH'中。全局安裝(使用'-g')包應該放在你的'PATH'中(大多數的Node.js安裝都會這樣做,或者告訴你如何去做)。 –