如何把自定義的nodejs模塊發(fā)布到npm
平常在nodejs涯雅、vue、react的開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)使用到這樣的命令 npm install xxx --save描函,從npm下載安裝模塊到本地。
那么問(wèn)題來(lái)了狐粱,這些模塊是怎么上傳的呢舀寓,自己可不可以編寫(xiě)一個(gè)模塊上傳到npm,供其他人下載的呢肌蜻。
肯定是可以的互墓。
一、npm本地包發(fā)布
實(shí)現(xiàn)步驟:
創(chuàng)建自己的npm包
- 創(chuàng)建一個(gè)test的文件夾作為根目錄, 在這個(gè)文件夾下再創(chuàng)建一個(gè)node_modules文件夾(包都放在這個(gè)文件夾中), node_modules是固定名字蒋搜,不能改為其他名字篡撵。
- 在node_modules文件夾下創(chuàng)建我們的包文件夾, 我這里命名為my-local-test.
【注意】包的名稱,必須是唯一的; 一般由小寫(xiě)英文字母齿诞、數(shù)字和下劃線組成酸休,不能包含空格
PS: 想知道自己設(shè)定的包名有沒(méi)有和其他人重名, 可以到 npm官網(wǎng) 查詢 - 在my-local-test文件夾下打開(kāi)cmd輸入
npm init -y
初始化包, 會(huì)生成一個(gè)下面這樣的package.json文件
{
"name": "my-local-test", // 包的名稱
"version": "1.0.0", // 版本號(hào)
"description": "", // 包的簡(jiǎn)要說(shuō)明
"main": "index.js", // 包入口js文件
"scripts": { // 定義腳本命令
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [], // 關(guān)鍵字?jǐn)?shù)組,通常用于搜索
"author": "", // 作者
"license": "ISC" // 開(kāi)源協(xié)議
}
4.配置package.json文件
{
"name": "my-local-test",
"version": "1.0.0",
"description": "This is a test.",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": ["my", "local", "test"],
"author": "jason_liang",
"license": "ISC"
}
5.在my-local-test文件夾下創(chuàng)建一個(gè)index.js文件, 并定義模塊
index.js
let str = "This is my first NPM project";
exports.res = str; // 暴露出去給外界使用
【注意】
- 如果沒(méi)有配置main, 默認(rèn)會(huì)將index.js作為入口
如果包中沒(méi)有index.js或者你的入口文件不是index.js, 那么就必須配置main的值為你的入口文件, 否則會(huì)報(bào)錯(cuò) - 通過(guò)scripts可以幫我們記住指令, 然后通過(guò)
npm run xxx
方式就可以執(zhí)行該指令
如果指令的名稱叫做start或者test, 那么執(zhí)行的時(shí)候可以不加run
包的規(guī)范
- package.json必須在包的頂層目錄下
- 二進(jìn)制文件應(yīng)該在bin目錄下
- JavaScript代碼應(yīng)該在lib目錄下
- 文檔應(yīng)該在doc目錄下
- 單元測(cè)試應(yīng)該在test目錄下
package.json字段分析
- name:包的名稱祷杈,必須是唯一的斑司,由小寫(xiě)英文字母、數(shù)字和下劃線組成但汞,不能包含空格
- description:包的簡(jiǎn)要說(shuō)明
- private: 值為true代表我們的包是私有的
- version:符合語(yǔ)義化版本識(shí)別規(guī)范的版本字符串
- 主版本號(hào):當(dāng)你做了不兼容的 API 修改
- 子版本號(hào):當(dāng)你做了向下兼容的功能性新增
- 修訂號(hào):當(dāng)你做了向下兼容的問(wèn)題修正
- keywords:關(guān)鍵字?jǐn)?shù)組宿刮,通常用于搜索
- maintainers:維護(hù)者數(shù)組,每個(gè)元素要包含name私蕾、email(可選)僵缺、web(可選)字段
- contributors:貢獻(xiàn)者數(shù)組,格式與maintainers相同踩叭。包的作者應(yīng)該是貢獻(xiàn)者數(shù)組的第一- 個(gè)元素
- bugs:提交bug的地址磕潮,可以是網(wǎng)站或者電子郵件地址
- licenses:許可證數(shù)組,每個(gè)元素要包含type(許可證名稱)和url(鏈接到許可證文本的- 地址)字段
- repositories:倉(cāng)庫(kù)托管地址數(shù)組容贝,每個(gè)元素要包含type(倉(cāng)庫(kù)類(lèi)型自脯,如git)、url(倉(cāng)- 庫(kù)的地址)和path(相對(duì)于倉(cāng)庫(kù)的路徑斤富,可選)字段
- dependencies:生產(chǎn)環(huán)境包的依賴膏潮,一個(gè)關(guān)聯(lián)數(shù)組,由包的名稱和版本號(hào)組成
- devDependencies:開(kāi)發(fā)環(huán)境包的依賴满力,一個(gè)關(guān)聯(lián)數(shù)組焕参,由包的名稱和版本號(hào)組成
發(fā)布自己的npm包
發(fā)布包之前必須事先注冊(cè)一個(gè)npm賬號(hào)轻纪,去 官網(wǎng) 自行注冊(cè)。
【注意】
注冊(cè)完賬號(hào)后一定要驗(yàn)證郵箱, 點(diǎn)開(kāi)郵件中的鏈接, 否則是不能使用的
你可能之前會(huì)將npm下載源更改為taobao源謀求更快的下載速度, 這里我們需要輸入指令nrm use npm
切換回npm源
進(jìn)入你的包文件夾輸入指令
- 添加賬號(hào)
npm adduser // 輸入自己的npm賬號(hào)叠纷、密碼刻帚、郵箱
- 登錄npm
npm login // 輸入賬號(hào)、密碼讲岁、郵箱我擂,登錄后方可發(fā)包
執(zhí)行命令 npm whoami
可以查看登錄狀態(tài)
- 發(fā)布包
npm publish
發(fā)布成功后會(huì)有 + my-local-test@1.0.0的提示
發(fā)布成功以后我們就可以通過(guò)npm install 包名
下載使用包
- 更新包
如果你以后修改了代碼,然后想要同步到 npm 上的話請(qǐng)修改 package.json 中的 version 然后再次 publish缓艳,也可以在項(xiàng)目目錄下執(zhí)行npm version patch
, 更新的版本上傳的版本要大于上次
-
取消發(fā)布
npm包24小時(shí)內(nèi)可以強(qiáng)制撤回校摩,超過(guò)24小時(shí)的就不行了。
npm unpublish --force // 不成功可以強(qiáng)制取消
如果發(fā)布同一個(gè)包1次以上(即多個(gè)版本)了阶淘,那么就只能通過(guò)npm deprecate
去廢棄包衙吩,如下操作:
npm deprecate my-local-test@1.0.1 "sorry, it's a my test npm package."
使用npm deprecate
時(shí),最后的message一定要帶上溪窒,否則執(zhí)行失敗坤塞。
注:
①npm默認(rèn)只能一個(gè)一個(gè)刪除版本,不能一次性刪除所有版本澈蚌。
②假如發(fā)布的包已經(jīng)有人下載使用(npm官網(wǎng)可以看是否有人下載)摹芙,刪除會(huì)報(bào)錯(cuò),是無(wú)法刪除的宛瞄。具體判斷自己的包是否可以刪除可以去npm的官網(wǎng)看下文檔政策介紹浮禾。
二、npm全局包發(fā)布
大部分都和本地包一樣, 這里說(shuō)一下不一樣的地方
- 在包目錄新建index.js
// 加上這一行代碼的目的是需要告訴這個(gè)文件需要用node執(zhí)行
#! /usr/bin/env node
console.log("自定義指令被執(zhí)行了");
2.在package.json里面配置 bin 節(jié)點(diǎn) (跟 "scripts"同級(jí))
"bin": {
"yz": "index.js"
},
- 最后執(zhí)行
npm publish
發(fā)布即可
4.下載安裝全局包npm install -g my-global-test
, 就可以執(zhí)行指令啦
PS: 在當(dāng)前包目錄下執(zhí)行npm link
可以將本地包拷貝到全局包