上一篇 npm入門(一)—瞭解基本組成與概念 簡單介紹了一下npm的相關知識,這篇能夠說是npm的核心知識。css
關於pacakge,是有分爲public pacakge(公共包)、private pacakge(私有包)。前面咱們也知道npm帳號也有兩種,一直的免費用戶,一個是付費用戶。私有包是付費用戶才能發佈的。html
直觀地,在npn website上看,package前面會有個標籤標註該包是公有的仍是私有的vue
在此以前,咱們先了解這麼一個概念——scopes(中文意思是做用域)。咱們在註冊npm帳號和建立組織時,你將被授予一個與你的用戶或組織名稱匹配的範圍,即你得到了一個適用範圍(scope),這個範圍是你的用戶名或者建立的組織名。你能夠將此範圍用做相關包的命名空間。如你有一個package名叫mypackage
,你的用戶名爲myusername
,則你能夠把這個package放到你的域裏node
@myusername/mypackage
複製代碼
這樣有什麼做用呢?jquery
默認地,若是咱們不對registry進行了任何設置,那麼發佈的包就是基於默認的registry(http://registry.npmjs.org
)的,發佈出來的包是公共的,任何人均可以訪問使用。webpack
public package也有兩種:git
私有包,只有付費用戶才能建立。私有包,是指只有受權用戶才能進行下載發佈等管理,並且還能指定各類權限,例如只讀只寫之類的。github
私有包確定是指定了範圍的(scoped),默認地,指定了範圍的包都是私有包(固然後面能夠手動更改)web
私有包能夠劃分兩種vue-router
上面咱們知道包的一些分類,那麼,如何在須要時改變它們的類型呢?
在npm website上操做的方法就不說了,直接說敲命令的方式:
npm access restricted <pacakge-name>
複製代碼
<pacakge-name>
替換爲真實包名
在npm website上操做的方法就不說了,直接說敲命令的方式:
npm access public <pacakge-name>
複製代碼
<pacakge-name>
替換爲真實包名
須要注意的是,只有是付費用戶才能轉爲私有。
私有包有時候爲了協做,須要添加其餘開發者進行一塊兒管理,因此須要把私有包受權給某些用戶。根據私有包類型
在npm website上操做的方法就不說了,直接說敲命令的方式:
npm owner add <user> <your-package-name>
複製代碼
要授予npm用戶對私有組織包的訪問權,您必須有一個組織全部者將它們添加到您的組織中,而後將它們添加到有權訪問私有包的團隊中。具體步驟參考 這裏
說了那麼多,是時候應該知道,如何建立一個package了。
進入你想要建立package的文件夾根目錄中,運行如下命令
npm init
複製代碼
進行npm項目(package)的初始化,當運行這個命令後,會出現一個問卷,例如問你項目的名稱,做者,描述等信息,你按照實際狀況輸入迴應便可。填完問卷後,會在該目錄下生成一個package.json
文件,該文件裏包含剛回應問卷的一些信息。
若是你懶得一個個迴應,可使用默認的狀況,運行
npm init --y 或者 npm init --yes
複製代碼
這樣會自動根據你當前目錄的狀況,生成一系列默認信息在package.json
文件。
固然咱們也能夠設置一些init時的固定指定信息,如
npm set init.author.name xxxx
npm set init.author.email xxxx
複製代碼
這裏就設定了init時固定做者信息是啥
若是你想建立的是指定域的包,那麼運行
npm init --scope=@yourscopename
複製代碼
yourscopename替換成你想要起的域的名稱
上一篇咱們說過,package是由一個package.json文件描述組織起來的,因此這個文件相當重要。先大概看一下這個文件長哪樣
{
"name": "xxxx",
"version": "1.0.0",
"description": "xxx",
"author": "myname <myname@xxx.com>",
"private": true,
"scripts": {
"dev": "concurrently \"webpack-dev-server --inline --progress --config build/webpack.dev.conf.js --env.sysName=eod\" \"node mock-server.js\""
},
"dependencies": {
"vue-router": "3.0.1"
},
"devDependencies": {
"autoprefixer": "7.1.2"
},
...
}
複製代碼
挑了些經常使用常見的內容展現出來。
屬性 | 描述 |
---|---|
name | 必需。package的名稱 |
version | 必需。package的版本,遵循semantic versioning spec(語義版本控制規範) |
description | 推薦。用來描述你的package的一些信息,方便別人在npm website上查找你的pacakge |
author | 做者的相關信息。格式Your Name <email@example.com> (http://example.com) 。包含了你的名稱、郵箱和博客之類的網址,不必定要全寫 |
private | 你的package是私有的仍是公有的 |
scripts | 一些npm腳本,造成npm指令,方便你進行某些工做,如構建 |
dependencies | 這是你的package發佈後,羅列的所須要依賴的一些別人的package,缺少了這些package,你的package也會不能如期正常工做 |
devDependencies | 這裏是羅列你在開發過程當中所依賴的一些package,爲了方便你的開發所用的包,缺乏他們也不會影響到你的包發佈後的正常使用,就放在這裏了。 |
顧名思義,這個至關於用該package以前先看它的意思,即便用手冊之類的意思。通常地,推薦package包含這個文件比較好,方便用戶使用你的包。這個文件是使用markdown語法
此文件只有在發佈包的新版本時纔會在包頁面上更新。
發佈package以前,要好好檢查你的文件裏是否包含某些私人信息,敏感信息。請注意刪除或者發佈時忽略掉。使用.npmignore
或.gitignore
文件來忽略掉,詳情見 此
發佈包命令:
npm publish
複製代碼
npmrc
工具npm publish --access public
複製代碼
一個package必定要指定某個版本,而爲了規範網絡上你們各類各樣的package,方便你們交流共享等,就制定了一個版本控制規範,你們在給本身package指定版本/更新版本的時候就好好考慮版本號了。
以當前版本爲1.0.0爲例子,遵循如下規範:
更新狀況 | 位置 | version |
---|---|---|
修復當前版本的一些bug | 第三位 | 1.0.1 |
新增向後兼容的新特性 | 第二位 | 1.1.0 |
進行了破壞性地沒法向後兼容的更改 | 第一位 | 2.0.0 |
在package.json裏,咱們看到依賴項裏,包的版本信息裏會出現^~
符號。這裏要知道這些符號表明什麼意思。例如
"eslint": "^3.19.0",
"css-loader": "~3.19.0",
複製代碼
表明安裝這個包的版本信息是浮動的,而不是指定死版本。
^表明固定主版本號的,其他號浮動,如^1.3.0
,高於等於1.3.0,1.x.x都符合,可是要低於2.0.0
~表明固定次版本號的,修訂號浮動,如~1.3.0
,高於等於1.3.0,1.3.x都符合,可是要低於1.4.0
雖然package已經有版本號做爲一些信息反饋給用戶,可是語義化不夠,不夠直觀明瞭,所以能夠爲package加上tag,即標籤,爲其備註一些信息,讓用戶更淺顯易懂點。如運行
npm publish --tag beta
複製代碼
在發佈時,就爲package打上了beta標籤了。
默認地,發佈時會自動繼承這個包上次發佈的標籤的信息,如上次打了個beta標籤,後面直接運行npm publish
時,也會自動應用上beta標籤。
須要注意的是,tag名儘可能不要使用數字或者v(不論大小寫)開頭的名字,由於tag的命名空間和版本號是一塊兒的,會發生衝突。
若是想要指定版本進行打標籤,運行
npm dist-tag add <packagename>@<version> tagname
複製代碼
如
npm dist-tag add vue@1.2.0 beta
複製代碼
當你在維護一個包時,免不得了在調整以後須要對版本進行改變,以告知使用你的包的人,運行如下命令進行更新版本並進行發佈
npm version <new-version>
npm publish
複製代碼
當你再也不想維護一個package,你須要告知那些依賴了你的包的人,讓他們知道你的這個包你再也不進行維護了,這是出於你的責任心啦。運行
npm deprecate <package-name> 'message'
複製代碼
這裏的message就是你須要告知別人你的一些關於棄用的消息,這裏必定要帶上這個消息哦,否則就是另外一個含義了。
若是你只想棄用某個版本,而不是整個package,運行
npm deprecate <package-name>@<version> 'message'
複製代碼
注意:棄用以後別人在npm的網站上會搜不出你的包來哦。訪問你的包的網頁也會有標識表名你的包給棄用了。別人在安裝你的包時也會出現棄用的消息
若是往後你又回心轉意了,想繼續維護這個包,那麼你就能夠取消棄用了。運行
npm deprecate <package-name> ''
複製代碼
你們留意到嗎,這裏跟棄用的命令很像,惟一的區別在於,以前的message替換成'',這樣就能夠取消棄用了
若是你不想維護你的包了,你能夠選擇棄用,也能夠選擇轉移你的包,但願它再找個主人吧。你能夠把你的包轉移給@npm,運行
npm owner add npm <package-name>
npm owner rm <user> <package-name>
複製代碼
上面的兩句命令就是,爲你的package添加受權給npm,而後刪除你對該包的擁有權。<user>
爲你的帳號名
因此,當轉移了包以後,你就沒了對它的使用權了,也不能更新它。
發佈了一個包以後,若是往後你不想讓它再出現了,又不想僅是標誌棄用,那麼能夠選擇取消這個包的發佈。固然這個行爲可能會對別人產生很差的影響,例如別人依賴你的包,你無聲無息地把這個包給取消掉了,叫別人情何以堪。
當你發佈了一個公共package以後,72小時內後悔了,能夠運行
npm unpublish <package-name> -f
複製代碼
若是你僅想取消某個版本,運行
npm publish <package-name>@<version>
複製代碼
若是是72小時後,那麼須要聯繫 npm support了。若是你想取消的是一個組織包,非我的包,那麼須要聯繫 enterprise@npmjs.com
咱們已經瞭解過了pacakge的基本狀況,知道從他的建立到發佈,到發佈後的管理。都是從自身做爲包的擁有者角度去處理包,那麼如今是時候做爲一名使用者角度,知道如何使用別人的包了。
使用別人的包,首先就得安裝下載他們的包,安裝分爲兩類:
例如在你的某個項目中,須要使用到別人的一些包,那麼須要在你這個項目下下載安裝所需的包,下載下來的包只會在該項目中被引用。
換個思路去理解,就是像好久之前開發一個項目,須要引入某個類庫,如jquery,那麼就下載jquery.min.js,放在項目裏某個文件夾裏,而後在適當的位置引入它來進行使用,如在index.html裏經過script標籤進行引用。這樣的話,其實這個jquery.min.js只會在這個項目裏被引入使用,而不能在第二個項目B中被引用,由於它是被放在項目A裏面了,這種就是本地安裝
運行如下命令進行本地安裝:
npm install
複製代碼
會依據項目中的package.json
文件的依賴項以及聲明的semver規則的最新版原本進行安裝對應的包。若是該項目裏沒有node_modules
文件夾,那麼會新建一個,裏面內容就是安裝的package代碼,若是有,那麼直接在這個文件夾下新增pacakge
若是想要安裝指定某個包(私有包請帶上@域名/
),運行
npm install <package-name>
複製代碼
若是項目裏沒有package.json
文件,那麼會下載指定包的最新版本,若是存在,會下載package.json
中聲明的semver規則的最新版本。
若是想要指定依賴的類型(dependencies, devDependencies等)
npm install <package-name> --save
複製代碼
加上--save
是指該package是生產依賴項,存放在package.json
的dependencies
裏,其實這是個默認的行爲,即就算不加上--save
,默認也是放在dependencies
裏。
若是想放在開發依賴裏,運行
npm install <package-name> --save-dev
複製代碼
若是想要安裝指定版本或者tag的包,運行
npm install <package-name>@<version>
npm install <package-name> <tag>
複製代碼
須要注意的是,若是是指定了某個tag的package進行安裝,那麼下載安裝若是不帶上tag,會自動默認依據上次的tag信息進行安裝,例如,
npm install loadash beta
複製代碼
下次安裝loadash的時候,默認是下載beta標籤的loadash
全局安裝,就是指安裝一些共用的包,在你的本地計算機下的項目,都能共用這些包。例如npm了,每一個項目都須要使用npm,那麼全局安裝就行了,沒必要要每一個項目都獨立安裝一遍。指令也很簡單
npm install -g
npm install -g <package-name>
複製代碼
其實跟本地安裝介紹的意思是同樣的,只不過區別就在於,多了個-g
來標記是全局安裝
隨着時間的變化,可能你本地下載的包已是比較老的了,須要更新一下別人的包,那麼在項目根目錄下運行
npm update
複製代碼
便可更新package.json
裏羅列的包。
若是想單獨更新某個包(私有包請帶上@域名/
),運行
npm update <package-name>
複製代碼
一樣地,若是想更新全局的包,也是加個-g
便可,如
npm update -g
複製代碼
若是想看看當前項目裏有哪些過期的包,能夠運行
npm outdated
複製代碼
會顯示當前有哪些包過期了。固然這也能夠用來檢驗是否更新成功了
若是想看看有哪些過期的全局包,運行
npm outdated -g --depth=0
複製代碼
若是某個包你不想要了,爲了節省空間以及協做時避免別人下載一些沒必要要的資源,能夠刪除某些不須要的包。運行(私有包請帶上@域名/
)
npm uninstall <package-name>
複製代碼
指定刪除某個包
npm uninstall -g <package-name>
複製代碼
指定刪除某個全局包