Node.js 基礎(chǔ) - 包管理器 Npm 使用講解
包管理器又稱軟件包管理系統(tǒng),它是在電腦中自動(dòng)安裝、配制、卸載和升級(jí)軟件包的工具組合,在各種系統(tǒng)軟件和應(yīng)用軟件的安裝管理中均有廣泛應(yīng)用。對(duì)于我們業(yè)務(wù)開發(fā)也很受益,相同的東西不必重復(fù)去造輪子。
每個(gè)工具或者開發(fā)語言都有相應(yīng)的包管理器,好比 Ubuntu 的 apt-get、Centos 的 yum、Java 的 Maven 倉庫等等。Node.js 中目前最出名的包管理器為 NPM 也是生態(tài)最好的。
什么是 NPM?
NPM 是 Node.js 中的包管理器。允許我們?yōu)?Node.js 安裝各種模塊,這個(gè)包管理器為我們提供了安裝、刪除等其它命令來管理模塊。這里有一點(diǎn)我們需要注意,我們必須要有一個(gè) package.json 文件或 node_modules 目錄安裝模塊到本地。
執(zhí)行命令 npm i module -S/D 安裝模塊后,會(huì)在本地存儲(chǔ)我們所安裝的依賴項(xiàng),存在于 package.json 的 dependencies/devDependencies 對(duì)象里。例如,如果一個(gè)模塊 X 使用了模塊 A 版本為 1.0,模塊 Y 使用了模塊 A 版本為 1.5,那么模塊 X 或 Y 都將在本地?fù)碛凶约簩?duì)應(yīng)的模塊 A 的副本。
- // 模塊 X
- {
- "name": "X",
- "dependencies": {
- "A": "^1.0"
- }
- }
- // 模塊 Y
- {
- "name": "Y",
- "dependencies": {
- "A": "^1.5"
- }
- }
什么時(shí)候需要 NPM 包?
當(dāng)我們?cè)陂_發(fā)一些 Node.js 項(xiàng)目時(shí),可能會(huì)遇到一些地方需要 NPM,例如鏈接 Redis、MongoDB 或者發(fā)送請(qǐng)求 Request 等,有了這些現(xiàn)有模塊可以使我們更專注于業(yè)務(wù)開發(fā),當(dāng)然有時(shí)你會(huì)有些特別的需求,這時(shí)可能需要自己去封裝一個(gè) NPM 模塊,實(shí)現(xiàn)模塊復(fù)用、資源共享。
NPM 安裝
NPM 不需要單獨(dú)安裝,在我們安裝 Node.js 環(huán)境時(shí),NPM 也就安裝了,Node.js 環(huán)境還沒搭建的同學(xué)可參考 “3N 兄弟” 助您完成 Node.js 環(huán)境搭建 一節(jié)。
終端執(zhí)行 npm -v 命令查看當(dāng)前 npm 版本
- $ npm -v
- 5.6.0
NPM 源設(shè)置
在國(guó)內(nèi)有時(shí)候受限于網(wǎng)絡(luò)因素的影響,通常在安裝一個(gè)包管理器之前可以切換為 淘寶 NPM 鏡像,加速安裝速度,但是要注意如果是私有模塊在 NPM 官方的,則必須切換為官方源,否則會(huì)出現(xiàn) 404 錯(cuò)誤。
查看當(dāng)前 npm 源
- npm config get registry
- # http://registry.npmjs.org/
切換為 taobao 源
- npm config set registry=https://registry.npmmirror.com
切換為 npm 官方源
在 npm publish 的時(shí)候 需要切換回 npm 源
- npm config set registry=http://registry.npmjs.org
如果不想全局設(shè)置,執(zhí)行 npm 命令時(shí)也可通過參數(shù)傳遞鏡像地址 npm i module --registry=https://registry.npmmirror.com。
淘寶 NPM 鏡像啟用新域名
注意:淘寶 NPM 鏡像已啟用新域名,由原先的 http://registry.npm.taobao.org 改為了 https://registry.npmmirror.com,目前對(duì)老的 NPM 鏡像地址做了 301 跳轉(zhuǎn),但老的 http://npm.taobao.org 和 http://registry.npm.taobao.org 域名將于 2022 年 05 月 31 日零時(shí)起停止服務(wù),如果使用老域名的開發(fā)者可以開始替換了。
**參考 **https://zhuanlan.zhihu.com/p/430580607
如何在項(xiàng)目中應(yīng)用
讓我們新建一個(gè)項(xiàng)目 test,剛開始這是一個(gè)空的文件夾
第一步
控制臺(tái)執(zhí)行 npm init,根據(jù)提示輸入信息,會(huì)生成一個(gè) package.json 文件,如下所示:
- {
- "name": "test", // 項(xiàng)目名稱
- "version": "1.0.0", // 版本號(hào)
- "description": "", // 描述
- "main": "index.js", // 入口文件,默認(rèn) index.js
- "scripts": {
- "test": "echo \"Error: no test specified\" && exit 1"
- },
- "author": "May", // 作者
- "license": "ISC"
- }
第二步
安裝 npm 模塊,例如我們安裝一個(gè) moment 模塊,執(zhí)行以下命令。
- npm install moment -S
- # or
- npm i moment --save
安裝成功之后,會(huì)生成一個(gè)新的目錄 node_modules 這是用來存放我們所安裝的模塊,另外 package.json 也會(huì)發(fā)生變化多了一個(gè) dependencies 對(duì)象,這個(gè)是用來存儲(chǔ)我們的模塊版本信息。
- "dependencies": {
- "moment": "^2.24.0"
- }
看下我們當(dāng)前的目錄結(jié)構(gòu):
NPM 注冊(cè)登錄
注冊(cè)
- $ npm adduser
- Username: your name
- Password: your password
- Email: (this IS public) your email
查看當(dāng)前使用的用戶
- npm whoami
npm 登錄
- npm login
私有模塊
如果是公司團(tuán)隊(duì)或者個(gè)人項(xiàng)目的私有 npm 包,進(jìn)行發(fā)布的時(shí)候要注意下啦,模塊的名字要以@符號(hào)開始、/符號(hào)結(jié)束,中間部分為私有包的組織名。例如,@may/logger,may 為組織的名稱,logger 為包名。
package.json
- {
- "name": "@may/logger"
- }
發(fā)布 NPM 模塊
進(jìn)入項(xiàng)目根目錄,輸入命令。
- npm publish
常見問題
Questions1
- no_perms Private mode enable, only admin can publish this module: coorddistance
這里注意的是因?yàn)閲?guó)內(nèi)網(wǎng)絡(luò)問題,許多小伙伴把 npm 的鏡像代理到淘寶或者別的地方了,這里要設(shè)置回原來的鏡像。
- npm config set registry=http://registry.npmjs.org
Questions2
Unexpected end of input at 1:3637 npm ERR! egistry.npmjs.org/mkdirp/-/mkdirp-0.3.2.tgz"},"engines":{"node":"*"}
執(zhí)行命令 npm cache clean --force
Questions3
Node項(xiàng)目部署 私有包報(bào)錯(cuò)404 一般兩種情況造成:
- 檢查服務(wù)器是否登錄npm賬號(hào)
- 執(zhí)行命令npm config get registry 檢查是否指向https,沒有指向https執(zhí)行命令 npm config set registry=https://registry.npmjs.org