如何發(fā)布 npm 包
(給全棧前端精選加星標(biāo),提升前端技能)
轉(zhuǎn)自:kkk 愛學(xué)習(xí)
juejin.cn/post/6911853807756378125
npm是什么?
npm 是Node 的模塊管理器,功能極其強大。它是Node 獲得成功的重要原因之一。正因為有了npm,我們只要一行命令,就能安裝別人寫好的模塊。
npm install
npm install:https://docs.npmjs.com/cli/install 命令用來安裝模塊到node_modules目錄。
$?npm?install??
--save-dev?-D?本地
--save?-S?生產(chǎn)
-g?全局
$?npm?uninstall?
安裝之前,npm install會先檢查,node_modules目錄之中是否已經(jīng)存在指定模塊。如果存在,就不再重新安裝了,即使遠程倉庫已經(jīng)有了一個新版本,也是如此。
如果你希望,一個模塊不管是否安裝過,npm 都要強制重新安裝(不需要刪掉nodemodules),可以使用-f或--force參數(shù)
$?npm?install??--force?//?強制更新
npm update
如果想更新已安裝模塊,就要用到 npm update:https://docs.npmjs.com/cli/update 命令。
$?npm?update?
它會先到遠程倉庫查詢最新版本,然后查詢本地版本。如果本地版本不存在,或者遠程版本較新,就會安裝。
模塊的安裝過程
發(fā)出 npm install命令npm 向 registry 查詢模塊壓縮包的網(wǎng)址 下載壓縮包,存放在 ~/.npm目錄解壓壓縮包到當(dāng)前項目的 node_modules目錄
npm常用指令
npm?init?--yes(初始化配置)??-y
npm?i?(會根據(jù)package.json里面的鍵dependencies,devDependencies來安裝相對應(yīng)的包)
npm?i?包(默認(rèn)安裝一個最新的包,這個包在node_modules文件夾里面,并且會更新在你的package.json文件)
npm?i?包@3.0.0(安裝一個指定版本的包,會更新在你的package.json文件)
npm?i?包?--save-dev(安裝一個開發(fā)環(huán)境所需要的包,會更新在你的package.json文件)?-D
npm?i?包?--save(安裝一個生產(chǎn)環(huán)境所需要的包,會更新在你的package.json文件)?-S
npm?uninstall?包(卸載一個包,會更新在你的package.json文件)
npm?update?包(更新此包版本為最新版本,會更新在你的package.json文件)
npm?run?腳本鍵(會根據(jù)package.json里面的"scripts"里面的腳本鍵自動執(zhí)行相對于的值)
npm?publish??(根據(jù)package.json的name發(fā)布一個包)?發(fā)布到npm倉庫
npm?unpublish?包名?--force(卸載npm網(wǎng)站上自己上傳的包)
packageJson文件配置
{
?"name":?"axios",?//發(fā)布的包名,默認(rèn)是上級文件夾名。不得與現(xiàn)在npm中的包名重復(fù)。包名不能有大寫字母/空格/下滑線!
??"version":?"2.2.2",//你這個包的版本,默認(rèn)是1.0.0。對于npm包的版本號有著一系列的規(guī)則,模塊的版本號采用X.Y.Z的格式,具體體現(xiàn)為:
? 1、修復(fù)bug,小改動,增加z。
??2、增加新特性,可向后兼容,增加y
??3、有很大的改動,無法向下兼容,增加x
??"description":?"用來請求接口,懂了嗎二貨",?//?介紹
??"main":?"index.js",//?入口文件,默認(rèn)是Index.js,可以修改成自己的文件,這個很重要,當(dāng)你在實際項目使用的時候,let a = require("包名"),它就去會去找對應(yīng)的文件路徑哦。
??"scripts":?{??????????????????//?快捷命令,在package.json同目錄下輸入命令?npm?run?鍵?就會執(zhí)行?相對應(yīng)的命令
????"bulid":?"npx?webpack?--config?myConfig.js",
???"start":?"xxx",
???//例如?輸入 npm run bulid 就會執(zhí)行npx webpack --config myConfig.js的命令?。
???//?npm?start?省略run
??},
??"keywords":?[],
??"author":?"王二蛋",
??"license":?"ISC",//?這個直接回車,開源文件協(xié)議吧,也可以是MIT,看需要吧。
??"dependencies":?{?????????????//?生產(chǎn)環(huán)境所依賴的包
????"jquery":?"^3.4.1",
????"sea":?"^1.0.2"
??},
??"devDependencies":?{??????????//?開發(fā)環(huán)境所依賴的包
????"webpack":?"^4.41.6"
??}
}
更改npm默認(rèn)的下載路徑和緩存路徑
npm config ls 命令可查看npm的安裝信息以及默認(rèn)的下載路徑。
D:\software\cmder\cmder>npm?config?ls
;?cli?configs
metrics-registry?=?"https://registry.npmjs.org/"
scope?=?""
user-agent?=?"npm/6.13.4?node/v12.14.0?win32?x64"
;?builtin?config?undefined
prefix?=?"C:\\Users\\DELL\\AppData\\Roaming\\npm"
;?node?bin?location?=?D:\SoftWareInstall\nodejsIns\node.exe
;?cwd?=?D:\software\cmder\cmder
;?HOME?=?C:\Users\DELL
;?"npm?config?ls?-l"?to?show?all?defaults.
注意,npm默認(rèn)的下載路徑在C:\Users\DELL\AppData\Roaming\npm,其中AppData是隱藏文件夾,在【查看】菜單中勾選【隱藏的項目】才可以看到AppData文件夾。
//?更改npm默認(rèn)的緩存路徑
npm?config?set?cache?"D:\TempDate\nodedata\cache"
//?更改npm默認(rèn)的下載路徑
npm?config?set?prefix?"D:\TempDate\nodedata\download"
更改緩存路徑和下載路徑后,再次查看
D:\software\cmder\cmder>npm?config?ls
;?userconfig?C:\Users\DELL\.npmrc
cache?=?"D:\\TempDate\\nodedata\\cache"
prefix?=?"D:\\TempDate\\nodedata\\download"
那么下面來介紹一下,如何創(chuàng)建自己的第一個node模塊,并把這個模塊上傳到npm上面,讓別人可以用我們的模塊
創(chuàng)建第一個node模塊
Node.js模塊就是發(fā)布到npm的代碼包,
創(chuàng)建一個新模塊的第一步就是創(chuàng)建一個package.json文件。你可以用npm init來創(chuàng)建package.json文件。這個過程中命令行會逐步提示你輸入這個模塊的信息, 其中模塊的名字和版本號是必填項
你還需要一個入口文件, 如果你使用默認(rèn)值的話,那就會是index.js. 創(chuàng)建完package.json文件之后,你就要開始寫代碼包里的內(nèi)容了, 這里舉個最簡單的例子,在默認(rèn)的index.js里寫一個要導(dǎo)出的函數(shù), 這個函數(shù)也就是別人的代碼里可以import或者require的。
exports.showMsg?=?function?()?{
??console.log("This?is?my?first?module");
};
這樣的話,你的node模塊就已經(jīng)創(chuàng)建完成了
如何發(fā)布到npm服務(wù)器上
注冊一個npm賬號
首次需要登錄,npm login 存儲證書到本地,后面就不需要每次都登錄的
登錄需要輸入用戶名,密碼,還有郵箱,這些都是剛剛注冊時候填寫的
開始發(fā)布
npm publish 發(fā)布包
使用 cnpm 的注意報錯:no_perms Private mode enable, only admin can publish this module 設(shè)置回原本的就可以了 **npm config set registry registry.npmjs.org ** 發(fā)布完成之后,如果還想回到之前的cnpm,使用下面的命令 npm config set registry registry.npm.taobao.org
創(chuàng)建一個案例,引用剛上傳的包
假設(shè)已經(jīng)成功發(fā)布了,并且包名叫做toniqian-test-module, 這時候可以新建一個空目錄,cd進去,運行npm install toniqian-test-module,然后在這個目錄下會出現(xiàn)一個叫node_modules的文件夾,你之前寫的包就會出現(xiàn)在這個文件夾下面。
然后寫一個index.js,代碼如下
var?test?=?require('toniqian-test-module');
test.showMsg();
運行index.js
node?index.js
那么剛剛上傳的包,目前已經(jīng)可以使用,到目前的話, 你已經(jīng)成功創(chuàng)建了一個npm包了
如何更新npm包
當(dāng)你包的內(nèi)容修改之后,比如
exports.showMsg?=?function?()?{
??console.log("This?is?my?second?module");
};
復(fù)制代碼
修改了提示文字,那么我們需要 npm version
update_type就是版本號的意思,會自動更新package.json里面的版本號 然后重新 npm publish,更新就會完成
作業(yè) 實現(xiàn)一個相對時間轉(zhuǎn)換函數(shù)
moment(time){
??//?相對時間轉(zhuǎn)換
}
如何刪除npm包
npm?unpublish?kk-a-test?--force
查看當(dāng)前登錄的npm賬號
npm?whoami
輸出 username
發(fā)布包錯誤集錦
1、需要提高版本號
#1、發(fā)包?npm?publish?失敗
sh-neverleave:z-tool?neverleave$?npm?publish
npm?ERR!?publish?Failed?PUT?400
npm?ERR!?code?E400
npm?ERR!?deprecations?must?be?strings?:?z-tool
npm?ERR!?A?complete?log?of?this?run?can?be?found?in:
npm?ERR!?????/Users/neverleave/.npm/_logs/2018-11-23T10_52_01_742Z-debug.log
sh-neverleave:z-tool?neverleave$?npm?publish
#2、發(fā)包?npm?publish?失敗
sh-neverleave:z-tool?neverleave$?npm?publish
npm?ERR!?publish?Failed?PUT?403
npm?ERR!?code?E403
npm?ERR!?You?cannot?publish?over?the?previously?published?versions:?1.0.3.?:?z-tool
npm?ERR!?A?complete?log?of?this?run?can?be?found?in:
npm?ERR!?????/Users/neverleave/.npm/_logs/2018-11-23T11_24_57_662Z-debug.log
sh-neverleave:z-tool?neverleave$?
2、發(fā)包 npm publish 失敗 解決方案:終端執(zhí)行:npm publish --access public
參考:https://stackoverflow.com/questions/53420758/npm-publish-gives-unscoped-packages-cannot-be-private
#1、發(fā)包?npm?publish?失敗
sh-neverleave:npm?neverleave$?npm?publish
npm?ERR!?publish?Failed?PUT?400
npm?ERR!?code?E400
npm?ERR!?unscoped?packages?cannot?be?private?:?z-tool
npm?ERR!?A?complete?log?of?this?run?can?be?found?in:
npm?ERR!?????/Users/neverleave/.npm/_logs/2018-11-23T08_44_21_310Z-debug.log
sh-neverleave:npm?neverleave$?
#解決方案:終端執(zhí)行:npm publish --access public
sh-neverleave:npm?neverleave$?npm?publish?--access?public
+?z-tool@1.0.0
sh-neverleave:npm?neverleave$?
3、確保登錄的用戶賬號正確
sh-neverleave:npm?neverleave$?npm?publish
npm?ERR!?publish?Failed?PUT?404
npm?ERR!?code?E404
npm?ERR!?404?User?not?found?:?z-tool
npm?ERR!?404?
npm?ERR!?404??'z-tool'?is?not?in?the?npm?registry.
npm?ERR!?404?You?should?bug?the?author?to?publish?it?(or?use?the?name?yourself!)
npm?ERR!?404?
npm?ERR!?404?Note?that?you?can?also?install?from?a
npm?ERR!?404?tarball,?folder,?http?url,?or?git?url.
npm?ERR!?A?complete?log?of?this?run?can?be?found?in:
npm?ERR!?????/Users/neverleave/.npm/_logs/2018-11-23T07_32_28_518Z-debug.log
4、登錄時需要在username 前加‘~’,具體大家可以驗證
sh-neverleave:npm?neverleave$?npm?login
Username:?(~neverleave)?neverleave
Password:?(<default?hidden>)?
Email:?(this?IS?public)?(1063588359@qq.com)?
npm?ERR!?code?EAUTHIP
npm?ERR!?Unable?to?authenticate,?need:?Basic
npm?ERR!?A?complete?log?of?this?run?can?be?found?in:
npm?ERR!?????/Users/neverleave/.npm/_logs/2018-11-23T07_27_50_877Z-debug.log
sh-neverleave:npm?neverleave$?
5、無權(quán)限刪除線上的包(撤包有時間限制,24小時) 解決方案:加上 --force
sh-neverleave:z-tool?neverleave$?npm?unpublish?z-tool
npm?ERR!?Refusing?to?delete?entire?project.
npm?ERR!?Run?with?--force?to?do?this.
npm?ERR!?npm?unpublish?[<@scope>/][@]
sh-neverleave:z-tool?neverleave$?
#解決方案(內(nèi)部有被鄙視的話,???I?sure?hope?you?know?what?you?are?doing.)
sh-neverleave:z-tool?neverleave$?npm?unpublish?z-tool?--force
npm?WARN?using?--force?I?sure?hope?you?know?what?you?are?doing.
-?z-tool
sh-neverleave:z-tool?neverleave$?
6、刪除npm市場的包同名的24小時后才能重新發(fā)布
sh-neverleave:z-tool?neverleave$?npm?publish
npm?ERR!?publish?Failed?PUT?403
npm?ERR!?code?E403
npm?ERR!?z-tool?cannot?be?republished?until?24?hours?have?passed.?:?z-tool
npm?ERR!?A?complete?log?of?this?run?can?be?found?in:
npm?ERR!?????/Users/neverleave/.npm/_logs/2018-11-23T11_41_24_086Z-debug.log
sh-neverleave:z-tool?neverleave$?