標籤:
什麼是npm ?
npm 是 nodejs 的包管理和分發工具。它可以讓 javascript 開發人員能夠更加輕鬆的共用代碼和共用程式碼片段,並且通過 npm 管理你分享的代碼也很方便快捷和簡單。
截至目前 最新的穩定版 npm 是 3.3.12
本文譯自 docs.npmjs.com ,有改動。
一、安裝 Nodejs 和更新 npm
如果你是 windows 或者 Mac 使用者,安裝 nodejs 的最好辦法就是到官網去下載一個安裝包。安裝完成後在控制台輸入 node -v 如果正確返回 node 版本號碼,則說明安裝成功。
安裝完 nodejs 就已經有了 npm, 不過由於 nodejs 更新速度要慢於 npm ,因此在一般情況下要升級你的 npm 到最新版本,輸入如下命令:
npm install npm -g
如果是 Linux ,可能需要通過 sudo 以 root 許可權運行。
完成後運行 npm -v 可查看當前 npm 版本號碼。
二、修複 npm 相關許可權問題
如果你在全域安裝某個包時遇到 EACCES 錯誤,說明你沒有許可權在 npm 存放全域包檔案的目錄中寫入檔案。這裡提供兩個解決方案:
2.1、修改相關目錄的許可權
2.1.1、尋找 npm 全域包檔案儲存體路徑
npm config get prefix
2.1.2、修改許可權
sudo chown -R `user` <directory>
如果你不想改變整個目錄的許可權,也可以更改子檔案夾 lib/node_modules、bin 和 share 目錄的許可權。
2.2、修改 npm 預設的全域包存放目錄到新位置
可參考官網文檔說明 https://docs.npmjs.com/getting-started/fixing-npm-permissions
三、局部安裝 npm 包
npm 提供了兩種包的安裝形式:局部安裝和全域安裝。你可以通過你的項目使用方式選擇如何安裝。如果你的項目依賴於某個包,那麼建議將改包安裝到局部。其他其他條件下,比如你要在命令列工具中使用這個包,可選擇在全域安裝。
3.1、安裝
安裝一個 npm 包可以通過如下命令:
npm install package-name
這將會在當前位置建立一個 node_modules 檔案夾(如果目錄不存在),並且下載包檔案到這個目錄中。安裝完成後可以看到 node_modules 目錄下多了個檔案夾。註:一般情況下如果安裝失敗目錄會被刪除。
3.2、安裝時如何選擇包版本
如果目前的目錄下不存在 package.json 檔案,那麼當執行 install 時將預設安裝包的最新版本。
如果你有一個 package.json 檔案在目前的目錄下,則根據 檔案中聲明的版本進行安裝。
3.3、使用已安裝的包
一旦安裝完成一個包,你就可以在你的代碼中使用它。例如:你建立了一個 Node module 並使用它。
安裝完 lodash 後,建立一個檔案 index.js 然後輸入下面代碼:
var lodash = require(‘lodash‘); var output = lodash.without([1, 2, 3], 1);console.log(output);
執行 node index.js 它將會輸出 [2,3]
3.4、使用 package.json 和 --save 標誌
另一個管理本地 npm package 的方法是在本地目錄建立一個 package.json 檔案。如果你有 package.json 檔案在項目根目錄,那麼當執行 install 時 npm 會檢查依賴並為其選擇合適的版本進行安裝。這會使你的依賴環境具備可重複性,意味著你可以與其他開發人員分享。
在你的項目目錄中建立 package.json 檔案並輸入以下內容:
{ "name": "demo-app", "version": "1.0.0"}
使用 --save 標誌下載一個包
npm install lodash --save
這將會在下載包檔案之前修改 package.json 檔案的依賴關係欄位。現在開啟剛才建立的 package.json 檔案我們會發現多了個 dependencies 欄位。
3.5、手動添加依賴關係到 package.json
你也可以手動添加依賴關係到 package.json,例如:
{ "name": "demo-app", "version": "1.0.0", "dependencies": { "lodash": "^2.4.1", "tap": "*" }}
運行 npm install ,執行結束後,你會發現node_modules 裡包含 lodash 和 tap 這兩個包。
需要注意的是,如果某個軟體包已被安裝,即使滿足 package.json 的語義化版本規則,npm install 也並不會更新到最新版本。
因此,可靠地重新安裝所有軟體包到滿足 package.json 語義化版本規則的最新版本的辦法是刪除 node_modules 檔案夾 並運行 npm install
四、更新局部安裝的軟體包
我們項目所依賴的包可能會定期或不週期性進行更新,如果我們要使用更新後的新特性就需要更新本地已安裝的軟體包到新版本。
只需在包含 package.json 的目錄中運行 npm update 即可。通過 npm outdated 可以檢測包的目前的版本和最新版本,通過他可以看到哪些包是過時的,但它並不會對本地軟體包進行任何更改。
五、卸載本地已安裝的軟體包
你可以通過 npm uninstall package 命令卸載本地安裝的軟體包
npm uninstall lodash
如果要在卸載的同時從 package.json 依賴關係中解除依賴,可以通過使用 --save 標誌
npm uninstall --save lodash
六、全域安裝npm軟體包
你可以根據自己的情況選擇是否全域安裝某個 npm 軟體包,如果要進行全域安裝可通過 npm install -g package-name 安裝
npm install -g jshint
如果提示 EACCES 錯誤,是因為許可權問題,你可以參考前面相關章節,或者使用 sudo 切換至 root 許可權
sudo npm install -g jshint
七、更新全域安裝的軟體包
如果要更新全域安裝的軟體包,可以使用 npm install -g package-name
npm install -g jshint
如果知道哪些軟體是需要更新的可以使用 npm outdated -g --depth=0 命令
如果要更新所有已全域安裝的軟體包,使用 npm update -g 命令。
八、卸載已全域安裝的軟體包
要卸載已全域安裝的軟體包,使用 npm unistall -g package-name 命令
npm uninstall -g jshint
九、建立一個 Node.js 模組
Node.js 模組是一種發行就緒到 npm 的軟體包,當你要建立一個新模組,首先需要建立一個 package.json 檔案。
可以通過 npm init 建立一個 package.json ,他會引導你輸入一些 package.json 的欄位資訊。有兩個選項是必須輸入的,分別是模組名稱和版本號碼。你還需要輸入一個名字用來作為入口程式的名稱,預設為 index.js
如果你要為作者欄位添加資訊,可以使用下面的格式:
Your Name <[email protected]> (http://example.com)
package.json 檔案建立完成後,你需要建立一個檔案用來在模組被載入時執行,如果你上一步使用預設名字,那麼該檔案名稱就是 index.js
在檔案中添加一個函數到 exports 對象的屬性
exports.printMsg = function() { console.log("This is a message from the demo package");}
測試:
- 推送你的軟體包到npm
- 在項目外建立一個空目錄
- 執行 npm install package-name
- 建立一個 test.js 檔案,require 你的包名字,然後執行上面的方法
- 執行 node test.js , 將輸出上面函數中的代碼
十、推送軟體包到npm庫
你可以推送任何包含 package.json 檔案的檔案夾,比如一個 node module
註冊帳號
要發布軟體包,你必要有一個 npm 帳號,如果沒有可以使用 npm adduser 建立一個。然後使用 npm login 登入。
由於網路問題,我登陸不了。
所以,更多資訊請參考 https://docs.npmjs.com/getting-started/publishing-npm-packages
十一、語義化版本號碼
語義化版本是一個標準,用來聲明當前依賴可以在什麼樣的維度上有更新。
語義化版本號碼發布規範
如果一個項目發布出來,他的版本號碼必須從 1.0.0開始,儘管npm上的有些項目並沒有遵循該標準。在此之後,版本更新應遵循一下原則:
- bug修複和其他小的改動:補丁發布,增加最後一個數字,例如1.0.1
- 增加新特性,不打破現有特性:小版本,增加中間的數字,如1.1.0
- 打破向後相容性的變化:主要版本,增加第一個數字,例如2.0.0
更多資訊請參考 https://docs.npmjs.com/misc/semver
十二、scoped-packages
scoped 就好比是一個 nmp modules 的命名空間。scoped-package 包名字以 @ 開始,scope 就是"@"與"/"之間的部分。
@scope/project-name
每一個 npm 使用者都擁有一個自己的 scope
@username/project-name
你可以從 CLI documentation 擷取到更多關於 scope 的詳細資料。
12.1、更新 npm 和登陸
如果你要通過命令列登陸 npm 那麼必須把 npm 升級到2.7.0以上版本。
sudo npm install -g npmnpm login
12.2、初始化一個scoped-package
通過在包名字前添加 scope 可建立一個 scoped-package
{ "name": "@username/project-name"}
也可以通過在 npm init 命令後面增加 --scope 來建立一個scoped-pacasge
npm init --scope=username
也可以為 npm 配置的 scope 欄位添設定一個值,這樣以後就可以直接使用該 scope 進行 init
npm config set scope username
12.3、發布一個 scope-package
預設狀態下 scoped package 包是私人的,如果要發布出去作為私人模組,你需要一個付費帳號。
然而,你可以把 scoped package 免費的發布為共有包,只需要在發布時配置 access 選項即可。
npm publish --access=public
12.4、使用 scope-package
要使用 scope-package 需要在引用時填寫完整的 scope-package 名字,類似下面的 package.json
{ "dependencies": { "@username/project-name": "^1.0.0" }}
如果要在命令列使用
npm install @username/project-name --save
在代碼中的引用語句
var projectName = require("@username/project-name")十三、Working with npm Organizations
請參考 https://docs.npmjs.com/getting-started/working-with-orgs
npm 入門 - 基礎使用