Node.js學習筆記(一)—— Node基礎,node.jsnode
歡迎轉載,但請註明出處:http://blog.csdn.net/sysuzjz/article/details/43968787
Node.js掃盲名字Node.js有多種別稱,Node,Nodejs,NodeJS。為了表示方便,文中會更頻繁使用Node來表示。為什麼命名為Node呢?一開始,創造者Ryan Dahl是稱呼為web.js的,目的是構建一個web伺服器。但後來項目發展越來越快,超出了單一的web伺服器的想法,變成了構建網路應用的基礎架構,在架構之上可以構建更多的東西,例如伺服器、用戶端、命令列工具等。它就像一個個節點,構成了各種網路應用,因此稱為Node。
誤區作為最近最熱潮的後台語言,Node頻繁的進入我們的視線。但就像一直有人搞不清楚Java和JavaScript的關係一樣,很多人對Node也存在很多誤解。比如:
- Node肯定是幾個前端工程師在實驗室裡鼓搗出來的
- 為了後端而後端,有意思嗎?
- 怎麼又發明了一門新語言?
- JavaScript承擔的責任太重了
- 直覺上,JavaScript不應該運行在後端
- 前端工程師要逆襲了
實際上,JavaScript運行在後台並不是首例。在最開始誕生時,網景就開始嘗試將它用在後端,微軟也有樣學樣,這就是ASP中用的指令碼語言。但當時JavaScript作為後端語言,效能無法與Java,PHP等相比,遂逐漸淡出眾人視線。而現在,V8引擎、即時、高並發等優點讓Node開始流行。特點非同步I/OIO是很消耗時間跟效能的,眾所周知JavaScript是單線程的,如果因為IO造成阻塞,效能將大打折扣。於是非同步I/O應運而生了。將IO獨立於主線程之外,只在IO完成後執行回調,效果類似於ajax。例如:
var fs = require("js");fs.readFile("/path", function(err, file) { console.log("讀取完成");});console.log("發起讀取");執行的順序依次是:開始讀取檔案,輸出"發起讀取”,讀取完成,輸出“讀取完成”。回調何時執行是不可知的,我們只知道執行完IO會執行回調即可。這就是典型的不關係過程只關心結果。事件驅動DOM事件相信每一個寫過前端的人都清楚,綁定完事件之後,只要觸發事件,就能執行回呼函數。這種做法是很高效的,因為我們不需要空轉等待,或者說,我們把空轉等待交給了更底層去實現。我們可以採用以下例子來說明,這個例子一般用於處理表單提交資料
var http = require("http");http.createServer(function(request, response) { var postData = ""; request.on("data", function(trunk) { postData += trunk; }) request.on("end", function() { response.end(postData); })})我們分別給request對象添加data事件和end事件,前者是因為表單提交是分多次的,每次一項。後者意味著提交結束,輸出接收到的表單項。事件驅動具有輕量級、松耦合、只關注事務點等優勢。單線程
JavaScript是單線程的,Node當然也是單線程的。在Node中,JavaScript與其他線程無法共用任何狀態。單線程最大的好處是不用像多線程編程那樣處處在意狀態的同步問題,一般情況下也不會出現死結,也沒有線程上下文交換所帶來的效能上的開銷。弱電也是有的,有以下三個方面:
- 無法利用多核CPU
- 錯誤會引起整個應用退出,應用的健壯性值得考研
- 大量計算佔用CPU導致無法調用非同步I/O
Node為解決這些問題採用了一個折中的辦法:啟用一個專門的並且完全獨立的進程進行大量計算,計算完之後通過訊息傳遞的方式傳遞運行結果。這就是child_process。工作思路和HTML5的Web Workers相同。
跨平台一開始Node只能在Linux下運行,後來和微軟達成一致,實現了Windows平台的相容。現如今,絕大部分主流平台都能完美支援Node。Node的安裝和部署windows下直接在官網下載並安裝即可:下載連結。windows下的node內建npm,可以用來安裝各種模組安裝後檢查node是否安裝成功:
node -v
npm安裝模組:以安裝express為例:(-g表示全域安裝)
npm install express -g
linux中,直接運行sudo apt-get install nodejs即可。
其他系統未測試,歡迎廣大觀眾自行測試,並將結果以評論方式告知。
第一個Node程式每一種程式設計語言的第一個程式都是hello world,我們這次也不要例外。Node.js首先是JS其次才是Node,所以,我們先建立一個.js檔案:server.js,在裡面輸入以下代碼:
var http = require("http");http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello World"); response.end();}).listen(8888);第一行的require和python的import類似,都是引入新的模組,不同的是Node引入後返回一個對象。預設情況下,我們用模組名來命名模組對象,當然我們也可以換成其他名字,例如:
<pre name="code" class="javascript">var foo = require("http");foo.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello World"); response.end();}).listen(8888);
這樣也是沒問題的,但這裡還是推薦用第一種命名方法。建立伺服器的方法是調用http模組的createServer方法,參數是一個函數,函數的參數分別為請求和響應。該方法返回結果仍然為對象,支援鏈式操作,後面是監聽的連接埠號碼。運行伺服器時,我們先進入該js檔案所在目錄,運行node server.js,然後在瀏覽器中開啟localhost:8888,我們會發現,瀏覽器中顯示"Hello World",伺服器開啟成功。