npm入門(一)—瞭解基本組成與概念

pekonchan發表於2019-04-01

前言

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。安裝的途徑有兩個

  1. 使用版本管理器下載安裝
  2. 使用安裝包直接下載安裝

當然我們強烈是建議使用第一種方式,這樣的話,在你後續需要對你的應用進行各個版本測試時方便切換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

相關文章