一、Verdaccio 是什么?
Verdaccio 是一個(gè)流行的 Node.js 包管理器的代理工具,它允許您在本地或私有網(wǎng)絡(luò)上輕松地創(chuàng)建和管理 npm 包倉(cāng)庫(kù)。通過(guò) Verdaccio,開(kāi)發(fā)團(tuán)隊(duì)可以建立自己的 npm 包倉(cāng)庫(kù),以更好地控制和管理其依賴(lài)項(xiàng),同時(shí)還可以提供更快速的包下載速度,減輕 npm 中心服務(wù)器的負(fù)載。
二、Verdaccio 的工作原理
Verdaccio 的核心原理是代理 npm 注冊(cè)表。它可以被視為一個(gè)本地 npm 注冊(cè)表的緩存,并提供了一個(gè)用戶(hù)友好的界面,使您能夠在其中發(fā)布、安裝和管理包。其工作原理如下:
1、代理 npm 注冊(cè)表:Verdaccio 允許您配置它以代理 npm 的官方注冊(cè)表或其他任何 npm 注冊(cè)表。當(dāng)您嘗試安裝、發(fā)布或訪問(wèn)包時(shí),Verdaccio 將首先查看本地緩存,如果找到所需的包,它將立即提供。如果沒(méi)有找到,它將向上游注冊(cè)表發(fā)送請(qǐng)求,獲取包并將其緩存到本地以供將來(lái)使用。
2、本地包存儲(chǔ):Verdaccio 提供了本地包存儲(chǔ)的功能,這意味著您可以在本地創(chuàng)建和發(fā)布自己的 npm 包,無(wú)需將其發(fā)布到公共 npm 注冊(cè)表。這對(duì)于內(nèi)部項(xiàng)目、私有庫(kù)或需要保護(hù)知識(shí)產(chǎn)權(quán)的情況非常有用。
3、安全性:Verdaccio 支持訪問(wèn)控制、身份驗(yàn)證和權(quán)限管理,您可以通過(guò)配置來(lái)限制誰(shuí)可以發(fā)布、訪問(wèn)或管理倉(cāng)庫(kù)中的包。這有助于保護(hù)您的包和代碼免受未經(jīng)授權(quán)的訪問(wèn)和修改。
4、高度可定制性:Verdaccio 可以根據(jù)您的需求進(jìn)行高度定制。您可以配置其插件、主題、中間件和許多其他選項(xiàng),以滿(mǎn)足特定項(xiàng)目或組織的要求。
三、安裝和配置Verdaccio
1、安裝Verdaccio
這里要求node版本至少18以上,否則后面沒(méi)法啟動(dòng)
npm install -g verdaccio
2、配置 Verdaccio
安裝完成后,會(huì)生成一個(gè)配置文件(/Users/wave/AppData/Roaming/verdaccio/config.yaml),你可以編輯這個(gè)文件來(lái)配置你的npm私服:
我們這里主要就先去修改一個(gè)uplinks中的上行地址,可以修改為https://registry.npmmirror.com/
storage: /verdaccio/storage/
#默認(rèn)使用內(nèi)置本地文件模式存儲(chǔ),包存儲(chǔ)地址,publish時(shí)倉(cāng)庫(kù)保存包的目錄
plugins: /verdaccio/plugins
#插件目錄的位置。 對(duì)Docker/Kubernetes 基礎(chǔ)上的配置非常有用
# UI信息
web:
enable: true
#開(kāi)啟 Web 頁(yè)面
title: Sinux-Npm-Register
#Web頁(yè)面標(biāo)題
# logo: #這里可以給定一個(gè)遠(yuǎn)程連接的圖片,注釋掉就采用默認(rèn)的
# comment out to disable gravatar support
gravatar: true
# by default packages are ordercer ascendant (asc|desc)
# sort_packages: asc #包的排序
# darkMode: true #黑暗模式
# scope: "@scope"
# 身份認(rèn)證設(shè)置
auth:
htpasswd:
#默認(rèn)情況下使用的 htpasswd 插件作為身份認(rèn)證
file: /verdaccio/storage/htpasswd
#用戶(hù)信息-賬號(hào)密碼的文件地址存儲(chǔ)目錄,初始化時(shí)不存在,可指定需要手工創(chuàng)建
max_users: -1
#默認(rèn)1000,為允許用戶(hù)注冊(cè)的數(shù)量。此配置項(xiàng)為-1時(shí)不允許用戶(hù)通過(guò)npm adduser注冊(cè),但是,當(dāng)為-1時(shí),可以通過(guò)直接編寫(xiě)htpasswd file內(nèi)容的方式添加用戶(hù)(最大用戶(hù)數(shù)量,-1 表示禁用新用戶(hù)注冊(cè))
i18n:
# list of the available translations https://github.com/verdaccio/ui/tree/master/i18n/translations
web: zh-CN #默認(rèn)是en-US,我們改為默認(rèn)中文,這個(gè)支持多語(yǔ)言
# 上行鏈路
uplinks:
#上行鏈路:配置上游的npm服務(wù)器,主要用于請(qǐng)求的包倉(cāng)庫(kù)不存在時(shí)到上游服務(wù)器去拉取。
npmjs: #上行名稱(chēng),隨便定義
url: https://registry.npmjs.org/ #上行地址
yarn:
url: https://registry.yarnpkg.com/
timeout: 10s #超時(shí)時(shí)間
taobao:
url: https://registry.npm.taobao.org/
timeout: 10s
# 包訪問(wèn)設(shè)置,可以根據(jù)名稱(chēng)對(duì)包做不同權(quán)限的設(shè)置
packages:
#配置模塊。access訪問(wèn)下載權(quán)限,publish包的發(fā)布權(quán)限。
"@*/*":
#@/ 表示某下屬的某項(xiàng)目,* 匹配項(xiàng)目名稱(chēng)(名稱(chēng)在package.json中有定義)
#三種身份:所有人,匿名用戶(hù),認(rèn)證(登陸)用戶(hù)
#"$all", "$anonymous", "$authenticated"
access: $authenticated
#access: 訪問(wèn)下載
publish: $authenticated
#publish: 發(fā)布
unpublish: $authenticated
#取消發(fā)布
proxy: npmjs
#代理上行鏈路地址
#proxy: 這里的值是對(duì)應(yīng)于uplinks的名稱(chēng),如果本地不存在,允許去對(duì)應(yīng)的uplinks去取。
#$all 表示所有人(已注冊(cè)、未注冊(cè))都可以執(zhí)行對(duì)應(yīng)的操作
#$authenticated 已注冊(cè)賬戶(hù)可操作
#$anonymous 匿名用戶(hù)可操作(通常無(wú)用)
#或者也可以指定對(duì)應(yīng)于之前我們配置的用戶(hù)表 htpasswd 中的一個(gè)或多個(gè)用戶(hù),這樣就明確地指定哪些用戶(hù)可以執(zhí)行匹配的操作。
"**":
access: $authenticated
#登錄用戶(hù)才允許訪問(wèn)
publish: $authenticated
#登錄用戶(hù)才允許訪問(wèn)
unpublish: $authenticated
#登錄用戶(hù)才允許訪問(wèn)
proxy: npmjs yarn taobao
#代理上行鏈路地址
server:
keepAliveTimeout: 60
#服務(wù)器保持活動(dòng)鏈接的時(shí)間,較大的包可能會(huì)消耗一定時(shí)間,此屬性就是設(shè)置活動(dòng)鏈接時(shí)間
middlewares:
audit:
enabled: true
#listen:localhost:4873 #默認(rèn),只能本機(jī)訪問(wèn)。
listen: 0.0.0.0:4873 #監(jiān)聽(tīng)的端口:允許所有外網(wǎng)監(jiān)聽(tīng)。
# 日志設(shè)定
logs: { type: stdout, format: pretty, level: http }
#type: stdout --- 控制臺(tái)輸出; file --- 輸出到文件
#path: 如果輸出到文件類(lèi)型,需要制定輸出路徑
#format: 輸出格式 [pretty, pretty-timestamped]
#level: 日志級(jí)別 [fatal, error, warn, http, info, debug, trace]
四、啟動(dòng)Verdaccio
verdaccio
訪問(wèn)http://localhost:4837

五、配置npm源地址
// 查看源地址
npm config list
// 切換npm源地址
npm config set registry http://localhost:4873/
六、發(fā)布包到npm私服
登錄到你的npm私服
npm login --registry http://localhost:4873/
查看當(dāng)前用戶(hù)信息
npm who am i
然后,在你的包目錄下運(yùn)行:
npm publish
最后,刷新本地私服看到如下界面,代表已成功上傳。

驗(yàn)證:可以新建一個(gè)test項(xiàng)目,去安裝試試,是否能安裝成功
npm i wavetools