一、一個簡單的node程序
1、新建一個txt文件
2、修改后綴
修改之后會彈出這個,點擊“是”
3、運行test.js
源文件
使用node.js運行之后的。
如果該路徑下沒有該文件,會報錯
4、運行test2.js
二、模塊簡單使用
為了編寫可維護的代碼,我們把很多函數分組,分別放到不同的文件里,這樣,每個文件包含的代碼就相對較少,很多編程語言都采用這種組織代碼的方式。在Node環境中,一個.js文件就稱之為一個模塊(module)。
模塊化的開發的好處:提高代碼的可維護性,避免修改代碼對其他部分造成修改。
我們編寫了一個test.js
文件,這個test.js
文件就是一個模塊,模塊的名字就是文件名(去掉.js
后綴),所以test.js
文件就是名為test的模塊。
1、首先。我們把test.js
改造一下,創建一個函數,這樣我們就可以在其他地方調用這個函數:
函數greet()是自模塊中定義的,最后一行是一個賦值語句,意識就是說,把函數greet作為模塊的輸出暴露出去,這樣其他模塊就可以使用greet函數了。
2、然后。其他模塊怎么使用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函數,接下來我們將使用。
3、注意事項:
在使用require()引入模塊時候,注意模塊的相對路徑,因為main.js和test.js處于同一個目錄,所以我們使用當前的目錄:
var greet=require('./test');
如果你寫
var greet=require('test');
Node就會依次在內置模塊、全局模塊和當前模塊下查找test.js,容易出現錯誤。
寫代碼:
1、模塊名是否寫對
2、模塊文件是否存在
3、相對路徑是否寫對
三、CommonJS規范
這種模塊加載機制被稱為CommonJS規范。在這個規范下,每一個.js文件都是一個模塊,他們內部各自使用的變量名和函數名都互不沖突,例如:test.js和main.js都申明全局變量var s=‘XXX’,但是互不影響。
一個模塊想對外暴露變量,可以使用
module.exports = variable;
一個模塊要引用其他模塊的變量,使用
var ref = require('module_name');
四、深入理解模塊原理
當我們編寫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
文章列表