先從一個簡單的demo說起,用cmd打開命令提示符,輸入echo Hello,大家是不是看到終端上顯示出了Hello字樣,事實上這就是一個簡單的事件。
回到正題,相信提到node.js,免不了讓人想起非阻塞、回調、事件循環、并發、網絡編程等。(在此強調一下并發:許多人同時嘗試做同樣的事情),下面將主要介紹一下node.js的特色功能!
回調
相信大家到回調應該不陌生,簡單一點的說就是函數可以作為參數傳遞給另外一個函數中,然后被調用。我們來看看node.js是如何使用回調的,用例子說話!(哈哈)
var fs = require('fs'); fs.readFile('somefile.txt', 'utf8', function (err, data) { if (err) { throw err; } console.log(data); });
回調函數中的第一個參數err,用于保存在讀取文件時返回的錯誤。
回調函數中的第一個參數err,用于保存讀取文件所返回的數據。
Node.js以提供一個創建聯網應用程序的平臺為目標,回調是Node.js實現網絡編程的關鍵方法,因為回調讓代碼在其事件發生的時候才能運行。基于網絡的I/O是不可預測的,事件驅動編程是處理不可預測性的極佳方式,回調產生是負責解決不可預測性的方法,它也是處理并發的高效方法。
回調的相關Demo
1、建立一個app.js,代碼如下
var http = require('http'), urls = ['shapeshed.com', 'www.bbc.co.uk', 'edition.cnn.com']; function fetchPage(url) { var start = new Date(); http.get({ host: url }, function (res) { console.log('Got response from:' + url); console.log('Request took:' + (new Date() - start) + 'ms'); }); } for (var i = 0; i < urls.length; i++) { fetchPage(urls[i]); }
2、運行 node.app 多執行幾次 仔細看結果 從這個例子中我相信你應該能夠體會基于網絡的I/O是不可預測的,事件驅動編程是處理不可預測性的極佳方式,回調產生是負責解決不可預測性的方法,它也是處理并發的高效方法。
事件循環
Node.js運行在單一的進程中并且要求開發人員使用異步編碼風格。(同步和異步的概念在此不贅述了)
網絡經常不是開發人員所能控制的,我們可能要從不屬于我們的遠程服務器獲取代碼并處理,通過使用異步風格可以讓腳本在網絡事件返回時響應。
事件循環使得系統可以將回調函數先保存起來,而后當事件在將來發生時再運行。
事件循環的關鍵思想是將代碼圍繞著事件來構架而不是按照期待中的輸入順序來構架,由于事件循環以單一進程為基礎,所以為了確保高性能,需要遵循以下一些規則:
- 函數必須快速返回
- 函數不得阻塞
- 長時間運行的操作必須移到另一個進程中
HTTP
網絡編程免不了要了解一下HTTP,事實上它定義了服務器與客戶端在通信時應該如何發送和接收數據。通過使用HTTP模塊的低級應用程序編程接口,Node.js既允許我們創建服務器也允許我們創建客戶端。
講到http,大家自然而然的會想到URL。看一段代碼。
var http = require('http'), url = require('url'); http.createServer(function (request, response) { var pathname = url.parse(request.url).pathname; if (pathname === '/') { response.writeHead(200, { 'Content-Type': 'text/plain' }); response.end('Home Page ! '); } else { if (pathname === '/about') { response.writeHead(200, { 'Content-Type': 'text/plain' }); response.end('About Us ! '); } else { if (pathname === '/redirect') { response.writeHead(301, { 'Location': '/' }); response.end(); } else { response.writeHead(404, { 'Content-Type': 'text/plain' }); response.end('Page not found ! '); } } } }).listen(3000, '127.0.0.1'); console.log(' change!');
運行之后,打開瀏覽器訪問http://127.0.0.1:3000
http://127.0.0.1:3000/about
http://127.0.0.1:3000/redirect
http://127.0.0.1:3000/hello
看到的結果各不一樣,這就是路由起的效果。
在大家眼里,似乎HTML客戶端就是瀏覽器,事實上HTML客戶端可以是任何對服務器請求響應的東西。
看了上面的代碼可能大家會很困惑,我用Node.js需要了解那么多HTTP里面的細節,會不會太麻煩了,下面Express粉墨登場了。
Express
簡單一點的一句話介紹Express就是Node.js的一個Web框架。
使用npm install -g express命令來安裝Express(友情提示:這里使用了-g是因為我們是用的全局安裝)
創建一個基礎的Express站點
1、打開終端,輸入express [siteName](注意這里的siteName是你自定義的網站名稱)
2、cd siteName && npm install
3、node app
4、打開web瀏覽器,輸入http://127.0.0.1:3000/
不含病毒。www.avast.com |
留言列表