上一節(jié)-node.js學習(7)—node.js的模塊化輸入輸出
1.npm介紹
npm——NodeJs Package Manager(nodejs 包管理器)。它是node中自帶的命令。我們在node中的大部分操作都需要用到它。在前端開發(fā)中,其最明顯的兩個作用:
1.統(tǒng)一下載路徑,我們只需要通過npm install就可以安裝所需文件。而不是像電腦中安裝軟件,百度搜索一看,有復雜的應用市場。
2.通常我們下載模塊,有可能該模塊又依賴其他模塊,npm會自動幫我們處理依賴,我們可以不用關心需要下載的模塊以來什么。
舉個??

我們在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以及其依賴。

此時運行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)站上面。我們可以在上面搜素到我們所需要的模塊。如下圖:

我們在發(fā)布自己的模塊時候,肯定是需要自己的一個賬號。在上面的官網(wǎng)可以注冊,或者
在命令行中數(shù)輸入npm,發(fā)現(xiàn)它后面可以跟有很多命令。其中adduser就是注冊賬戶的意思。這里我們直接在官網(wǎng)進行注冊,操作步驟在這里就不多說了。

接下來我們開始制作自己的模塊。我們隨便建一個空文件夾。這里叫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)如下

上圖成功輸出的信息,前面為包名字,后面為版本號。
4.我們進入npm官網(wǎng)搜索yintest,發(fā)現(xiàn)可以搜索到我們安裝的包了.

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來強制刪除。

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的介紹總共就這么多,大家可以按照上面步驟去嘗試下。