npm 是 JavaScript 世界的包管理工具,而且是 Node.js 平臺的默認包管理工具。經過 npm 能夠安裝、共享、分發代碼,管理項目依賴關係。
css
在開始以前我有話說, 若是上面的問題你都能清楚掌握,那麼這篇文章對你來講就沒有太大的意義來了。若是在有些地方仍是模棱兩可,那不妨和我一塊兒來看看這個npm的葫蘆裏賣的是什麼藥。html
如何開發一個npm包 ?node
若是咱們有一個功能會高頻次用到咱們通常都會把它抽出來方便調用;若是該功能在整個團隊開發都會屢次調用(如 工具類方法,Modal層組件)咱們會抽到公共組件中以方便團隊成員使用;爲了讓更多人使用,咱們能夠將其作成npm包發佈到遠程倉庫。jquery
初始化一個包ios
npm initgit
在開發目錄生成一個 package.json文件,裏面存放着安裝包的信息,以方便其餘開發着使用。
可是直接 npm init咱們須要根據命令行提示一步一步完成基本的信息;如何跳過呢?
複製代碼
** 安裝咱們須要的工具包**github
** npm init -f(force) / npm init -y(yes)**express
這時直接跳過信息填寫,本地生成package.json;後面會詳細講解package.json裏面的內容。
複製代碼
npm install < packageName >npm
安裝模塊;
npm install 會直接去安裝package.json文件的dependencies/devDependencies節點下的依賴。
npm install express 簡寫 npm i express
每次install時後面帶了不少 參數 -g -golbal --save -D ...
下面會一一詳解
複製代碼
安裝開發環境依賴,依賴的版本信息在package.json文件的devDependencies節點下。
ex: npm install --save-dev glup 簡寫 npm i -D glup
複製代碼
安裝生產環境依賴,依賴的版本信息在package.json文件的dependencies節點下。
ex: npm install --save axios 簡寫 npm i -S axios
複製代碼
安裝生產環境精確版本的依賴,依賴的版本信息在package.json文件的dependencies節點下。
dependencies節點下的包版本號 前面沒有~符號(介紹package.json會講到)。
ex:npm install --save-exact jquery 簡寫 npm i -E jquery
複製代碼
表示全局安裝依賴。
若是安裝依賴時沒有帶 -g/-golbal的話。會將該依賴直接安裝到工做目錄的node_module中。
不然,將依賴安裝到全局的node_module中。
全局的安裝路徑根據本機系統而定,固然你也能夠經過npm config set prefix <path>來設定。
複製代碼
解決安裝依賴過慢的問題json
開始使用npm i去安裝包的時候因爲種種緣由致使咱們安裝時間過長,甚至安裝失敗。這個是咱們不能容忍的事情。網上的解決意見都是安裝cnpm修改源來解決這個問題。還有更好的辦法麼?
npm install cnpm -g --registry=https://registry.npm.taobao.org
ok!咱們能夠愉快的用cnpm來安裝了。
npm set registry https://registry.npm.taobao.org/
ok!直接修改npm源,這樣咱們可使用npm。
複製代碼
由於有的公司基於安全穩定考慮會在內部部署npm倉庫,咱們在家裏開發要切換到taobao源,到了公司咱們又要切換到公司的源;這樣三五次就會很苦惱。
安裝nrm (nrm是專門用來管理和快速切換私人配置的registry)
npm install nrm -g -S 全局安裝nrm
複製代碼
nrm ls 查看查看默認配置 帶*是咱們當前使用的源
複製代碼
nrm current 能夠直接輸入如下命令查看當前使用的是哪一個源
nrm use cnpm 切換不一樣的源
複製代碼
假如你公司的源是 http://registry.xxx.org
nrm add company http://registry.xxx.org 添加公司源
nrm ls 能夠查看是否添加成功,成功會多一個company的源
nrm use company 切換到公司的源
nrm del company 離職後直接移除
複製代碼
依賴包的操做技巧集合
npm uninstall < packageName >
卸載模塊。(卸載工做目錄的依賴包;不刪除package.json裏面的模塊信息)
ex: npm uninstall jquery (-g / --save-dev / --save)
-g : 卸載全局安裝的依賴包
--save-dev:卸載工做目錄的依賴包;同時刪除模塊留在package.json中dependencies下的對應信息
--save:卸載工做目錄的依賴包;同時刪除模塊留在package.json中devDependencies下的對應信息
複製代碼
npm update < packageName >
更新依賴包。(更新工做目錄)
ex:npm update express (-g)
-g:更新全局環境
複製代碼
npm root < packageName >
查看依賴包的安裝路徑。
ex:npm root express (-g)
-g:全局環境下依賴包安裝地址
複製代碼
npm list < packageName >
查看全部安裝的依賴包。
ex:npm list 簡寫 npm ls (-g)
-g:查詢全局環境的依賴包。
複製代碼
npm outdated < packageName >
查看過時的依賴包。
ex:npm outdated (-g / pkg)
-g:查看全局的依賴包。
pkg:查看對應的pkg。
注:推薦使用檢查依賴包更強大的一個工具 npm-check,
更強大分析包的能力以及能夠經過加上參數提供交互式更新方式,詳情請參考其文檔說明
複製代碼
npm prune < packageName >
刪除沒有使用到的依賴包。
ex:npm prune (pkg)
pkg:刪除pkg。
複製代碼
鎖定安裝依賴
npm config set save-prefix="flag"
flag:可選 (~,^)
或者:npm config set save-exact true 安裝精確版本好安裝相似:npm install -E
複製代碼
npm home < packageName >
運行home命令能夠打開此package的主頁。
無論你機器中是否全局安裝了此package,甚至是不存在於你當前項目中均可以打開。
ex: npm home express
複製代碼
**npm repo < packageName > **
如何打開package的Github倉庫地址。
無論你機器中是否全局安裝了此package,甚至是不存在於你當前項目中均可以打開。
複製代碼
**npm shrinkwrap **
使用shrinkwrap命令會在你當前項目中生成一個npm-shrinkwrap.json文件。
它會將當前package.json中引用的依賴版本鎖定,當下次執行npm install時,
它默認安裝的實際上是shrinkwrap.json中鎖定的依賴版本號。
注意:npm在 5.0.0+ 版本默認生成 package-lock.json,就是說你如今不須要 npm shrinkwrap了
複製代碼
package-lock.json爲的是讓開發者知道只要你保存了源文件,到一個新的機器上、或者新的下載源,只要按照這個package-lock.json所標示的具體版本下載依賴庫包,就能確保全部庫包與你上次安裝的徹底同樣。
這裏有很好的package_lock.json的問答----知乎
依賴包調試技巧
npm link
假如 unit(開發的依賴包);在發佈以前咱們怎麼調試unit是否能正常工做?
先將unit依賴包link到全局,而後在須要調試的項目裏,將該命令連接到本地node_modules下面。
ex:
$ # 先去到模塊目錄,把它 link 到全局
$ cd path/to/my-utils
$ npm link
$
$ # 再去項目目錄經過包名來 link
$ cd path/to/my-project
$ npm link my-utils
複製代碼
{
"name": "normalize.css",
"version": "3.0.3",
"description": "Normalize.css as a node packaged module",
"style": "normalize.css",
"files": [
"LICENSE.md",
"normalize.css"
],
"homepage": "http://necolas.github.io/normalize.css",
"repository": {
"type": "git",
"url": "git://github.com/necolas/normalize.css.git"
},
"main": "normalize.css",
"author": {
"name": "Nicolas Gallagher"
},
"license": "MIT",
"gitHead": "2bdda84272650aedfb45d8abe11a6d177933a803",
"bugs": {
"url": "https://github.com/necolas/normalize.css/issues"
},
"_id": "normalize.css@3.0.3",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"express": "latest",
"mongoose": "~3.8.3",
"handlebars-runtime": "~1.0.12",
"express3-handlebars": "~0.5.0",
"MD5": "~1.2.0"
},
"devDependencies": {
"bower": "~1.2.8",
"grunt": "~0.4.1",
"grunt-contrib-concat": "~0.3.0",
"grunt-contrib-jshint": "~0.7.2",
"grunt-contrib-uglify": "~0.2.7",
"grunt-contrib-clean": "~0.5.0",
"browserify": "2.36.1",
"grunt-browserify": "~1.3.0",
}
"_shasum": "acc00262e235a2caa91363a2e5e3bfa4f8ad05c6",
"_from": "normalize.css@3.0.3",
"_npmVersion": "2.7.0",
"_nodeVersion": "0.10.35",
"_npmUser": {
"name": "necolas",
"email": "nicolasgallagher@gmail.com"
},
"maintainers": [
{
"name": "tjholowaychuk",
"email": "tj@vision-media.ca"
},
{
"name": "necolas",
"email": "nicolasgallagher@gmail.com"
}
],
"bin" : { "myapp" : "./cli.js" }
"dist": {
"shasum": "acc00262e235a2caa91363a2e5e3bfa4f8ad05c6",
"tarball": "https://registry.npmjs.org/normalize.css/-/normalize.css-3.0.3.tgz"
},
"directories": {},
"_resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-3.0.3.tgz",
"readme": "ERROR: No README data found!"
}
複製代碼
name
- 包名.
version
- 包的版本號。
description
- 包的描述。
homepage
- 包的官網URL。
author
- 包的做者,它的值是你在https://npmjs.org網站的有效帳戶名,遵循「帳戶名<郵件>」的規則,
contributors
- 包的其餘貢獻者。
dependencies
/ devDependencies
- 生產/開發環境依賴包列表(-S -D 就會分別安裝到這個目錄中)。它們將會被安裝在 node_module 目錄下。
repository
- 包代碼的Repo信息,包括type和URL,type能夠是git或svn,URL則是包的Repo地址。
main
- main 字段指定了程序的主入口文件,require('moduleName') 就會加載這個文件。這個字段的默認值是模塊根目錄下面的 index.js。
keywords
- 關鍵字
許多包有一個或多個可執行文件但願被安裝到系統路徑。在npm下要這麼作很是容易(事實上,npm就是這麼運行的)。
這須要在你的package.json中提供一個bin字段,它是一個命令名和本地文件名的映射。在安裝時,若是是全局安裝,npm將會使用符號連接把這些文件連接到prefix/bin,若是是本地安裝,會連接到./node_modules/.bin/。
如:bin" : { "myapp" : "./cli.js" } 複製代碼
這麼一來,當你安裝myapp,npm會從cli.js文件建立一個到/usr/local/bin/myapp的符號連接(這使你能夠直接在命令行執行myapp)
npm模塊的完整的版本號通常是【主版本 . 次要版本 . 補丁版本】,通常狀況下,次要版本號發生改變的話,表示程序有重大更新。
3.8.3:當前版本號
>3.8.3:必須大於3.8.3
<3.8.3:必須小於3.8
~3.8.3:會匹配3.8.x的最新版本;不會自動升級3.9.0
^3.8.3:會匹配3.x.x的最新版本;不會自動升級4.0.0
複製代碼