前言
npm作為開發的一個常用的工具,在使用的時候,當然可以得心應手,但是有時候真的問自己,到底有多瞭解這個常用的工具,其實也是覺得有點心虛,有種“只會用但不瞭解”的感受。當然這並不會影響我的開發和使用,但是總覺得不去認真梳理一下,有種罪惡感。
因此,就梳理一下自己的知識吧,大家要辯證地看待,我也是儘量負責任地描述正確的觀點,如有誤解,務必告訴鄙人,我也想學習更多瞭解更多
簡單知道npm
npm,是node package manager的縮寫,從名稱上理解,node 包管理器。npm的背後,是有一個軟體註冊中心(registry,下面解釋到),理解為一個資料庫,詳細記錄了每個包(package)的資訊,包括作者、版本、依賴、授權資訊等。來自各個大陸的開源開發人員使用npm來共享和借用包,許多組織也使用npm來管理私有開發。
從作用上認識:
NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS程式碼部署上的很多問題。
- 允許使用者從NPM伺服器下載別人編寫的第三方包到本地使用。
- 允許使用者從NPM伺服器下載並安裝別人編寫的命令列程式到本地使用。
- 允許使用者將自己編寫的包或命令列程式上傳到NPM伺服器供別人使用。
如果我換種說法的話,就好像,你下載使用別人的類庫,以及你自己封裝類庫上傳給別人使用差不多吧
從官方上定義上理解,可以大體上從三部分去認識它:
- the website
- the Command Line Interface (CLI)
- the registry
- package
website
npm有個著名的 網站,在這個網站上,可以尋找和了解包的情況,找到合適自己使用的工具資源等。使用該網站來發現包、設定配置檔案和管理npm體驗的其他方面
CLI
從名字上就能知道了,就是命令列介面。說白了就是用來與npm進行互動的輸入的命令指令碼
the registry
從中文上理解,可以理解為登錄檔,註冊中心,或者npm註冊源,它是一個大型的JavaScript軟體公共資料庫。每個包由軟體和後設資料組成。開源開發人員和公司的開發人員使用npm registry向整個社群或其組織的成員提供包,並下載包用於自己的專案。
package
上面三點都提及到一個概念——package(中文翻譯過來就包啦,所以我們通俗地稱呼它為包),那實際上它是個什麼東西呢?撇開官腔話解釋,我們可以通俗點去理解一下,它是一個軟體工具,是一個類庫,是一份組織好的程式碼,它提供出來使用,或者是開發者自己整理好這份程式碼,那就需要包裝好它整理好它,很形象地稱之為pacakge。
簡單來說,就是打包好一份程式碼啦。
那官方一點講,package(包)是一個檔案或者資料夾,它包含一個名叫package.json的檔案,由它來描述包的資訊,以便釋出到npm registry
從用途上理解,例如我有一些封裝好的工具、函式,或者框架類庫,想要多人維護它的話,就要打包出來釋出到一個線上的地方(registry),別人可以用來下載來,然後共同維護開發。或者也是單純的想要提供給別人使用,也需要打包出來吧,形成一份獨立的檔案,這就是package的含義了。
關於pacakge的概念認知,先到這裡,大家先去知道這麼一個東西,關於它的更多內容,下一篇會進行詳細介紹。
小結
實際上,npm就是圍繞這package來進行一系列管理操作,它提供了一個地方存放這些包資訊(registry),並提供一些命令(CLI)來讓使用者去管理pacakge。而我們怎麼知道這些包的資訊或者去尋找他呢,就是去 網站 裡瞭解了。
擁有你的npm賬號
要使用npm進行開發,首先得擁有一個npm賬號,這樣方便你在npm圈子裡進行活動。
前往 login page
介面操作我相信聰明的你肯定會了,那簡單說一下一些註冊資訊,方便更好的填寫
- Full name: 顧名思義,就是你的全名啦
- Public email:你的公共電子郵件地址將被新增到包的後設資料中,並對下載你的包的任何人可見。當你更新包時,我們也會傳送電子郵件到這個帳戶,以及偶爾的產品更新和資訊。
- Username: 使用者名稱,當您在npmjs.com上釋出包或與其他npm使用者互動時將顯示的使用者名稱。您的使用者名稱必須小寫,並且可以包含連字元和數字。
- Password:密碼
npm賬號分為兩種,一個是免費使用者,一個是付費使用者。前者釋出的包和使用的包都是面對大眾的,公用的。後者是可以釋出自己私有的npm包或建立一個組織(企業等),允許釋出組織私有包和使用一些私有的包
npm登入
預設地,執行一下命令,就會在你預設設定的registry裡進行登入,沒有更改過預設設定就是在http://registry.npmjs.org
(後面有詳細說明):
npm login
複製程式碼
接下來會提示你輸入你的資訊,按照你註冊的資訊輸入即可
登入成功後,可以檢查一下,執行
npm whoami
複製程式碼
接著會輸出現在登入的賬號使用者名稱
配置本地npm環境
npm的使用是基於nodejs的環境下的,因此需要在你的電腦上安裝nodejs。安裝的途徑有兩個
- 使用版本管理器下載安裝
- 使用安裝包直接下載安裝
當然我們強烈是建議使用第一種方式,這樣的話,在你後續需要對你的應用進行各個版本測試時方便切換node版本和npm版本,以及你需要同時負責好幾個專案,而這幾個專案需要用到不同版本的npm時進行切換開發。
儘管你當前沒有這種需求,但是為了後續以防萬一,還是使用第一種方式比較好。
使用版本管理器下載安裝
針對不同系統的使用者,採用不同的版本管理器應用
針對OSX 或 Linux
Windows
使用安裝包直接下載安裝
前往 官網 選擇對應的版本進行下載,建議選擇有LTS(long term support)標記的版本,顧名思義,有這種標記的版本是被長期維護支援的,可靠性比較高
如果你是使用Linux的,建議使用 NodeSource installer 進行安裝
npm版本
在我們下載安裝好nodejs後,其實npm也相應的自動已經安裝好了,下載不同版本的nodejs就會有不同版本的npm,但是npm版本的迭代速度要比nodejs的快,所以,你要確認一下安裝的npm版本是否是你想要的。
在命令列工具中執行 npm -v
,檢視當前的npm版本。
在命令列工具中執行 node -v
,檢視當前的nodejs版本。
latest release & next release
如果你想要把npm更新到新版本,可以先了解一下這兩個版本的區別
latest release
最新的穩定版本。是已經發布了的。 執行以下命令即可
npm install npm@latest
next release
npm的最新未釋出版本,最終作為最新版本釋出。一般是你想在釋出前就使用即將的新版本進行測試時。執行以下命令即可
npm install npm@next
設定npm registry
npm registry,我們常說的npm源,常見的是說使用淘寶源。為什麼需要設定這個東西?預設地,我們釋出的公共包,是發到http://registry.npmjs.org
上,別人搜尋進行下載資源也是基於這個資源庫。但是有些時候,你下載的資源需要從別處來下,例如使用淘寶源,會是下載更順暢速度更快,更多時候,當你需要下載的公司的私有資源時,就需要設定對應的公司資源所在地址。因此,我們常會遇到一個問題,我如何設定這個地址,即npm registry
設定預設registry
這方法簡單粗暴,直接把你的npm registry設定一個預設的註冊地址
npm config set registry xxx
複製程式碼
xxx為你想要的註冊地址
利用npmrc工具分情況使用預設註冊地址
有時候在不同專案裡,需要採用不同的registry地址來進行npm包的處理,例如專案A需要用源A,專案B需要用源B。
這時候我們可以使用 npmrc 這個工具來管理。
先了解下該工具的一些簡單的命令
npmrc // 列出所有的profiles
npmrc [name] // 切換profile,支援模糊匹配
npmrc -c [name] // 建立新profile,並命名為[name]
複製程式碼
1)要使用該工具,首先就得要安裝
注意:這跟.npmrc檔案是不同的,這裡是一個npm包工具
執行以下命令進行全域性安裝
npm i npmrc -g
複製程式碼
2)新建profile
npmrc -c projectA
複製程式碼
新建了一個名叫projectA的profile
3)設定該profile下的npm registry
命令跟設定預設註冊源是一樣的
npm config set registry xxxxA
複製程式碼
就是這麼簡單的三步,就能劃分出了一個profile,對其設定該registry,同理按照以上第二步和第三部,再新建一個profileB,和設定源B。這時候就會有兩個profile,有其對應的源。 這時候,我們就可以根據專案的需要,切換到不同的profile下,就能自動使用對應的註冊源了。
4)切換profile
npmrc projectB
複製程式碼
例如上述命令,切換到了另一個名叫projectB的profile上
為npm包設定域,針對域設定不同registry
前面兩個解決方案,都能解決不同專案下使用不同的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的目的外,還可以用來避免和其它包重名,避免衝突。
設定域的registry
對包進行分好域後,就要設定該域下的npm包採用哪個registry來進行管理資源了。 執行
npm login --registry=xxxx --scope=@myscope
複製程式碼
或者
npm config set @myscope:registry xxxx
複製程式碼
這樣一來,我們就對名叫myscope的域設定了xxx的registry地址了。之後在處理這些包的時候,就會使用該註冊地址。未設定的,還是用回之前預設的地址。
登入不同registry
上面介紹了設定不同registry,那麼我們怎麼按照需求登入上不同的registry,然後進行不同的管理呢?
預設登入
執行npm login
就會在當前設定的預設registry下進行登入
指定registry登入
1)使用npmrc工具
如果使用了npmrc工具,可以npmrc profilename
切換到預設指定了registry的profile下,然後執行npm login
登入即可
2)直接指定登入
執行npm login --registry=xxxx