node.js學(xué)習(xí)(8)——npm介紹以及自定義模塊的發(fā)布

上一節(jié)-node.js學(xué)習(xí)(7)—node.js的模塊化輸入輸出

1.npm介紹

npm——NodeJs Package Manager(nodejs 包管理器)。它是node中自帶的命令。我們?cè)趎ode中的大部分操作都需要用到它。在前端開(kāi)發(fā)中,其最明顯的兩個(gè)作用:

1.統(tǒng)一下載路徑,我們只需要通過(guò)npm install就可以安裝所需文件。而不是像電腦中安裝軟件,百度搜索一看,有復(fù)雜的應(yīng)用市場(chǎng)。

2.通常我們下載模塊,有可能該模塊又依賴其他模塊,npm會(huì)自動(dòng)幫我們處理依賴,我們可以不用關(guān)心需要下載的模塊以來(lái)什么。

舉個(gè)??


Jietu20181103-150235.jpg

我們?cè)赼.js中增加如下代碼

var mysql=require('mysql');
console.log(mysql);

此時(shí)肯定會(huì)報(bào)錯(cuò),

Error: Cannot find module 'mysql'

然后,我們?cè)谠撐募A中使用命令行,然后開(kāi)始安裝模塊

cnpm install mysql

這里本來(lái)應(yīng)該是npm install,但是由于國(guó)內(nèi)墻太高,所以使用了cnpm,具體安裝方式可以看我另一篇文章cnpm安裝。然后我們會(huì)發(fā)現(xiàn),文件夾中會(huì)多出一個(gè)名為node_modules的文件夾,里面便是下載的mysql以及其依賴。

Jietu20181103-150902.jpg

此時(shí)運(yùn)行a.js文件就不會(huì)報(bào)錯(cuò),而是正確輸出該模塊的內(nèi)容。

2.自定義模塊

在上面,我們?cè)褂胷equire引用自定義模塊時(shí)候,使用了./,那么可以不寫./嗎?答案是sure。
我們發(fā)現(xiàn)剛才使用install安裝的模塊會(huì)自動(dòng)安裝到node_modules文件夾中。然而我們使用時(shí)候并沒(méi)有加./。這些模塊也是一些別人自定義的模塊。

所以,我們把剛才的安裝mysql時(shí)候生成的node_modules文件夾刪掉,

然后自己新建一個(gè)同名的文件夾(node_modules)。然后在里面定義一個(gè)b.js。和之前一樣導(dǎo)出變量,然后引入的時(shí)候去掉./,發(fā)現(xiàn)不會(huì)報(bào)錯(cuò),可以正常使用。

1.node_modules是固定名字,不能改為其他名字。

假如我們?cè)趎ode_modules中把剛才的b.js改為http.js,因?yàn)閚ode自帶模塊也有個(gè)http模塊,那么我么在使用導(dǎo)入過(guò)來(lái)的模塊是哪個(gè)呢?經(jīng)過(guò)驗(yàn)證,

2.在Node.js中,如果自定義模塊和系統(tǒng)模塊名字相同,會(huì)優(yōu)先使用系統(tǒng)模塊,如果沒(méi)有找到,則會(huì)使用自定義模塊。(這個(gè)優(yōu)先級(jí)指的是在node_modules中的模塊)。

3.自定義模塊發(fā)布

我們使用install安裝的包都是別人封裝好的發(fā)布上去的,假如自己寫了一個(gè)很牛逼的包,那么我們?cè)趺床拍芄蚕沓鰜?lái)給大家使用?

首先,我們打開(kāi)npm官網(wǎng)。第三方用戶自定義的包發(fā)布到這個(gè)網(wǎng)站上面。我們可以在上面搜素到我們所需要的模塊。如下圖:

Jietu20181103-161641.jpg

我們?cè)诎l(fā)布自己的模塊時(shí)候,肯定是需要自己的一個(gè)賬號(hào)。在上面的官網(wǎng)可以注冊(cè),或者

在命令行中數(shù)輸入npm,發(fā)現(xiàn)它后面可以跟有很多命令。其中adduser就是注冊(cè)賬戶的意思。這里我們直接在官網(wǎng)進(jìn)行注冊(cè),操作步驟在這里就不多說(shuō)了。

Jietu20181103-161335.jpg

接下來(lái)我們開(kāi)始制作自己的模塊。我們隨便建一個(gè)空文件夾。這里叫public,里面增加一個(gè)index.js,內(nèi)容為:

module.exports={
    a:1
}

然后,

1.npm init初始化模塊配置文件,具體可以看我的這篇文章package.json講解。該命令會(huì)生成一個(gè)package.json文件。這里在執(zhí)行命令過(guò)程中,輸入的相關(guān)內(nèi)容如下:

{
  "name": "yintest",
  "version": "1.0.0",
  "description": "這是一個(gè)測(cè)試文件",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "test",
    "yin"
  ],
  "author": "YIN",
  "license": "ISC"
}

2.npm login登錄自己之前注冊(cè)的賬號(hào)。期間會(huì)提示輸入賬戶密碼郵箱。我們也可以使用npm whoami查看當(dāng)前已登錄的用戶。

3.登錄成功后,我們使用npm publish,等命令執(zhí)行成功后,會(huì)出現(xiàn)如下

Jietu20181103-165231.jpg

上圖成功輸出的信息,前面為包名字,后面為版本號(hào)。

4.我們進(jìn)入npm官網(wǎng)搜索yintest,發(fā)現(xiàn)可以搜索到我們安裝的包了.


Jietu20181103-165816.jpg

5.在public文件夾cnpm install yintest,會(huì)發(fā)現(xiàn)生成了node_modules并在其中出現(xiàn)了自己剛才傳上去的test.js。

6.后面我們就可以正常在其他文件中正常使用了。

現(xiàn)在我已經(jīng)發(fā)布了testyin的1.0.0版本,假如我更新了test.js文件,然后我再次輸入npm publish,會(huì)發(fā)現(xiàn)報(bào)錯(cuò)了,提示1.0.0版本我已經(jīng)發(fā)布過(guò)了,不能再發(fā)布相同版本。那么我們只需要

7.更改package.json文件的版本號(hào),這里我隨便改成2.0.1.然后再次npm publish即可。再次去官網(wǎng)驗(yàn)證,更新已經(jīng)成功。

8.我已經(jīng)把yintest包更新到2.0.1版本了,但是我之前本地安裝的仍然是舊版本怎么辦。我們?cè)俅屋斎雗pm,發(fā)現(xiàn)里面有個(gè)update。很明顯更新的意思。我們輸入npm update yintest,等更新完成后,再次查看node_modules的文件,發(fā)現(xiàn)已經(jīng)更新成功。不過(guò)不知道是自己電腦問(wèn)題還是其他問(wèn)題,我輸入上面更新命令貌似不管用,node_modules里面還是舊版本。所以我只能使用npm install yintest@lastest即安裝yintest的最新版本即可。

我們已經(jīng)學(xué)會(huì)把自己的模塊上傳到npm服務(wù)器其里面,還有個(gè)問(wèn)題,假如我要?jiǎng)h除自己曾經(jīng)發(fā)布的包怎么辦?

9.我們輸入npm發(fā)現(xiàn)里面還有個(gè)unpublish,這個(gè)就是刪除已發(fā)布的模塊。試一下,我們輸入npm unpublish,此時(shí)會(huì)出現(xiàn)下圖的情況。它提示我們需要添加--force來(lái)強(qiáng)制刪除。

![Jietu20181104-171315.jpg](https://upload-images.jianshu.io/upload_images/1894758-32d3eb0f7695a0b6.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

10.所以我們輸入npm unpublish --force,稍等片刻提示我們最新的一個(gè)版本2.0.1刪除成功。去npm官網(wǎng)上看下,只剩下1.0.1版本了,再次輸入相同命令才能刪除1.0.1版本。

注:①npm默認(rèn)只能一個(gè)一個(gè)刪除版本,不能一次性刪除所有版本。

②假如發(fā)布的包已經(jīng)有人下載使用(npm官網(wǎng)可以看是否有人下載),刪除會(huì)報(bào)錯(cuò),是無(wú)法刪除的。具體判斷自己的包是否可以刪除可以去npm的官網(wǎng)看下文檔政策介紹。

至此,npm的介紹總共就這么多,大家可以按照上面步驟去嘗試下。

下一節(jié)-node.js學(xué)習(xí)(9)—express框架基本用法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容