npm做爲開發的一個經常使用的工具,在使用的時候,固然能夠駕輕就熟,可是有時候真的問本身,到底有多瞭解這個經常使用的工具,其實也是以爲有點心虛,有種「只會用但不瞭解」的感覺。固然這並不會影響個人開發和使用,可是總以爲不去認真梳理一下,有種罪惡感。node
所以,就梳理一下本身的知識吧,你們要辯證地看待,我也是儘可能負責任地描述正確的觀點,若有誤解,務必告訴鄙人,我也想學習更多瞭解更多git
npm,是node package manager的縮寫,從名稱上理解,node 包管理器。npm的背後,是有一個軟件註冊中心(registry,下面解釋到),理解爲一個數據庫,詳細記錄了每一個包(package)的信息,包括做者、版本、依賴、受權信息等。來自各個大陸的開源開發人員使用npm來共享和借用包,許多組織也使用npm來管理私有開發。github
從做用上認識:web
NPM是隨同NodeJS一塊兒安裝的包管理工具,能解決NodeJS代碼部署上的不少問題。數據庫
- 容許用戶從NPM服務器下載別人編寫的第三方包到本地使用。
- 容許用戶從NPM服務器下載並安裝別人編寫的命令行程序到本地使用。
- 容許用戶將本身編寫的包或命令行程序上傳到NPM服務器供別人使用。
若是我換種說法的話,就好像,你下載使用別人的類庫,以及你本身封裝類庫上傳給別人使用差很少吧npm
從官方上定義上理解,能夠大致上從三部分去認識它:json
npm有個著名的 網站,在這個網站上,能夠尋找和了解包的狀況,找到合適本身使用的工具資源等。使用該網站來發現包、設置配置文件和管理npm體驗的其餘方面windows
從名字上就能知道了,就是命令行接口。說白了就是用來與npm進行交互的輸入的命令腳本bash
從中文上理解,能夠理解爲註冊表,註冊中心,或者npm註冊源,它是一個大型的JavaScript軟件公共數據庫。每一個包由軟件和元數據組成。開源開發人員和公司的開發人員使用npm registry向整個社區或其組織的成員提供包,並下載包用於本身的項目。服務器
上面三點都說起到一個概念——package(中文翻譯過來就包啦,因此咱們通俗地稱呼它爲包),那實際上它是個什麼東西呢?撇開官腔話解釋,咱們能夠通俗點去理解一下,它是一個軟件工具,是一個類庫,是一份組織好的代碼,它提供出來使用,或者是開發者本身整理好這份代碼,那就須要包裝好它整理好它,很形象地稱之爲pacakge。
簡單來講,就是打包好一份代碼啦。
那官方一點講,package(包)是一個文件或者文件夾,它包含一個名叫package.json的文件,由它來描述包的信息,以便發佈到npm registry
從用途上理解,例如我有一些封裝好的工具、函數,或者框架類庫,想要多人維護它的話,就要打包出來發佈到一個線上的地方(registry),別人能夠用來下載來,而後共同維護開發。或者也是單純的想要提供給別人使用,也須要打包出來吧,造成一份獨立的文件,這就是package的含義了。
關於pacakge的概念認知,先到這裏,你們先去知道這麼一個東西,關於它的更多內容,下一篇會進行詳細介紹。
實際上,npm就是圍繞這package來進行一系列管理操做,它提供了一個地方存放這些包信息(registry),並提供一些命令(CLI)來讓用戶去管理pacakge。而咱們怎麼知道這些包的信息或者去尋找他呢,就是去 網站 裏瞭解了。
要使用npm進行開發,首先得擁有一個npm帳號,這樣方便你在npm圈子裏進行活動。
界面操做我相信聰明的你確定會了,那簡單說一下一些註冊信息,方便更好的填寫
npm帳號分爲兩種,一個是免費用戶,一個是付費用戶。前者發佈的包和使用的包都是面對大衆的,公用的。後者是能夠發佈本身私有的npm包或建立一個組織(企業等),容許發佈組織私有包和使用一些私有的包
默認地,運行一下命令,就會在你默認設置的registry裏進行登陸,沒有更改過默認設置就是在http://registry.npmjs.org
(後面有詳細說明):
npm login
複製代碼
接下來會提示你輸入你的信息,按照你註冊的信息輸入便可
登陸成功後,能夠檢查一下,運行
npm whoami
複製代碼
接着會輸出如今登陸的帳號用戶名
npm的使用是基於nodejs的環境下的,所以須要在你的電腦上安裝nodejs。安裝的途徑有兩個
固然咱們強烈是建議使用第一種方式,這樣的話,在你後續須要對你的應用進行各個版本測試時方便切換node版本和npm版本,以及你須要同時負責好幾個項目,而這幾個項目須要用到不一樣版本的npm時進行切換開發。
儘管你當前沒有這種需求,可是爲了後續以防萬一,仍是使用第一種方式比較好。
針對不一樣系統的用戶,採用不一樣的版本管理器應用
前往 官網 選擇對應的版本進行下載,建議選擇有LTS(long term support)標記的版本,顧名思義,有這種標記的版本是被長期維護支持的,可靠性比較高
若是你是使用Linux的,建議使用 NodeSource installer 進行安裝
在咱們下載安裝好nodejs後,其實npm也相應的自動已經安裝好了,下載不一樣版本的nodejs就會有不一樣版本的npm,可是npm版本的迭代速度要比nodejs的快,因此,你要確認一下安裝的npm版本是不是你想要的。
在命令行工具中運行 npm -v
,查看當前的npm版本。
在命令行工具中運行 node -v
,查看當前的nodejs版本。
若是你想要把npm更新到新版本,能夠先了解一下這兩個版本的區別
最新的穩定版本。是已經發布了的。 運行如下命令便可
npm install npm@latest
npm的最新未發佈版本,最終做爲最新版本發佈。通常是你想在發佈前就使用即將的新版本進行測試時。運行如下命令便可
npm install npm@next
npm registry,咱們常說的npm源,常見的是說使用淘寶源。爲何須要設置這個東西?默認地,咱們發佈的公共包,是發到http://registry.npmjs.org
上,別人搜索進行下載資源也是基於這個資源庫。可是有些時候,你下載的資源須要從別處來下,例如使用淘寶源,會是下載更順暢速度更快,更多時候,當你須要下載的公司的私有資源時,就須要設置對應的公司資源所在地址。所以,咱們常會遇到一個問題,我如何設置這個地址,即npm registry
這方法簡單粗暴,直接把你的npm registry設置一個默認的註冊地址
npm config set registry xxx
複製代碼
xxx爲你想要的註冊地址
有時候在不一樣項目裏,須要採用不一樣的registry地址來進行npm包的處理,例如項目A須要用源A,項目B須要用源B。
這時候咱們可使用 npmrc 這個工具來管理。
先了解下該工具的一些簡單的命令
npmrc // 列出全部的profiles
npmrc [name] // 切換profile,支持模糊匹配
npmrc -c [name] // 建立新profile,並命名爲[name]
複製代碼
注意:這跟.npmrc文件是不一樣的,這裏是一個npm包工具
運行如下命令進行全局安裝
npm i npmrc -g
複製代碼
npmrc -c projectA
複製代碼
新建了一個名叫projectA的profile
命令跟設置默認註冊源是同樣的
npm config set registry xxxxA
複製代碼
就是這麼簡單的三步,就能劃分出了一個profile,對其設置該registry,同理按照以上第二步和第三部,再新建一個profileB,和設置源B。這時候就會有兩個profile,有其對應的源。 這時候,咱們就能夠根據項目的須要,切換到不一樣的profile下,就能自動使用對應的註冊源了。
npmrc projectB
複製代碼
例如上述命令,切換到了另外一個名叫projectB的profile上
前面兩個解決方案,都能解決不一樣項目下使用不一樣的npm registry,可是他們是單獨的一個項目下的npm資源統一使用一個npm registry,那萬一是一個項目下的資源要是分別使用不一樣的npm registry呢?上面的兩個方案就有點力不從心了。
這時候,咱們能夠對npm包進行分域,一個域下的資源使用一個registry。
咱們在進行安裝npm包時,就能夠設置該包所在的域了。例如
npm install @myscope/packageName
複製代碼
從這行命令來看,就是下載安裝一個名叫packageName的npm包,放在了node_modules文件夾下的myscope文件下。這裏的用myscope就是該包所在的域的名字,@爲域的一個使用標識。
設置了以後在package.json文件裏也能夠看到,已經加上了這麼一個域名,在例如使用nodejs的require()引用文件時,也是要帶上這個@域名的。畢竟文件是在這個文件夾下的
by the way,設置域除了爲了設置不一樣registry的目的外,還能夠用來避免和其它包重名,避免衝突。
對包進行分好域後,就要設置該域下的npm包採用哪一個registry來進行管理資源了。 運行
npm login --registry=xxxx --scope=@myscope
複製代碼
或者
npm config set @myscope:registry xxxx
複製代碼
這樣一來,咱們就對名叫myscope的域設置了xxx的registry地址了。以後在處理這些包的時候,就會使用該註冊地址。未設置的,仍是用回以前默認的地址。
上面介紹了設置不一樣registry,那麼咱們怎麼按照需求登陸上不一樣的registry,而後進行不一樣的管理呢?
運行npm login
就會在當前設置的默認registry下進行登陸
若是使用了npmrc工具,能夠npmrc profilename
切換到默認指定了registry的profile下,而後運行npm login
登陸便可
運行npm login --registry=xxxx