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

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

1.npm介紹

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

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

2.通常我們下載模塊,有可能該模塊又依賴其他模塊,npm會自動幫我們處理依賴,我們可以不用關心需要下載的模塊以來什么。

舉個??


Jietu20181103-150235.jpg

我們在a.js中增加如下代碼

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

此時肯定會報錯,

Error: Cannot find module 'mysql'

然后,我們在該文件夾中使用命令行,然后開始安裝模塊

cnpm install mysql

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

Jietu20181103-150902.jpg

此時運行a.js文件就不會報錯,而是正確輸出該模塊的內容。

2.自定義模塊

在上面,我們曾使用require引用自定義模塊時候,使用了./,那么可以不寫./嗎?答案是sure。
我們發(fā)現(xiàn)剛才使用install安裝的模塊會自動安裝到node_modules文件夾中。然而我們使用時候并沒有加./。這些模塊也是一些別人自定義的模塊。

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

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

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

假如我們在node_modules中把剛才的b.js改為http.js,因為node自帶模塊也有個http模塊,那么我么在使用導入過來的模塊是哪個呢?經(jīng)過驗證,

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

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

我們使用install安裝的包都是別人封裝好的發(fā)布上去的,假如自己寫了一個很牛逼的包,那么我們怎么才能共享出來給大家使用?

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

Jietu20181103-161641.jpg

我們在發(fā)布自己的模塊時候,肯定是需要自己的一個賬號。在上面的官網(wǎng)可以注冊,或者

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

Jietu20181103-161335.jpg

接下來我們開始制作自己的模塊。我們隨便建一個空文件夾。這里叫public,里面增加一個index.js,內容為:

module.exports={
    a:1
}

然后,

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

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

2.npm login登錄自己之前注冊的賬號。期間會提示輸入賬戶密碼郵箱。我們也可以使用npm whoami查看當前已登錄的用戶。

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

Jietu20181103-165231.jpg

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

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


Jietu20181103-165816.jpg

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

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

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

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

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

我們已經(jīng)學會把自己的模塊上傳到npm服務器其里面,還有個問題,假如我要刪除自己曾經(jīng)發(fā)布的包怎么辦?

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

![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,稍等片刻提示我們最新的一個版本2.0.1刪除成功。去npm官網(wǎng)上看下,只剩下1.0.1版本了,再次輸入相同命令才能刪除1.0.1版本。

注:①npm默認只能一個一個刪除版本,不能一次性刪除所有版本。

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

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

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

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容