1、一個簡單的node程序node
一、新建一個txt文件編程
二、修改後綴瀏覽器
修改以後會彈出這個,點擊「是」閉包
三、運行test.js編程語言
源文件模塊化
使用node.js運行以後的。函數式編程
若是該路徑下沒有該文件,會報錯函數
四、運行test2.js學習
2、模塊簡單使用ui
爲了編寫可維護的代碼,咱們把不少函數分組,分別放到不一樣的文件裏,這樣,每一個文件包含的代碼就相對較少,不少編程語言都採用這種組織代碼的方式。在Node環境中,一個.js文件就稱之爲一個模塊(module)。
模塊化的開發的好處:提升代碼的可維護性,避免修改代碼對其餘部分形成修改。
咱們編寫了一個test.js
文件,這個test.js
文件就是一個模塊,模塊的名字就是文件名(去掉.js
後綴),因此test.js
文件就是名爲test的模塊。
一、首先。咱們把test.js
改造一下,建立一個函數,這樣咱們就能夠在其餘地方調用這個函數:
函數greet()是自模塊中定義的,最後一行是一個賦值語句,意識就是說,把函數greet做爲模塊的輸出暴露出去,這樣其餘模塊就可使用greet函數了。
二、而後。其餘模塊怎麼使用test模塊的這個greet函數?在編寫一個main.js文件,調用test模塊的greet函數。
PS:引入test模塊用Node提供的require函數:
var greet=require('./test');
引入模塊做爲變量保存在greet變量中,那greet變量究竟是什麼東西?其實變量greet就是test.js中咱們使用module.exports=greet,輸出的greet函數。因此,main.js就成功引用
test.js模塊中定義的greet函數,接下來咱們將使用。
三、注意事項:
在使用require()引入模塊時候,注意模塊的相對路徑,由於main.js和test.js處於同一個目錄,因此咱們使用當前的目錄:
var greet=require('./test');
若是你寫
var greet=require('test');
Node就會依次在內置模塊、全局模塊和當前模塊下查找test.js,容易出現錯誤。
寫代碼:
一、模塊名是否寫對
二、模塊文件是否存在
三、相對路徑是否寫對
3、CommonJS規範
這種模塊加載機制被稱爲CommonJS規範。在這個規範下,每個.js文件都是一個模塊,他們內部各自使用的變量名和函數名都互不衝突,例如:test.js和main.js都申明全局變量var s=‘XXX’,可是互不影響。
一個模塊想對外暴露變量,可使用
module.exports = variable;
一個模塊要引用其餘模塊的變量,使用
var ref = require('module_name');
4、深刻理解模塊原理
當咱們編寫JavaScript代碼時候,咱們能夠申請全局變量:
var s = 'global';
在瀏覽器中,大量的使用全局變量可很差。若是你在a.js中使用全局變量s,那麼在b.js中也使用全局變量s,將會形成衝突,b.js中對s賦值會改變a.js的運行邏輯。
也就是說,JavaScript語言自己並無一種模塊化的機制來保證不一樣模塊之間可使用相同的變量名。
那麼Node.js是如何實現這一點?
實現這個模塊的功能,並不須要語法層面的支持。Node.js也並不會增長任何JavaScript語法。實現模塊功能在於JavaScript是一種函數式的變成語言,它支持閉包。若是咱們把一段JavaScript代碼用一個函數包裝起來,這段代碼的全部「全局」變量就了函數內部的局部變量。
test.js代碼是這樣的
var s='hello';
var name='world';
console.log(s+' '+name+'!')
Node.js加載test.js後,能夠把代碼包裝一下,變成這樣:
(function(){ var s='Hello'; var name='world'; console.log(s+' '+name+'!'); })();
這樣一來,原來的全局變量s變成了匿名函數內部的局部變量。若是Node.js繼續記載其餘模塊,這些模塊中定義的「全局」變量s也互不干擾。
因此Node.js利用JavaScript的函數式編程的特性,垂手可得實現模塊的隔離。
模塊輸出modeule.exports怎麼實現?
Node能夠先準備一個對象module:
//準備module對象 var module={ id:'hello', exports:{} } var load=function(module){ //讀取test.js代碼 function greet(name){ console.log('HelloBaby'+name+'!'); } module.exports=greet; //test.js代碼結束 return module.exports; }; var exported=load(module); //保存module save(module,exported);
可見,變量module是Node在加載js文件以前準備的一個變量,並將其傳入加載函數,test.js中能夠直接使用變量module緣由在於它其實是函數的一個參數:
module.exports=greet;
經過把參數module傳遞給load()函數,hello.js就順利吧一個變量傳遞給Node執行環境,Node會把module變量保存起來。
因爲Node保存了全部導入的module,當咱們用require()獲取module時,Node找到相應的module,把這個module的exports變量返回,這樣,另一個模塊就能夠順利拿到模塊的輸出:
var greet=require('./test');
以上是Node實現JavaScript模塊的一個簡單的原理介紹。
學習網址(參考廖雪峯):http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434502419592fd80bbb0613a42118ccab9435af408fd000