Node.js是什麼
Node.js是一個可以允許我們在伺服器端運作JavaScript代碼的程式。
這是什麼意思呢?通常,我們寫的JavaScript代碼都是在浏覽器中運作的。
實際上,浏覽器就是一個JavaScript運作時環境,用于解釋執行js代碼。
更進一步地說,雖然浏覽器提供了JavaScript運作時環境,但是它處在用戶端,也就是說此時JavaScript隻能用于編寫前端代碼。
但是,由于Node.js的出現,JavaScript代碼的執行就不會被局限于在用戶端,我們同樣可以讓JavaScript代碼在服務端執行。
OK,也就是說,即便你不懂任何服務端程式設計語言,但是你會寫JavaScript代碼,那麼你就同樣可以編寫在服務端運作的程式。
注意:雖然我們可以使用Node.js運作js代碼,但是Node.js本身卻是C語言開發的!
關于Node.js的官方解釋(詳見:https://nodejs.org/zh-cn/):
- Node.js是一個基于Chrome V8引擎的JavaScript運作時。
- Node.js使用高效、輕量級的事件驅動、非阻塞 I/O模型。
- 它的包生态系統,npm,是目前世界上最大的開源庫生态系統。
如何使用Node.js
使用Node.js非常簡單,有2種方式:
其一,直接運作node指令,進入node互動式shell環境,然後在其中編寫并執行js代碼。
> node
> console.log("hello,world")
hello,world
undefined
>
複制
上面案例中,在shell中鍵入了“console.log('hello,world')”并敲回車。Node便開始執行該代碼,并顯示剛才記錄的資訊,同時列印出“undefined”。這是因為每條指令都會傳回一個值,而console.log沒有任何傳回,故輸出“undefined”。
其二,使用Node.js執行一個JavaScript檔案,這是我們平時最常用的方法。
> node D:\\Node.js\\workspace\\test-helloworld\\logparserv2.js
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
{ A: 2, B: 14, C: 6 }
複制
輸出内容為對應js檔案中的console輸出資訊。
Node.js應用舉例
Node.js是單線程的。是以,Node.js典型的模式是使用異步回調。
基本上,你告訴Node.js要做的事,它執行完後便會調用你的函數(回調函數),這對于Web伺服器尤其重要。
在現代Web應用通路資料庫的過程中特别普遍,當你等待資料庫傳回結果的過程中,Node可以處理更多請求。
與每次連接配接僅處理一個線程相比,它使你以很小的開銷來處理成千上萬個并行連接配接。
Node.js本身已經内置了許多有用的程式設計子產品,可以用于實作一些有用的功能。
而且也已經存在許多獨立的架構子產品,可以友善地實作以前隻能使用笨重的服務端語言實作的功能。
1. 解析日志檔案
// 加載filesystem子產品,讀取檔案
var fs = require("fs");
fs.readFile("D:\\Node.js\\workspace\\test-helloworld\\test.log", function(error, logData){
if(error) {
throw error;
}
var text = logData.toString();
console.log(text);
// 解析文本
var results = {};
// 将文本分割為多行
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] += count;
});
console.log(results);
});
複制
日志檔案格式:
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
複制
2. 編寫http服務
// 加載http子產品
var http = require("http");
http.createServer(function(req, resp){
resp.writeHead(200, {"Content-Type" : "text/plain"});
resp.end("Hello! I am a Node.js http server.\n");
}).listen(8080);
console.log("server running on 8080\n");
複制
為什麼要用Node.js
Node.js提供了一種全新的編寫後端服務的方式,它并不要求你學習新的程式設計語言,隻要熟悉JavaScript就可以後端服務。
注意:Node.js僅僅是一個JavaScript運作時環境,單純安裝它并不能做什麼。
但是,使用Node.js内置的或者第三方的子產品,可以實作做很多有實際意義的事情。
常用的Node.js子產品
1.fs子產品,Node.js自帶的子產品,可用于通路檔案系統(注:在浏覽器中執行的js代碼是不能通路檔案系統的)。
2.http子產品,Node.js自帶的子產品,用于建構http服務。
3.Express架構,第三方子產品,可使建立網站的過程十分簡單,詳見:http://expressjs.com/
4.koa,web架構,詳見:http://koajs.com/
5.fastify,web架構,詳見:https://github.com/fastify/fastify
寫在最後
1.編寫在Node.js中運作的服務程式,熟練掌握JavaScript語言是基礎。
同時,編寫的程式要遵循JavaScript語言的相應規範和約定。例如:編寫子產品化程式。
myparser.js
// 将日志解析獨立成一個子產品
var Parser = function() {
};
// 解析文本
Parser.prototype.parse = function(text){
var results = {};
// 将文本分割為多行
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] += count;
});
// console.log(results);
return results;
};
// 告訴Node.js輸出檔案中的構造函數
module.exports = Parser;
複制
logparser.js
// 加載自定義的子產品
var Parser = require("./myparser");
var fs = require("fs");
fs.readFile("D:\\Node.js\\workspace\\test-helloworld\\test.log", function(error, logData){
if(error) {
throw error;
}
var text = logData.toString();
console.log(text);
var parser = new Parser();
var results = parser.parse(text);
console.log(results);
});
複制
2.在Node.js中還存在一個叫做npm的包管理工具,這是Node.js預設的,以JavaScript編寫的軟體包管理系統,可以類比java中的maven。npm會随着Node.js一起安裝,npm子產品倉庫提供了一個名為“registry”的查詢服務,使用者可通過本地的npm指令下載下傳并安裝指定子產品。此外使用者也可以通過npm把自己設計的子產品分發到registry上面。
3.npm可以管理本地項目的所需子產品并自動維護依賴情況,也可以管理全局安裝的JavaScript工具。如果一個項目中存在package.json檔案,那麼使用者可以直接使用npm install指令自動安裝和維護目前項目所需的所有子產品。在package.json檔案中,開發者可以指定每個依賴項的版本範圍,這樣既可以保證子產品自動更新,又不會因為所需子產品功能大幅變化導緻項目出現問題。開發者也可以選擇将子產品固定在某個版本之上。
【參考】
http://www.csdn.net/article/2013-08-28/2816731-absolute-beginners-guide-to-Node.js 專門針對初學者的Node.js教程
https://zh.wikipedia.org/wiki/Npm npm維基百科