node模塊化

一、 Node.js模塊

1. 課程介紹

NodeJS介紹(了解)

NodeJS準(zhǔn)備工作(掌握)

NodeJS模塊(掌握)

NPM(掌握)

2. NodeJs介紹

2.1. 什么NodeJs(自我理解)

首先在搞清楚什么NodeJs之前,我們先來(lái)聊聊JavaScript,只要做過(guò)開發(fā)的人都應(yīng)該知道JavaScript是目前最為流行的前端(客戶端)腳本語(yǔ)言,JavaScript在Web項(xiàng)目中的使用率可以說(shuō)是99%以上,不夸張的舉個(gè)例子:"現(xiàn)在你打開的100個(gè)網(wǎng)頁(yè)中慈参,有99個(gè)都使用了JavaScript"蘑险。

那么為什么JavaScript這么火,其實(shí)原因非常非常的簡(jiǎn)單,JavaScript出現(xiàn)賦予網(wǎng)頁(yè)新的生命力,從一開始它只為表單驗(yàn)證而生,到現(xiàn)在百萬(wàn)億的網(wǎng)站使用JavaScript來(lái)做的各種效果及人性化的功能唁桩,估計(jì)用一本書也很難寫完JavaScript在前端所做的貢獻(xiàn)和地位。

如果一個(gè)東西靈活到你都無(wú)法駕馭了浴讯,你就會(huì)覺(jué)得這對(duì)于使用者來(lái)說(shuō)并不是一件好事情朵夏,不過(guò)這些在我看來(lái)正是它為何最終能走向后端開發(fā)的原因。對(duì)于后端千變?nèi)f化的功能來(lái)說(shuō)榆纽,或許一個(gè)靈活的語(yǔ)言仰猖,能讓我們寫出更靈活的代碼。

進(jìn)入我們的正題奈籽,JavaScript以前只是作為一門前端腳本語(yǔ)言饥侵,一門語(yǔ)言的運(yùn)行,是需要執(zhí)行環(huán)境(瀏覽器)衣屏,就如同我們的Java代碼躏升,它需要運(yùn)行在JVM中。JavaScript也不例外狼忱,JavaScript的執(zhí)行環(huán)境是什么耐膨疏?沒(méi)錯(cuò)就是我們的客戶端瀏覽器(IE,FF,Chrorme....)一睁。之所以我們把它成為了稱為前端(客戶端)腳本語(yǔ)言,就是因?yàn)樗倪\(yùn)行環(huán)境。終于有一天,有一個(gè)位和我一樣熱愛(ài)JavaScript的美國(guó)程序員Ryan Dahl(瑞恩達(dá)爾),他決定使用JavaScript做一些更加有意義的事情,給予JavaScript在開發(fā)中所處的新定位佃却,使用JavaScript作為后端****(****服務(wù)器)****編程語(yǔ)言來(lái)做開發(fā),我的天者吁,這個(gè)想法簡(jiǎn)直就是瘋了(如同一只狗,有一天對(duì)著貓說(shuō):"我要開始抓老鼠了"饲帅。貓嘲諷的說(shuō)道:"呵呵复凳,就你,能行嗎?")灶泵∮耍“那么問(wèn)題來(lái)了?真正的問(wèn)題來(lái)”,當(dāng)然這個(gè)問(wèn)題并不是按照劇情一樣問(wèn):"挖掘機(jī)技術(shù)哪家強(qiáng)?" Ryan Dahl可沒(méi)有興趣思考這樣的問(wèn)題赦邻。 要讓JavaScript****的作為后端(****服務(wù)器)****編程語(yǔ)言髓棋,那么必須就要先要脫離JavaScript****目前的執(zhí)行環(huán)境客戶端瀏覽器。Ryan Dahl想到了一個(gè)好點(diǎn)子深纲,使用Google Chrome開源瀏覽器JavaScript V8****引擎為基礎(chǔ)搭建了一個(gè)新的JavaScript執(zhí)行環(huán)境(注意:這里說(shuō)的只是使用的瀏覽器執(zhí)行JavaScript的引擎仲锄,并非是我們使用瀏覽器客戶端),并且在V8引擎中基礎(chǔ)上添加了服務(wù)器編程語(yǔ)言應(yīng)該有的功能劲妙,如文件系統(tǒng)湃鹊,模塊,包镣奋,操作系統(tǒng)****API****币呵,網(wǎng)絡(luò)通信等,由此一個(gè)新的平臺(tái)產(chǎn)生名為NodeJs****侨颈。

NodeJs = JavaScript執(zhí)行環(huán)境+JavaScript擴(kuò)展的功能余赢。
簡(jiǎn)單理解NodeJs就是一個(gè)可以讓JavaScript脫離瀏覽器還能執(zhí)行的平臺(tái),并且這個(gè)平臺(tái)對(duì)JavaScript功能進(jìn)行了增強(qiáng)。

2.2. 客戶端編程語(yǔ)言和服務(wù)器編程語(yǔ)言

客戶端編程語(yǔ)言是運(yùn)行在客戶端瀏覽器里面哈垢。 例如:html妻柒,css, javascript
服務(wù)器編程語(yǔ)言是運(yùn)行在服務(wù)器上。 例如:java php .net nodejs
客戶端編程語(yǔ)言用來(lái)實(shí)現(xiàn)瀏覽器頁(yè)面特效耘分。例如: 幻燈片举塔,輪播
服務(wù)器編程語(yǔ)言用來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)支付,數(shù)據(jù)庫(kù)操作求泰,調(diào)用第三方應(yīng)用央渣。

2.3. 什么是NodeJs(官方)

Node.js是一個(gè)基于 Chrome V8引擎的 JavaScript運(yùn)行環(huán)境。Node.js 使用了一個(gè)事件驅(qū)動(dòng)渴频、非阻塞式 I/O 的模型芽丹,使其輕量又高效。Node.js的包管理器 npm卜朗,是全球最大的開源庫(kù)生態(tài)系統(tǒng)拔第。

2.4. NodeJs與JavaScript區(qū)別

很多人咕村,分不清楚彼此之間的關(guān)系和區(qū)別,學(xué)習(xí)NodeJs之前我們先對(duì)他們進(jìn)行質(zhì)上的比對(duì)蚊俺;

NodeJs :一個(gè)可以運(yùn)行****JavaScript****的平臺(tái)培廓,基于Chrome JavaScript V8****引擎,并且對(duì)ECMAScript****語(yǔ)言進(jìn)行了增強(qiáng)春叫,使ECMAScript****具有服務(wù)器語(yǔ)言開發(fā)的能力(操作文件肩钠,讀取系統(tǒng)信息,網(wǎng)絡(luò)等暂殖。价匠。。)呛每;

JavaScript:一門編程語(yǔ)言踩窖,只要有ECMAScript引擎就能運(yùn)行,各大瀏覽器都有自己的JavaScript引擎晨横,并且如果ECMAScript運(yùn)行在瀏覽器中洋腮,瀏覽器對(duì)ECMAScript加入了瀏覽器和文檔操作的接口(方法);

簡(jiǎn)單理解:JavaScript運(yùn)行需要JavaScript引擎手形,JavaScript引擎可以在瀏覽器(IE啥供、Firefox、Chrome)中库糠,也可以獨(dú)立出來(lái)(NodeJs)伙狐,運(yùn)行在瀏覽器中的JavaScript,為客戶端JavaScript瞬欧,而NodeJs稱為服務(wù)端JavaScript贷屎。 JavaScript運(yùn)行在不同的平臺(tái),責(zé)任也不一樣艘虎,瀏覽器中JavaScript主要是操作BOM和DOM唉侄,而NodeJs則是具有服務(wù)端語(yǔ)言處理能力(處理網(wǎng)絡(luò)請(qǐng)求,保存數(shù)據(jù)到數(shù)據(jù)庫(kù))野建;

注意:NodeJs平臺(tái)與瀏覽器平臺(tái)中運(yùn)行的JavaScript属划,在兩個(gè)不同的平臺(tái),平臺(tái)各自運(yùn)行自己的代碼互不干擾贬墩。

2.5. 為什么學(xué)NodeJs

1.前后端語(yǔ)言統(tǒng)一(JavaScript 理想狀態(tài));
2.前后端分離(淘寶架構(gòu));
3.前端開發(fā)工具很多都基于Node,只有會(huì)Node榴嗅,使用起來(lái)才能得心應(yīng)手;
4.社區(qū)活躍,上千個(gè)成熟模塊供我們選擇使用陶舞;
5.上手快嗽测,開發(fā)簡(jiǎn)單;
6.Node.JS薪資高,人才少唠粥;
7.前端開發(fā)疏魏,必備技能;
8.源代碼教育Web高級(jí)前端必學(xué)晤愧;
9.自己可以做私單.前端后端自己攔(全棧開發(fā)工程師)大莫;

2.6. NodeJs用在哪里嘲叔?

1.網(wǎng)站(如express/koa等)
2.im即時(shí)聊天(socket.io)
3.api(移動(dòng)端挎袜,pc,h5)
4.http proxy(淘寶首頁(yè))
5.前端構(gòu)建工具(grunt/gulp/bower/webpack/fis3…)
6.寫操作系統(tǒng)(NodeOS)
7.跨平臺(tái)打包工具(以前叫Node-WebKit現(xiàn)在叫nw.js)
8.命令行工具(比如cordova)

2.7. 哪些公司在應(yīng)用NodeJs

國(guó)外的公司 Yahoo, Paypal, eBay等還有很多的中小型公司祭埂,國(guó)內(nèi)的公司如雪球舅巷、淘寶羔味、網(wǎng)易、百度等也都有很多項(xiàng)目運(yùn)行在Node.****js之上钠右。

3. NodeJs準(zhǔn)備工作

3.1. 官方網(wǎng)站

英文:https://nodejs.org/en/

中文:http://nodejs.cn/

中文文檔:http://nodejs.cn/api/

菜鳥文檔:http://www.runoob.com/nodejs/nodejs-tutorial.html

3.2. 下載NodeJs

點(diǎn)擊“下載”(Download)下載你的電腦操作系統(tǒng)對(duì)應(yīng)的NodeJs版本赋元;
Windows 系統(tǒng)選擇.msi; 目前已被都是64位操作系統(tǒng),極少數(shù)是32位;
Mac 系統(tǒng)選擇.pkg;

中文地址:http://nodejs.cn/download/

英文地址:https://nodejs.org/en/download/

3.3. 安裝NodeJs

Windows系統(tǒng)下飒房,選擇和系統(tǒng)版本匹配的.msi后綴的安`裝文件搁凸。Mac OS X系統(tǒng)
下,選擇.pkg后綴的安裝文件狠毯。默認(rèn)安裝即可护糖。

3.4. DOS命令
3.4.1. 什么是DOS系統(tǒng)
使用window系統(tǒng)有兩種方式:

可視化的界面(窗口),

DOS系統(tǒng)

DOS命令是windows系統(tǒng)中自帶的命令行操作系統(tǒng).  

進(jìn)入命令行: win+R 在運(yùn)行框中輸入 cmd 再回車

 e: 切換盤符(切換到E盤)

 e:

 cd 進(jìn)入指定的文件夾

 cd 文件夾名  進(jìn)入指定的目錄

 cd ./ 進(jìn)入當(dāng)前目錄(省略不寫)

 cd ../ 進(jìn)入上一級(jí)目錄

 cd / 進(jìn)入根目錄

 dir 顯示當(dāng)前文件夾中的文件和目錄列表

 cls 清除屏幕

 ctrl+c 中斷執(zhí)行

######3.4.2. 命令行的兩種模式

  第一種: DOS系統(tǒng)模式 , 只能夠運(yùn)行DOS命令

(c:  cd    dir    cls ...)

標(biāo)識(shí): C:\user\administrator

  第二種: node模式: 只能運(yùn)行JS代碼

  標(biāo)識(shí): >

從 DOS模式切換到 Node模式:

  命令: node 回車

  從Node模式切換到DOS模式:

  命令: .exit

  快捷鍵: ctrl+c 按多次
3.5. 運(yùn)行NodeJs
3.5.1. REPL方式運(yùn)行

NodeJs提供了REPL模式(cmd命令行)( Read-Evaluate-Print-Loop,輸入 -求值 -輸出 -循環(huán)),即交互式命令行解析器),可以直接在命令行垃你,編寫NodeJs代碼椅文,適合檢驗(yàn)和學(xué)習(xí)nodejs。
win鍵(田字符)+R(運(yùn)行命令框)惜颇,輸入cmd; 輸入:node+回車;輸入:js代碼+回車少辣,查詢運(yùn)行效果凌摄;

3.5.2. js文件方式

1.新建一個(gè)js文件,然后編寫簡(jiǎn)單的js代碼

hello.js

function hello(){

 console.log(“hello”);

}

hello();

2.命令行運(yùn)行

//首先讓命令行導(dǎo)向到執(zhí)行文件的目錄下面. cd E:\WEB前端\NodeJs\DAY01\code node hello.js

3.webstorm控制臺(tái)運(yùn)行

4.webstrom快捷鍵運(yùn)行node.js

5.Alt+Shfit+F10

4. CommonJs規(guī)范(了解)

JavaScript是一個(gè)強(qiáng)大面向?qū)ο笳Z(yǔ)言漓帅,它有很多快速高效的解釋器锨亏。官方****JavaScript****標(biāo)準(zhǔn)定義的API****是為了構(gòu)建基于瀏覽器的應(yīng)用程序。然而忙干,并沒(méi)有定義一個(gè)用于更廣泛的應(yīng)用程序的標(biāo)準(zhǔn)庫(kù)器予。

CommonJS API****:不是一個(gè)語(yǔ)言,也不是一個(gè)平臺(tái)捐迫,它只是一個(gè)標(biāo)準(zhǔn)(****規(guī)范)****乾翔。 它定義的標(biāo)準(zhǔn)主要是對(duì)ECMAScript****標(biāo)準(zhǔn)API****進(jìn)行增強(qiáng)。

CommonJS API****定義很多普通應(yīng)用程序(主要指非瀏覽器的應(yīng)用)使用的API****,從而填補(bǔ)了這個(gè)空白反浓。它的終極目標(biāo)是提供一個(gè)類似Python萌丈,Ruby和Java標(biāo)準(zhǔn)庫(kù)。這樣的話雷则,開發(fā)者可以使用CommonJS API編寫應(yīng)用程序辆雾,然后這些應(yīng)用可以運(yùn)行在不同的ECMAScript解釋器和不同的主機(jī)環(huán)境中。在兼容CommonJS的系統(tǒng)中月劈,你可以使用JavaScript程序開發(fā):

服務(wù)器端JavaScript應(yīng)用程序

命令行工具(npm,webpack)

圖形界面應(yīng)用程序

混合應(yīng)用程序(如度迂,Titanium或Adobe AIR)

CommonJS是一種規(guī)范,NodeJS是這種規(guī)范的實(shí)現(xiàn)猜揪。

二進(jìn)制:二進(jìn)制(0英岭,1)數(shù)據(jù)對(duì)象(字節(jié)數(shù)組和/或字符串)(建議、討論湿右、早期實(shí)現(xiàn))

編碼:編碼和字符集(建議诅妹、討論、早期實(shí)現(xiàn)) UTF-8毅人,GBK, GBK2312, ISO-8859-1

io:I / O流(建議吭狡、討論)

fs,fs基地:文件系統(tǒng)(建議、討論丈莺、早期實(shí)現(xiàn) file system

系統(tǒng):系統(tǒng)接口(stdin划煮、stdout,stderr,等等)(1.0,提出修正案)

斷言,測(cè)試:單元測(cè)試(1.0,修正案提議未決)

套接字:套接字I / O TCP / IP套接字(早期的建議)

事件隊(duì)列:反應(yīng)堆反應(yīng)堆/事件隊(duì)列(早期的建議)

工人:工(并發(fā)無(wú)共享進(jìn)程/線程)(建議)

控制臺(tái):控制臺(tái)(建議)

簡(jiǎn)單理解:Commonjs是對(duì)ECMAScript的功能補(bǔ)充定義了規(guī)范(應(yīng)新增那些功能),NodeJs是對(duì)CommonJs的實(shí)現(xiàn)(提供那些新功能)缔俄。

5. NodeJs模塊基礎(chǔ)

NodeJs采用模塊方式來(lái)管理和組織代碼弛秋,NodeJs的所有的功能都存在每個(gè)模塊中。

5.1. 什么是模塊

模塊:一個(gè)****具有特定功能的****文件就是一個(gè)模塊俐载,模塊之間可能存在一定的依賴關(guān)系蟹略,使用模塊可以很好的把這些依賴關(guān)系整合起來(lái)。比如jquery的幻燈片插件依賴與jquery核心模塊遏佣。

5.2. 為什么要使用模塊

有了模塊挖炬,我們就可以非常方便的使用這些模塊,因?yàn)?strong>模塊總是完成了特定功能状婶,如果需要修改模塊中的功能意敛,那么需要修改這個(gè)自己的模塊文件即可,模塊獨(dú)立與每一個(gè)文件中膛虫,不影響模塊的代碼草姻。

5.3. 模塊規(guī)范

目前有三種流行的模塊規(guī)范,分別是AMD稍刀、CMD撩独、Commonjs(NodeJs)

http://blog.chinaunix.net/uid-26672038-id-4112229.html

http://www.zhihu.com/question/20351507/answer/14859415

5.3.1. AMD

AMD, (Asynchronous Module Definition=異步模塊定義),這種規(guī)范是異步的加載模塊,requirejs應(yīng)用了這一規(guī)范,適合客戶端瀏覽器環(huán)境跌榔。

AMD規(guī)范定義了一個(gè)自由變量或者說(shuō)是全局變量 define 的函數(shù)异雁。
define( id?, dependencies?, factory );

AMD規(guī)范 https://github.com/amdjs/amdjs-api/wiki/AMD

第一個(gè)參數(shù) id 為字符串類型,表示了模塊標(biāo)識(shí)僧须,為可選參數(shù)纲刀。若不存在則模塊標(biāo)識(shí)應(yīng)該默認(rèn)定義為在加載器中被請(qǐng)求腳本的標(biāo)識(shí)。如果存在担平,那么模塊標(biāo)識(shí)必須為頂層的或者一個(gè)絕對(duì)的標(biāo)識(shí)示绊。

第二個(gè)參數(shù),dependencies 暂论,是一個(gè)當(dāng)前模塊依賴的面褐,已被模塊定義的模塊標(biāo)識(shí)的數(shù)組字面量。

第三個(gè)參數(shù)取胎,factory展哭,是一個(gè)需要進(jìn)行實(shí)例化的函數(shù)或者一個(gè)對(duì)象。


 export.verb = function(){

 return beta.verb();

 // or:

 return require("beta").verb();

 }

});
5.3.2. CMD

CMD, (Common Module Definition), 是seajs推崇的規(guī)范闻蛀,國(guó)內(nèi)大牛玉伯之作匪傍。
define(factory);

factory,是一個(gè)需要進(jìn)行實(shí)例化的函數(shù)或者一個(gè)對(duì)象觉痛。

define( function(require, exports, module) {

 // 模塊代碼

});
5.3.3. Commonjs

CommonJS, 是誕生比較早的役衡。NodeJS就采用了CommonJS的規(guī)范來(lái)定義模塊。但是CommonJs****采用的是同步加載文件方式薪棒,只適用于服務(wù)端(NodeJs平臺(tái))

雖然有三種規(guī)范手蝎,寫法也不同,但是規(guī)范的最終目的都是為了功能的“模塊化”俐芯,將某個(gè)功能和多個(gè)功能獨(dú)立在一個(gè)文件中棵介,后期方便我們使用這些功能,而且模塊與模塊之間的是獨(dú)立的泼各,互不影響鞍时。

5.3.4. 模塊特點(diǎn)

JS中的模塊有共性,模塊的功能代碼都是在一個(gè)函數(shù)中扣蜻。

1.模塊中使用var定義變量都是局部變量。

2.模塊定義在函數(shù)及塘,也是局部莽使。

3.模塊有一個(gè)模塊對(duì)象。包含moduleId(模塊名)笙僚、exports(導(dǎo)出對(duì)象)

4.如果模塊中需要暴露方法或?qū)傩越o外部使用芳肌,那么就執(zhí)行往exports對(duì)象上面添加。

5.使用一個(gè)模塊用require(“moduleId”),該方法返回的是模塊對(duì)象的exports對(duì)象。

var a = require(“./a.js”);

a.xxx // 等同于模塊中exports.xxx.

5.4. 自定義模塊

一個(gè)JS文件就是一個(gè)模塊亿笤,所以定義一個(gè)模塊翎迁,只需要新建一個(gè)JS文件即可。


function sayHi(){

 console.log(“hi”);

}

function sayHello(){

 console.log(“hello”);

}

雖然我們?cè)趈s定義了兩個(gè)方法净薛,但是這個(gè)兩個(gè)方法只能在當(dāng)前模塊中使用汪榔,因?yàn)槟K是獨(dú)立的(內(nèi)部的變量和函數(shù)只能在該模塊使用),所以我們可以使用模塊內(nèi)的exports對(duì)象(導(dǎo)出對(duì)象)輸出模塊中功能供外部使用肃拜。


function sayHi(){

 console.log(“hi”);

}

function sayHello(){

 console.log(“hello”);

}

//非常重要痴腌,導(dǎo)出模塊功能(供外部使用)

exports.sayHi = sayHi;

exports.sayHello= sayHello;
5.5. 使用模塊

一個(gè)模塊,一旦定義完成后燃领,我們就可以使用這些模塊士聪。首先,你需要編寫一個(gè)新的文件(模塊)猛蔽,來(lái)使用hello.js模塊剥悟。

使用模塊,通過(guò)require(“模塊”);函數(shù)

main.js

//引入模塊

var hello = require(“./hello.js”); // .js可以省略

//使用模塊中的功能

hello.sayHi();

hello.sayHello();

node main.js

5.6. 主模塊

通過(guò)命令行參數(shù)傳遞給NodeJS以啟動(dòng)程序的模塊被稱為主模塊曼库。主模塊負(fù)責(zé)調(diào)

度組成整個(gè)程序的其它模塊完成工作区岗。

6. NodeJs模塊進(jìn)階(重點(diǎn))

6.1. 模塊組成(重點(diǎn)中的重點(diǎn))

一個(gè)文件就是一個(gè)模塊,編寫這個(gè)模塊中的代碼凉泄,實(shí)際上都寫在一個(gè)函數(shù)中躏尉,這樣就保證了局部變量,模塊獨(dú)立后众,不會(huì)對(duì)外部模塊造成影響胀糜。

實(shí)際

并且這個(gè)函數(shù)在調(diào)用的時(shí)候,會(huì)傳入5個(gè)參數(shù)require蒂誉、exports教藻、module、(__filename,__dirname)供定義模塊使用右锨。

6.2. require函數(shù)

require(moduleId)函數(shù)用于在當(dāng)前模塊中加載和使用別的模塊括堤,傳入一個(gè)模塊名,返回一個(gè)模塊導(dǎo)出對(duì)象绍移。

.是相對(duì)于當(dāng)前目錄悄窃,模塊文件路徑的js后綴可以省略


var foo2 = require('./foo.js');

被引入的模塊分為三種

**文件模塊**

**自己編寫的****js****,必須添加****./** **第三方模塊**

**第三方開發(fā)的**

**npm install** **包名**

**系統(tǒng)模塊**

**不需要安裝蹂窖,不需要指定路徑轧抗,直接引用**

fs http url os 

注意:

1)引入的文件沒(méi)有導(dǎo)出內(nèi)容的時(shí)候返回空對(duì)象

2)引入模塊文件有語(yǔ)法錯(cuò)誤時(shí)會(huì)報(bào)錯(cuò)

3)引入模塊不存在時(shí)會(huì)報(bào)錯(cuò)

4)重復(fù)引入模塊只執(zhí)行一次

5)在require函數(shù)引入模塊時(shí),可以省略擴(kuò)展名 .js .json .node 不寫瞬测。

6)引入文件模塊必須加上./, 原理是node具有自己的默認(rèn)模塊目錄node_modules

6.3. exports導(dǎo)出對(duì)象

exports對(duì)象是當(dāng)前模塊的導(dǎo)出對(duì)象横媚,用于導(dǎo)出模塊公有方法和屬性纠炮。別的模

塊通過(guò)require函數(shù)使用當(dāng)前模塊時(shí)得到的就是當(dāng)前模塊的exports對(duì)象。


exports.hello = function () {

console.log('Hello World!');

};

注意:
1)exports 等同于 module.exports
2)exports是一個(gè)對(duì)象恢口,可以對(duì)它添加屬性和方法
3)真正導(dǎo)出的對(duì)象是module.exports,而不是exports穷躁,exports只是對(duì)方的一個(gè)引用耕肩。是可以進(jìn)行修改的

6.4. module模塊對(duì)象(重點(diǎn)中的重點(diǎn))

module對(duì)象可以訪問(wèn)到當(dāng)前模塊的一些相關(guān)信息,但最多的用途是替換

當(dāng)前模塊的導(dǎo)出對(duì)象(module.exports={})折砸。例如模塊導(dǎo)出對(duì)象默認(rèn)是一個(gè)普通對(duì)象看疗,如果想改成一個(gè)函數(shù)的話,可以使用以下方式睦授。

module.exports = function () {

console.log('Hello World!');

};

 以上代碼中两芳,模塊默認(rèn)導(dǎo)出對(duì)象被替換為一個(gè)函數(shù)。

注意:
1)可以直接使用 module.exports 導(dǎo)出屬性去枷、方法怖辆、類
module.exports =變量;
module.exports =構(gòu)造函數(shù);

6.5. exports和module.exports的區(qū)別

exports僅僅是引用了module.exports. 但是真正暴露的對(duì)象為module.exports對(duì)象

6.6. 模塊初始化

一個(gè)模塊中的JS代碼僅在模塊第一次被使用時(shí)執(zhí)行一次,并在執(zhí)行過(guò)程中初始

化模塊的(exports)導(dǎo)出對(duì)象删顶。之后竖螃,緩存起來(lái)的導(dǎo)出對(duì)象被重復(fù)利用。

6.7. 模塊導(dǎo)入(重點(diǎn)中的重點(diǎn))

NodeJs共兩種類型的模塊:
1.核心模塊(系統(tǒng)模塊)
2.文件模塊
3.第三方
不同類型的模塊逗余,導(dǎo)入模塊時(shí)也有一些差異特咆。

6.7.1. 核心模塊

核心模塊,是由NodeJs平臺(tái)提供的模塊录粱,也可以稱為“系統(tǒng)模塊”腻格。

導(dǎo)入核心模塊的規(guī)則:不以.../開始的標(biāo)識(shí)符。

6.7.2. 文件模塊

.../開始的標(biāo)識(shí)符啥繁,這里都被當(dāng)做文件模塊來(lái)處理菜职。var hello = require(“./hello”);

var fs = require(“fs”); //fs模塊提供文件相關(guān)功能

6.7.3. node_modules文件夾

node_modules文件夾在nodejs中是一個(gè)特殊的文件夾,通過(guò)它的名字就可以看出旗闽,該文件夾也是用于存放node模塊酬核。

如果一個(gè)模塊不是一個(gè)系統(tǒng)模塊,也不是一個(gè)文件模塊适室,那么就會(huì)在node_modules文件夾下進(jìn)行操作嫡意。

console.log(module.paths);//node_modules會(huì)查找的目錄。

◆ 當(dāng)前文件目錄下的node_modules目錄捣辆。
◆ 父目錄下的node_modules目錄鹅很。
◆ 父目錄的父目錄下的node_modules目錄。
◆ 沿路徑向上逐級(jí)遞歸罪帖,直到根目錄下的node_modules目錄促煮。
◆ 環(huán)境變量配置的全局模塊目錄中。

6.7.4. 模塊后綴名

require()在分析標(biāo)識(shí)符的過(guò)程中整袁,會(huì)出現(xiàn)標(biāo)識(shí)符中不包含文件擴(kuò)展名的情況菠齿。CommonJS模規(guī)范也允許在標(biāo)識(shí)符中不包含文件擴(kuò)展名,這種情況下坐昙,Node會(huì)按js绳匀、json、node的次序補(bǔ)足擴(kuò)展名炸客,依次嘗試疾棵。

簡(jiǎn)單理解:如果模塊的后綴名為js、json痹仙、node那么可以不寫是尔。

6.8. 包
6.8.1. 什么是包?

JS模塊的基本單位是單個(gè)JS文件开仰,但復(fù)雜些的模塊往往由多個(gè)子模塊組成拟枚。為了便于管理和使用,我們可以把由多個(gè)子模塊組成的大模塊稱做包众弓,并把所有子模塊放在同一個(gè)目錄里恩溅。

組成一個(gè)包的所有子模塊中,需要有一個(gè)入口模塊谓娃,入口模塊的導(dǎo)出對(duì)象被

作為包的導(dǎo)出對(duì)象脚乡。

默認(rèn)包中的入口模塊為<u>index</u>.js,也可以在包中新建一個(gè)package.json包描述文件滨达,設(shè)置main屬性值為模塊的入口奶稠。

package.json

{

 main:”./hello.js” //模塊的入口

}

Package.json包描述文件
6.8.2. Package.json 屬性說(shuō)明
 name - 包名。

 version - 包的版本號(hào)弦悉。

 description - 包的描述窒典。

 homepage - 包的官網(wǎng) url 。

 author - 包的作者姓名稽莉。

 contributors - 包的其他貢獻(xiàn)者姓名瀑志。

dependencies - 依賴包列表。如果依賴包沒(méi)有安裝污秆,npm 會(huì)自動(dòng)將依賴包安裝在 node_module 目錄下劈猪。(模塊也會(huì)依賴其他模塊。)
repository - 包代碼存放的地方的類型良拼,可以是 git 或 svn战得,git 可在 Github 上(代碼倉(cāng)庫(kù) , git,svn版本控制工具)庸推。
main - main 字段是一個(gè)模塊ID常侦,它是一個(gè)指向你程序的主要項(xiàng)目浇冰。就是說(shuō),如果你包的名字叫 express聋亡,然后用戶安裝它肘习,然后require("express")。
keywords - 關(guān)鍵字坡倔,發(fā)布到npm后漂佩,供其他人搜索。

6.8.3. 創(chuàng)建包描述文件的命令

npm init 命令罪塔,幫助我們創(chuàng)建一個(gè)package.json

7. NPM(重點(diǎn))

Nodejs社區(qū)非常的熱鬧投蝉,眾多的優(yōu)秀開發(fā)者的提供了很多功能強(qiáng)大的模塊,供我們選擇使用征堪,使用這些模塊就需要用到NPM瘩缆。

https://www.npmjs.com/

Npm(Node Package Manager): Node包(模塊)管理工具,借助NPM请契,可以幫助用戶快速安裝和管理依賴包咳榜,這樣我們就可以很方便的使用來(lái)自全球Node開發(fā)者提供的包了。

7.1. Npm 安裝包(重點(diǎn)中的重點(diǎn))

npm 安裝 Node.js 模塊語(yǔ)法格式如下:

**npm install <Module Name>**

以下實(shí)例爽锥,我們使用 npm 命令安裝常用的 Node.js web框架模塊 express:

npm install express

安裝好之后涌韩,express 包就放在了工程目錄下的 node_modules 目錄中,因此在代碼中只需要通過(guò) require('express') 的方式就好氯夷,無(wú)需指定第三方包路徑臣樱。

var express = require('express');

全局安裝與本地安裝

npm 的包安裝分為本地安裝(local)、全局安裝(global)兩種腮考,從敲的命令行來(lái)看雇毫,差別只是有沒(méi)有-g而已,比如:

npm install express # 本地安裝

**npm install express -g   #** **全局安裝**

本地安裝

1. 將安裝包放在 ./node_modules 下(運(yùn)行 npm 命令時(shí)所在的目錄)踩蔚,如果沒(méi)有 node_modules 目錄棚放,會(huì)在當(dāng)前執(zhí)行 npm 命令的目錄下生成 node_modules 目錄。

2. 可以通過(guò) require() 來(lái)引入本地安裝的包名馅闽。

全局安裝

1. 將安裝包放在 /usr/local 下或者你 node 的安裝目錄飘蚯。

2. 可以直接在命令行里使用。

在工作中如何選擇盡量采用全局安裝.

7.2. Npm 常用命令
npm init 會(huì)引導(dǎo)你創(chuàng)建一個(gè)package.json文件福也,包括名稱局骤、版本、作者這些信息等

 npm install <name>安裝nodejs的依賴包

npm install <name> -g 將包安裝到全局環(huán)境中

npm install <name> --save **安裝的同時(shí)暴凑,將信息寫入package.json****中**

 npm remove <name>移除

 npm update <name>更新

 npm view <name> versions 查看可用版本

 <name>是操作的模塊名

npm install <name>安裝nodejs的依賴包

注意:如果全局安裝的包不能使用峦甩,就必須將全局安裝目錄加入到環(huán)境變量中。
NODE_PATH => C:\Users\admin\AppData\Roaming\npm\node_modules

7.3. CNPM

在我們中國(guó)现喳,要下載 npm 包非常慢凯傲,如果使用 cnpm 下載包就非橙剑快了。

CNPM是taobao提供的一個(gè)完整 npmjs.org 鏡像泣洞,cnpm與npm的內(nèi)容每10分鐘會(huì)同步一次忧风。

安裝cnpm:

npm install **-g** cnpm --registry=https://registry.npm.taobao.org

使用cnpm:

cnpm install <模塊名>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市球凰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌腿宰,老刑警劉巖呕诉,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吃度,居然都是意外死亡甩挫,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門椿每,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)伊者,“玉大人,你說(shuō)我怎么就攤上這事间护∫嗌” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵汁尺,是天一觀的道長(zhǎng)法精。 經(jīng)常有香客問(wèn)我,道長(zhǎng)痴突,這世上最難降的妖魔是什么搂蜓? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮辽装,結(jié)果婚禮上帮碰,老公的妹妹穿的比我還像新娘。我一直安慰自己拾积,他們只是感情好殉挽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著殷勘,像睡著了一般此再。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上玲销,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天输拇,我揣著相機(jī)與錄音,去河邊找鬼贤斜。 笑死策吠,一個(gè)胖子當(dāng)著我的面吹牛逛裤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播猴抹,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼带族,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蟀给?” 一聲冷哼從身側(cè)響起蝙砌,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎跋理,沒(méi)想到半個(gè)月后择克,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡前普,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年肚邢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拭卿。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡骡湖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出峻厚,到底是詐尸還是另有隱情响蕴,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布目木,位于F島的核電站换途,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏刽射。R本人自食惡果不足惜军拟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望誓禁。 院中可真熱鬧懈息,春花似錦、人聲如沸摹恰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)俗慈。三九已至姑宽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間闺阱,已是汗流浹背炮车。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瘦穆。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓纪隙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親扛或。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绵咱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351