NPM套件管理器常用命令與原理 === ###### tags: `RESTful` npm(Node Packge Manager)是一個依附在node.js執行環境中的主流線上套件庫,開發人員可以在node.js的環境中,透過npm來下載各式各樣的javaScript套件使用。並且在npm中統一管理不同專案所使用的套件。 :::success :bookmark: **目錄** :::spoiler [TOC] ::: ## 初始化 ### init ``` npm init ``` 在init執行的過程中,會以詢答的方式依序要你完成一些必要資訊。 ``` name: 專案名,預設為目錄名。 description: 專案描述。 entry point: 專案入口點,主要的邏輯檔案或是執行開始的檔案,通常為app.js或是為空。 test command: 專案測試指令。 git repository: 專案原始碼的版本控管位置(URL)。 keywoard: 專案關鍵字 author: 專案作者,(author-name <author@email.com>)。 license: 專案版權。 ``` init 指令的動作很簡單,便是在目前所在目錄中生成「package.json」的boilerplate(樣板)文件,與「package-lock.json」的版本資訊文件,以及名為「node_modules」的資料夾。 ### package.json npm擁有廣大的軟體生態系,package.json是掌管專案資訊的重要檔案。並且,每個專案都需要使用package.json去設定所使用到的library到底有什麼,並記錄所有的dependency(依賴)關係。 ### package-lock.json 對於有在進行版本控制或者是嚴謹開發的程式中,package-lock.json便是很重要的存在。這個檔案它有以下特性: 1. 每次 npm install / uninstall /update 都會更新 2. 紀錄每個套件的詳細版本 3. 紀錄套件的 tarball(套件壓縮檔),是從哪個 url 下載來的 4. 使用 hash(雜湊),確認檔案是否損壞 5. 以一個 require 欄位,說明這個 dependency 是被哪個函式庫所要求的 也因為有package-lock.json,便可以讓不同環境中的專案在每次部屬時,保持一樣的版本。杜絕重新下載套件後,因為套件版本號不同的關係,造成程式出現錯誤的情形。 ### node_modules 套件的實際儲存位置,將會在每個init過後的專案中出現,存放每個專案所依賴的套件。 ## 套件管理 ### install 完成init後,便可以開始安裝專案所需要的套件,只要執行: ``` npm install <套件名稱> ``` 便可以安裝所需套件,比如說: ``` npm install jquery ``` 就會安裝jquery library到node_modules資料夾中,並且在package.json中留下專案與套件的dependency(相依性)。 > 為什麼npm要記錄我們裝過哪些套件? 若往後有人要使用你所撰寫的code,便可以透過紀錄輕易了解專案的dependency,甚至可以確定你所使用的library版本。 > 為什麼library要特地使用node_modules資料夾另外儲存 若今天有兩個專案在相同library卻是不同版本號的情形下開發,就必須要獨立這兩個library的位置。比如說:A、B專案分別使用SweetAlert 1與2,這兩個library便會各自安裝在各自的目錄中,保持每個開發環境永遠不會有互相衝突的機會,而這個資料夾就是node_modules。 ### install 與Git相互配合 若今天你有一個專案需要在版本控制中部屬到不同環境,但library的數量與容量卻不利於git的管理,便可以利用package.json的特性執行: ``` npm install ``` 只要install後頭沒有library名稱,直接執行這個指令,npm便自動將package.json所缺的Dependency裝回,並且符合package-lock.json中所記載的版本號。 不需要將龐大的node_modules資料夾上傳至git中,只需要保存package.json與package-lock.json。 #### 建立.gitignore 在push專案文件前,我們已經知道某些資料夾的內容不需要上傳,這時我們就需要使用.gitignore。它的存在會幫我排除檔案或資料夾的上傳 。 像是node_modules的套件內容在網路上全部都下載的到,就不用被push到我們的git儲存庫中。 ``` //新建「.gitignore」檔案在專案根目錄,並直接鍵入需要被排除的資料夾名稱。 node_modules ``` ### uninstall & update #### 刪除套件 若是要移除專案中的某個套件,便可以執行: ``` npm uninstall <套件名稱> ``` 執行刪除後,將會統一更新package.json、package-lock.json與node_modules的內容。 #### 更新單一套件 若要將專案中的某個套件進行升級,執行以下指令: ``` npm update <套件名稱> ``` #### 更新全部套件 若是要一次升級專案中所有的套件,執行以下命令: ``` npm update ``` > 不管是哪種更新方法,都將會更新package-lock.json中的版本資訊。