原文URL:http://blog.modulus.io/absolute-beginners-guide-to-nodejsjava
本文的組成:上文的翻譯以及小部分本身的理解。全部文章中提到的JS代碼,都是通過測試,可運行併產生正確結果的。node
What is Node.js?
關於Node.Js,要注意一點:Node.js自己並非像IIS,Apache同樣的webserver,它是一個JavaScript 的運行環境。當咱們須要搭建一個HTTP 服務器的時候,咱們能夠藉助Node.Js提供的庫快捷的寫一個。web
Installing Node
Node.js 安裝是很是方便的,若是你在用Windows or Mac,去這個頁面就能夠了download page.express
I've Installed Node, now what?
以WINDOWS爲例,一旦安裝好Node.Js以後,能夠經過兩種不一樣方式來調用Node。npm
方式一:CMD 下輸入node,進入交互模式,輸入一行行的JS代碼,Node.Js會執行並返回結果,例子:api
$ node > console.log('Hello World'); Hello World undefined
PS:上一個例子的undefined來自於console.log的返回值。數組
方式二:CMD 下輸入node 文件名(固然須要先CD到該目錄)。例子:瀏覽器
hello.js 下的代碼:
console.log('Hello World');$ node hello.js Hello World
Doing Something Useful - File I/O
使用純粹的Js原生代碼是有趣可是不利於工程開發的,Node.JS提供了一些有用的庫(modules),下面是一個使用Node.js提供的庫分析文件的例子:
example_log.txt
2013-08-09T13:50:33.166Z A 2 2013-08-09T13:51:33.166Z B 1 2013-08-09T13:52:33.166Z C 6 2013-08-09T13:53:33.166Z B 8 2013-08-09T13:54:33.166Z B 5
咱們作的第一件事情是讀出該文件的全部內容。
my_parser.js
// Load the fs (filesystem) module var fs = require('fs'); // Read the contents of the file into memory. fs.readFile('example_log.txt', function (err, logData) { // If an error occurred, throwing it will // display the exception and end our app. if (err) throw err; // logData is a Buffer, convert to string. var text = logData.toString(); });
filesystem (fs 的API ref) module 提供了一個能夠異步讀取文件而且結束後執行回調的函數,內容以 Buffer的形式返回(一個byte數組),咱們能夠調用toString() 函數,將它轉換成字符串。
如今咱們再來添加解析部分的代碼。
my_parser.js
// Load the fs (filesystem) module. var fs = require('fs');// // Read the contents of the file into memory. fs.readFile('example_log.txt', function (err, logData) { // If an error occurred, throwing it will // display the exception and kill our app. if (err) throw err; // logData is a Buffer, convert to string. var text = logData.toString(); var results = {}; // Break up the file into lines. var lines = text.split('\n'); lines.forEach(function(line) { var parts = line.split(' '); var letter = parts[1]; var count = parseInt(parts[2]); if(!results[letter]) { results[letter] = 0; } results[letter] += parseInt(count); }); console.log(results); // { A: 2, B: 14, C: 6 } });
Asynchronous Callbacks
剛纔的例子中使用到了異步回調,這在Node.Js編碼中是普遍被使用的,究其緣由是由於Node.Js是單線程的(能夠經過某些特殊手段變爲多線程,但通常真的不須要這麼作)。故而須要各類非阻塞式的操做。
這種非阻塞式的操做有一個很是大的優勢:比起每個請求都建立一個線程的Web Server。Node.Js在高併發的狀況下,負載是小得多的。
Doing Something Useful - HTTP Server
咱們來運行一個HTTP server吧, 直接複製 Node.js homepage.上的代碼就能夠了。
my_web_server.js
var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(8080); console.log('Server running on port 8080.');
運行以上代碼以後就能夠訪問http://localhost:8080 就能看到結果啦。
上面的例子顯然過於簡單,若是咱們須要創建一個真正的web server。咱們須要可以檢查什麼正在被請求,渲染合適的文件,並返回。而好消息是,Express已經作到這一點了。
Doing Something Useful - Express
Express 是一個能夠簡化開發的框架。咱們執行npm install 來安裝這個package。
$ cd /my/app/location $ npm install express
指令執行完畢後,Express相關的文件會被放到應用目錄下的node_modules文件夾中。下面是一個使用Express開發的例子:
my_static_file_server.js
var express = require('express'), app = express();app.use(express.static(__dirname + '/public')); app.listen(8080);$ node my_static_file_server.js
這樣就創建了一個文件服務器。入油鍋咱們在 /public 文件夾放了一個"my_image.png" 。咱們就能夠在瀏覽器輸入http://localhost:8080/my_image.png 來獲取這個圖片. 固然,Express 還提供了很是多的其它功能。
Code Organization
剛纔的例子中咱們使用的都是單個文件,而實際的開發中,咱們會設計到代碼如何組織的問題。
咱們試着將最開始的文字解析程序從新組織。
parser.js
// Parser constructor. var Parser = function() { }; // Parses the specified text. Parser.prototype.parse = function(text) { var results = {}; // Break up the file into lines. var lines = text.split('\n'); lines.forEach(function(line) { var parts = line.split(' '); var letter = parts[1]; var count = parseInt(parts[2]); if(!results[letter]) { results[letter] = 0; } results[letter] += parseInt(count); }); return results; }; // Export the Parser constructor from this module. module.exports = Parser;
關於這裏的exports 的含義請參考個人博客:Node.Js學習01: Module System 以及一些經常使用Node Module.
my_parser.js
// Require my new parser.js file. var Parser = require('./parser'); // Load the fs (filesystem) module. var fs = require('fs'); // Read the contents of the file into memory. fs.readFile('example_log.txt', function (err, logData) { // If an error occurred, throwing it will // display the exception and kill our app. if (err) throw err; // logData is a Buffer, convert to string. var text = logData.toString(); // Create an instance of the Parser object. var parser = new Parser(); // Call the parse function. console.log(parser.parse(text)); // { A: 2, B: 14, C: 6 } });
這樣,文字解析的部分就被抽離了出來。
Summary
Node.js 是強大而靈活的。