什么是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@example.com> (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 npm npm 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
寫在后面
關於本文如果您有任何建議或疑問請在下面留言交流。
