Node.js誕生于2009年,Node.js采用C++語言編寫而成,是一個JavaScript的運行環境,Node.js 是一個基于Chrome V8引擎的JavaScript的運行環境,讓JavaScript的運行脫離瀏覽器端,可以使用JavaScript語言編寫服務端代碼.
安裝nodejs
如果確定node已經安裝,但未顯示的話,可能出現是問題,node在mac中需要配置環境變量:
- touch ~/.bash_profile
- vim ~/.bash_profile
- export PATH = $PATH:/usr/local/bin
- 退出vim命令: :x
- 重啟電腦或者scource ~/.bash_profile
學習資料:
(1) 菜鳥教程: http://www.runoob.com/nodejs/nodejs-tutorial.html
(2)nodejs參考手冊: http://nodejs.cn/api/
nodejs模塊化開發
為什么會有模塊:
在JavaScript發展初期就是為了實現簡單是頁面交互邏輯,寥寥數語即可;如今CPU、瀏覽器性能得到了極大的提升,很多頁面邏輯遷移到客戶端(表單驗證等),隨著web2.0時代的到來,Ajax技術得到廣泛的應用,jQuery等前端庫層出不窮,前端代碼日益膨脹,這時候JavaScript作為嵌入式的腳本語言的定位動搖了,JavaScript卻沒有為組織代碼提供任何明顯幫助,甚至沒有類的概念,更不用說模塊(module)了,JavaScript極其簡單的代碼組織規范不足以駕馭如此強大規模的代碼。
模塊的好處:
既然JavaScript不能處理如此大規模的代碼,我們可以借鑒一下其他語言是怎么處理大規模程序設計的,在Java中又一個重要的概念——package,邏輯上相關的代碼組織到同一個包內,包內是一個相對獨立的王國,不用擔心命名沖突什么的,那么如果外部使用呢?直接import對應package即可:import java.until.Arraylist.
遺憾的是JavaScript在設計時定位原因,沒有提供類似的功能,開發者需要模擬出類似的功能,來隔離、阻止復雜的JavaScript代碼,我們成為模塊化。
一個模塊就是實現特定功能的文件。有了模塊,我們就可以更方便的使用別人的代碼,想要什么功能,就加載什么模塊。模塊開發需要遵循一定的規范,各行其是就都亂套了。
commonjs規范
CommonJS就是為JS的表現來制定規范,因為js沒有模塊的功能所以CommonJs應運而生,它希望js可以在任何地方運行不只是瀏覽器中。
CommonJs能有一定的影響力,我覺得絕對離不開Node的人氣,不過,Node、CommonJs、瀏覽器甚至W3C之間有什么關系呢
require()
Node.js的模塊倉庫https://www.npmjs.com/,已經存放了15萬個模塊,其中絕大部分都是CommonJS格式.這種格式的核心就是require語句,模塊通過它加載.
require()的基本用法
當Node遇到 require(X) 時,按下面的順序處理
(1) 如果 X 是內置模塊 (比如 require("http") )
????? a. 返回該模塊
????? b. 不在繼續執行
(2) 如果 X 以"./" 或者 "/" 或者 "../"開頭
????? a. 根據 X 所在的符模塊,確定 X 的絕對路徑
????? b. 將 X 當成文件,依次查找下面文件,只要其中有一個存在,就返回該文件,不再繼續執行.
X
X.js
X.json
X.node
????? c. 將 X 當成目錄,依次查找下面文件,只要其中有一個存在,就返回該文件,不再繼續執行
X/package.json (main字段)
X/index.js
X/index.json
X/index.node
(3) 如果 X 不帶路徑
????? a. 根據 X 所在的父模塊,確定 X 可能的安裝目錄
????? b. 依次在每個目錄中,將 X 當成文件名或目錄名加載
(4) 拋出 “not found”
舉例:
當前腳本文件 /home/ry/projects/foo.js, 執行了require("bar"). 這屬于上面的第三種情況.Node內部的運行過程如下:
首先確定 x 的絕對路徑可能是下面這些位置,依次搜索每一個目錄.
/home/ry/projects/node_modules/bar
/home/ry/node_modules/bar
/home/node_modules/bar
/node_modules/bar
搜索時,Node先將 bar 當成文件名,依次嘗試加載下面這些文件,只要有一個成功就返回
bar
bar.js
bar.json
bar.node
如果都不成功,說明bar 可能是目錄名,于是依次嘗試加載下面這些文件
bar/package.json (main字段)
bar/index.js
bar/index.json
bar/index.node
如果在所有目錄中,都無法找到bar對應的文件或目錄,就拋出一個錯誤.
案例:引入url模塊解析路徑
var http = require("http"); //引入一個http的模塊
var url = require("url"); //引入路徑模塊
var server = http.createServer(function(req,res){
//parse(路徑,第二個參數為將請求參數解析為對象)
var urlObj = url.parse(req.url,true);
console.log(urlObj);
res.end();
});
server.listen(8080);
創建自己的模塊
加載當前目錄的模塊
不加var的變量是全局變量,在模塊內部最好加var
要導出一個屬性或者方法使用:modules.exports
如果是模塊下的方法和屬性使用:modules.exports={xx:xx},如果是想讓莫虧啊直接接受方法就導出函數
加載非當前目錄的模塊
首先會看當前目錄是否有一個node_modules,如果有就進入里面查找是否有叫模塊名稱的文件或者是否有叫模塊名稱的文件夾,如果是模塊名稱的文件夾需要看一下文件夾內部是否有叫index.js或者package.json中是否有設置main屬性,可以通過指令npm init 來進行創建
{
"name":"home",
"version" :"0.0.1",
"main": "home2.js"
}
如果當前目錄沒有node_modules,會向上查找.
加載原生模塊
非node項目也可以使用模塊化開發技術,用的比較多的模塊加載器有require(CMD),seaJs(AMD)
nodejs的內置模塊
Buffer , C/C++Addons , Child Processes , Cluster , Console , Crypto , Debugger , DNS , Domian , Errors , Events , File System , Globals , HTTP , HTTPS , Modules , Net , OS , Path , Process , Punycode , Query Strings , Readline , REPL , Stream , String Decoder , Timers , TLS/SSL , TTY , UDP/Datagram , URL , Utilities , V8 , VM , ZLIB ;
內置模塊不需要安裝,外置模塊需要安裝