書由淺入深,、系統(tǒng)地介紹了Node.js開發(fā)技術。書中提供了大量有針對性的實例,供讀者實踐學習,同時提供了大量的實踐練習題及詳盡的解答,幫助讀者進一步鞏固和提高。本書重在代碼實踐,閱讀時應多注重實踐編程。本書提供8小時配套教學視頻及實例源代碼下載,便于讀者高效、直觀地學習。
本書共分為11章。涵蓋的主要內容有:Node.js的概念、應用場景、環(huán)境搭建和配置、異步編程;Node.js的模塊概念及應用、Node.js的設計模式;HTTP簡單服務的搭建、Node.js靜態(tài)資源管理、文件處理、Cookie和Session實踐、Crypto模塊加密、Node.js與Nginx配合;UDP服務器的搭建、Node.js與PHP之間合作;Node.js的實現(xiàn)機制、Node.js的原生擴展與應用;Node.js的編碼習慣;Node.js操作MySQL和MongoDB;基于Node.js的Myweb框架的基本設計架構及實現(xiàn);利用Myweb框架實現(xiàn)一個簡單的Web聊天室;在線聊天室案例和在線中國象棋案例的實現(xiàn);Node.js的日志模塊、curl模塊、crontab模塊、forever模塊、xml模塊和郵件發(fā)送模塊等應用工具。
本書非常適合從事編程開發(fā)的學生、教師、廣大科研人員和工程技術人員研讀。建議閱讀本書的讀者對JavaScript的語法和PHP的相關知識有一定的了解。當然,如果你是初學者,本書也是一本難得的參考書。
騰訊Web前端工程師揭秘原生Node.js的開發(fā)實踐,不借助任何第三方框架,通過編寫原生代碼,講解Node.js應用開發(fā)
深入詳解Node.js原生文檔,根據(jù)原生API實踐和大量應用實例,詳細分析Node.js的開發(fā)過程,了解原生Node.js的API應用
涵蓋Node.js基礎知識、模塊與NPM、Web應用、UDP服務、異步編程思想、異常處理過程、操作數(shù)據(jù)庫的方法、框架開發(fā)與應用、開發(fā)工具等
注重實踐,430多個代碼小示例、30多個編程實踐練習題及解答、5個大型系統(tǒng),贈送8小時教學視頻(需下載)
推薦閱讀(請點叢書鏈接查看)
《網頁制作與網站建設實戰(zhàn)大全+JavaScript網頁特效實例大全+DIV+CSS網頁樣式與布局實戰(zhàn)詳解(套裝全3冊)》
《Highcharts網頁圖表制作實例詳解》
《HTML 5移動Web開發(fā)實戰(zhàn)詳解》
《Xamarin iOS移動開發(fā)實戰(zhàn)》
《Swift入門很簡單》
《iOS編程實戰(zhàn)寶典》
《iOS開發(fā)范例實戰(zhàn)寶典(基礎篇)》
《iOS開發(fā)范例實戰(zhàn)寶典(進階篇)》
黃丹華,騰訊公司Web前端工程師。專注于PHP與Node.js的開發(fā)與應用。較早時間就開始關注Node.js的發(fā)展,并系統(tǒng)地學習和研究了國內外大量的Node.js學習資料。獨創(chuàng)Mywebl.0的Node.js框架,目前正在開發(fā)Myweb2.0的Node.js框架。自營chinaNode.js微信公眾賬號,通過公眾賬號給國內外Node.js愛好者提供一個學習交流的平臺。個人技術博客中提供的Node.js入門、資源分享和Nde.js異常分析等文章,被眾多的Node.js愛好者所認可。
第1章Node.js基礎知識
1.1概述
1.1.1Node.js是什么
1.1.2Node.js帶來了什么
1.2Node.js配置開發(fā)
1.2.1Windows配置
1.2.2Linux配置
1.2.3HelloWorld
1.2.4常見問題
1.3異步編程
1.3.1同步調用和異步調用
1.3.2回調和異步調用
1.3.3獲取異步函數(shù)的執(zhí)行結果
1.4本章實踐
1.5本章小結
第2章模塊和NPM
2.1什么是模塊
2.1.1模塊的概念
2.1.2Node.js如何處理模塊
2.1.3Node.js實現(xiàn)Web解析DNS
2.1.4Node.js重構DNS解析網站
2.1.5exports和module.eXports
2.2NPM簡介
2.2.1NPM和配置
2.2.2Express框架
2.2.3jade模板
2.2.4forever模塊
2.2.5socket.io模塊
2.2.6request模塊
2.2.7Formidable模塊
2.2.8NPM模塊開發(fā)指南
2.3Node.js設計模式
2.3.1模塊與類
2.3.2Node.js中的繼承
2.3.3單例模式
2.3.4適配器模式
2.3.5裝飾模式
2.3.6工廠模式
2.4本章實踐
2.5本章小結
第3章Node.js的Web應用
3.1HTTP服務器
3.1.1簡單的HTTP服務器
3.1.2路由處理
3.1.3GET和POST
3.1.4GET方法實例
3.1.5POST方法實例
3.1.6HTTP和HTTPS模塊介紹
3.2Node.js靜態(tài)資源管理
3.2.1為什么需要靜態(tài)資源管理
3.2.2Node.js實現(xiàn)簡單靜態(tài)資源管理
3.2.3靜態(tài)資源庫設計
3.2.4靜態(tài)文件的緩存控制
3.3文件處理
3.3.1FileSystem模塊介紹
3.3.2圖片和文件上傳
3.3.3jade模板實現(xiàn)圖片上傳展示功能
3.3.4上傳圖片存在的問題
3.3.5文件讀寫
3.4Cookie和Session
3.4.1Cookie和Session
3.4.2Session模塊實現(xiàn)
3.4.3Session模塊的應用
3.5Crypto模塊加密
3.5.1Crypto介紹
3.5.2Web數(shù)據(jù)密碼的安全
3.5.3簡單加密模塊設計
3.6Node.js+INginx
3.6.1Nginx概述
3.6.2Nginx的配置安裝
3.6.3如何構建
3.7 文字直播實例
3.7.1 系統(tǒng)分析
3.7.2 重要模塊介紹
3.8 擴展閱讀
3.9 本章實踐
3.10 本章小結
第4章 Node.js高級編程
4.1 構建UDP服務器
4.1.1 UDP 模塊概述
4.1.2 UDP Server構建
4.2 UDP服務器應用
4.2.1 應用分析介紹
4.2.2 UDP Server端(圖片處理服務器)實現(xiàn)
4.2.3 UDP Client端(Web Server)
4.2.4 Jade頁面實現(xiàn)
4.2.5 應用體驗
4.3 Node.js與PHP合作
4.3.1 UDP方式
4.3.2 腳本執(zhí)行
4.3.3 HTTP方式
4.3.4 三種方式的比較
4.4 本章實踐
4.5 本章小結
第5章 深入Node.js
5.1 Node.js的相關實現(xiàn)機制
5.2 Node.js原生擴展
5.2.1 Node.js擴展開發(fā)基礎V8
5.2.2 Node.js插件開發(fā)介紹
5.3 Node.js異步擴展開發(fā)與應用
5.4 本章實踐
5.5 本章小結
第6章 Node.js編碼習慣
6.1 Node.js規(guī)范
6.1.1 變量和函數(shù)命名規(guī)范
6.1.2 模塊編寫規(guī)范
6.1.3 注釋
6.2 Node.js異步編程規(guī)范
6.2.1 Node.js的異步實現(xiàn)
6.2.2 異步函數(shù)的調用
6.2.3 Node.js異步回調深度
6.2.4 解決異步編程帶來的麻煩
6.3 異常邏輯的處理
6.3.1 require模塊對象不存在異常
6.3.2 對象中不存在方法或者屬性時的異常
6.3.3 異步執(zhí)行的for循環(huán)異常
6.3.4 利用異常處理辦法優(yōu)化路由
6.3.5 異常情況匯總
6.4 本章實踐
6.5 本章小結
第7章 Node.js與數(shù)據(jù)庫
7.1 兩種數(shù)據(jù)庫介紹
7.1.1 MySQL介紹
7.1.2 MongoDB模塊介紹
7.2 Node.js與MySQL
7.2.1 MySQL安裝配置應用
7.2.2 MySQL數(shù)據(jù)庫接口設計
7.2.3 數(shù)據(jù)庫連接
7.2.4 數(shù)據(jù)庫插入數(shù)據(jù)
7.2.5 查詢一條數(shù)據(jù)記錄
7.2.6 修改數(shù)據(jù)庫記錄
7.2.7 刪除數(shù)據(jù)庫記錄
7.2.8 數(shù)據(jù)條件查詢
7.3 Node.js與MongoDB
7.3.1 MongoDB的安裝以及工具介紹
7.3.2 MongOD的啟動運行方法
7.3.3 MongoDB的啟動運行
7.3.4 MongoDB數(shù)據(jù)庫接口設計
7.3.5 數(shù)據(jù)插入
7.3.6 數(shù)據(jù)修改
7.3.7 查詢一條數(shù)據(jù)
7.3.8 刪除數(shù)據(jù)
7.3.9 查詢數(shù)據(jù)
7.4 MySQL與MongoDB性能
7.4.1 測試工具及測試邏輯
7.4.2 MySQL性能測試代碼
7.4.3 MongoDB性能測試代碼
7.4.4 性能測試數(shù)據(jù)分析
7.5 本章實踐
7.6 本章小結
第8章 MyWeb框架介紹
8.1 MyWeb框架介紹
8.1.1 MyWeb框架涉及的應用
8.1.2 MyWeb框架應用模塊
8.2 MyWeb源碼架構
8.2.1 框架MVC設計圖
8.2.2 框架文件結構
8.2.3 擴展閱讀之更快地了解新項目
8.3 框架源碼分析
8.3.1 框架入口文件模塊
8.3.2 路由處理模塊
8.3.3 Model層基類
8.3.4 Controller層基類
8.4 本章實踐
8.5 本章小結
第9章 框架應用MyChat
9.1 編碼前的準備
9.1.1 應用分析
9.1.2 應用模塊
9.1.3 功能模塊設計
9.2 系統(tǒng)的編碼開發(fā)
9.2.1 Model層
9.2.2 Controller層
9.2.3 View層
9.3 項目總結
9.3.1 forever啟動運行項目
9.3.2 系統(tǒng)應用體驗
9.3.3 系統(tǒng)開發(fā)總結
9.4 擴展閱讀之MyWeb 2.0的介紹
9.5 本章實踐
9.6 本章小結
第10章 Node.js實例應用
10.1 實時聊天對話
10.1.1 系統(tǒng)設計
10.1.2 系統(tǒng)的模塊設計
10.1.3 系統(tǒng)編碼實現(xiàn)
10.2 聯(lián)網中國象棋游戲
10.2.1 系統(tǒng)設計
10.2.2 系統(tǒng)的模塊設計
10.2.3 系統(tǒng)編碼實現(xiàn)
10.2.4 系統(tǒng)體驗
10.3 本章小結
第11章 Node.js實用工具
11.1 日志模塊工具
11.1.1 日志模塊介紹
11.1.2 日志模塊實現(xiàn)
11.1.3 日志模塊應用
11.2 配置文件讀取模塊
11.2.1 配置文件解析模塊介紹
11.2.2 配置文件解析模塊實現(xiàn)
11.3 curl模塊
11.3.1 curl模塊介紹
11.3.2 curl模塊實現(xiàn)
11.3.3 curl模塊應用
11.4 crontab模塊
11.4.1 crontab模塊介紹
11.4.2 crontab模塊設計實現(xiàn)
11.4.3 crontab模塊應用
11.5 forever運行腳本
11.5.1 forever運行腳本介紹
11.5.2 forever運行腳本實現(xiàn)
11.5.3 forever運行腳本應用
11.6 xml模塊的應用
11.6.1 xml解析模塊介紹
11.6.2 xml模塊設計實現(xiàn)
11.6.3 xml模塊應用
11.7 郵件發(fā)送模塊應用
11.7.1 郵件模塊介紹
11.7.2 郵件模塊設計實現(xiàn)
11.7.3 郵件模塊應用
11.8 本章小結
第3 章 Node.js 的Web 應用
本章將介紹Node.js 的Web 應用,主要包括HTTP 服務器、Node.js 靜態(tài)資源管理、
Node.js 的文件處理功能、Cookie 和Session 的應用、Node.js 安全加密,介紹Node.js
如何與Nginx 搭檔。
本章將會結合"文字直播Web 應用"來貫穿本章的知識點。文字直播應用是一個長連
接多請求的應用,Node.js 在這方面具有非常大的優(yōu)勢,因此本章使用該例子來介紹本章知
識點。該應用使用Node.js 開發(fā)可以在很大程度上降低服務器壓力,同時給予用戶一個更
好的在線體驗。文字直播Web 應用需求簡單介紹如下。
用戶:直播員(需登錄),游客。
直播方式:直播員登錄后臺,輸入相應的直播信息,可包含圖片和文字。
技術統(tǒng)計:需在線實時記錄運動員數(shù)據(jù)。
游客討論:游客可實時進行在線討論。
微博分享:游客可通過騰訊微博和新浪微博分享直播內容。
3.1 HTTP 服務器
本節(jié)將介紹如何應用Node.js 創(chuàng)建一個HTTP 服務器來處理客戶端的POST 和GET 數(shù)
據(jù)請求,以及服務器端Node.js 如何實現(xiàn)url 路由請求處理。會介紹Node.js 模塊中的
HTTP 和HTTPS。重點是介紹如何實現(xiàn)Node.js 的服務器路由。
3.1.1 簡單的HTTP 服務器
創(chuàng)建一個HTTP 服務器的相關知識點在Node.js 的配置開發(fā)已經有所介紹。應用
Node.js HTTP 模塊中的createServer() API。代碼如下:
var http = require('http');
/ 應用Node.js 的原生模塊HTTP 來實現(xiàn)Web 服務器創(chuàng)建 /
http.createServer(function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World\n');
}).listen(1337, "127.0.0.1");
console.log('Server running at 127.0.0.1:1337/');
http.createServer()接收一個request 事件函數(shù),該事件函數(shù)有兩個參數(shù)request 和
Node.js 開發(fā)實戰(zhàn)詳解
·78 ·
response,request 是 http.ServerReques1的實例對象,response 則為http.ServerRespons2實例
對象。request 對象主要是獲取請求資源信息,包括請求的url、客戶端參數(shù)、資源文件、
header 信息、HTTP 版本、設置客戶端編碼等。Response 對象主要是響應客戶端請求數(shù)據(jù),
包括HTTP 的header 處理、HTTP 請求返回碼、響應請求數(shù)據(jù)等。
http.createServer()調用返回的是一個server 對象,server 對象擁有l(wèi)isten 和close 方法,
listen 方法可以指定監(jiān)聽的IP 和端口。
實例介紹:創(chuàng)建一個HTTP 服務器,獲取并輸出請求url、method 和headers,同時根
據(jù)請求資源做不同的輸出。
當請求'/index',返回200,并且返回一個html 頁面數(shù)據(jù)到客戶端。
當請求'/img',返回200,并且返回一個圖片數(shù)據(jù)。
若為其他情況,則返回404,并輸出'can not find source'。
先創(chuàng)建HTTP 服務器,使用switch 判斷請求資源類型分配。代碼如下:
/ http.js /
var http = require('http'),
fs = require('fs'),
url = require('url');
/ 創(chuàng)建http 服務器 /
http.createServer(function(req, res) {
/ 獲取Web 客戶端請求路徑 /
var pathname = url.parse(req.url).pathname;
/ 打印客戶端請求req 對象中的url、method 和headers 屬性 /
console.log(req.url);
console.log(req.method);
console.log(req.headers);
/ 根據(jù)pathname,路由調用不同處理邏輯 /
switch(pathname){
case '/index' : resIndex(res); // 響應HTML 頁面到Web 客戶端
break;
case '/img' : resImage(res); // 響應圖片數(shù)據(jù)到Web 客戶端
break;
default : resDefault(res); // 響應默認文字信息到Web 客戶端
break;
}
}).listen(1337);
[代碼說明]
var pathname = url.parse(req.url).pathname:獲取客戶端請求路徑。
console.log(req.url):輸出請求url。
console.log(req.method):輸出請求方法。
console.log(req.headers):輸出請求header 信息。
resIndex(res):判斷請求參數(shù)是否為/index,如果是就執(zhí)行resIndex(res)。
resImage(res):判斷請求參數(shù)是否為/img,如果是就執(zhí)行resImage(res)。
resDefault(res):返回404 not find。
1 參考網站nodejs.org/api/http.html#http_class_http_serverrequest。
2 參考網站nodejs.org/api/http.html#http_class_http_serverresponse。
第3 章 Node.js 的Web 應用
·79·
記住要把res 參數(shù)傳遞到處理返回函數(shù),如果需要執(zhí)行HTTP 響應請求時,也必須將
req 傳遞到處理函數(shù)。代碼如下:
/
@desc 創(chuàng)建resIndex 響應首頁html 函數(shù)
@parameters res HTTP 響應對象
/
function resIndex(res){
/ 獲取當前index.html 的路徑 /
var readPath = __dirname + '/' +url.parse('index.html').pathname;
var indexPage = fs.readFileSync(readPath);
res.writeHead(200, { 'Content-Type': 'text/html' });
res.end(indexPage);
}
/
@desc 創(chuàng)建resImage 響應image 函數(shù)
@parameters res HTTP 響應對象
/
function resImage(res){
/ 獲取當前image 的路徑 /
var readPath = __dirname + '/' +url.parse('logo.png').pathname;
var indexPage = fs.readFileSync(readPath);
res.writeHead(200, { 'Content-Type': 'image/png' });
res.end(indexPage);
}
/
@desc 創(chuàng)建resDefault 響應404 函數(shù)
@parameters res HTTP 響應對象
/
function resDefault(res){
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('can not find source');
}
[代碼說明]
resIndex(res)處理并返回'Content-Type': 'text/html'的html 頁面。
esImage(res)處理并返回'Content-Type': 'image/png'的png 圖片。
resDefault(res)處理并返回404 輸出'can not find source'。
執(zhí)行http.js,打開瀏覽器,輸入不同的請求資源,查看和比較不同的返回結果。
node http.js
(1)打開瀏覽器,輸入127.0.0.1:13371,如圖3-1 所示返回了404,并輸出了'can not find
source'。
1 本文輸入的192.168.1.120:1337 為個人的一個測試服務器,和本地服務器IP 地址127.0.0.1:1337
是一致的,讀者輸入的是127.0.0.1:1337。
Node.js 開發(fā)實戰(zhàn)詳解
·80 ·
圖3-1 瀏覽127.0.0.1:1337 返回Web 頁面圖
(2)HTTP 新增請求路徑/index,127.0.0.1:1337/index,如圖3-2 所示返回200,并輸出
index.html 頁面內容。
圖3-2 瀏覽127.0.0.1:1337/index 返回Web 頁面圖
(3)改變HTTP 路徑為/img,127.0.0.1:1337/img,如圖3-3 所示返回200,并輸出了一
個png 的logo 圖片。
圖3-3 瀏覽127.0.0.1:1337/img 返回Web 頁面圖
如圖3-4 所示為服務器端輸出的結果,這里只截取了部分,輸出的結果包含了每次請
求的url,method 和請求headers。可以看到每次HTTP 請求都會自帶一個/favicon.ico 請求,
這個是網頁的ico,是大多數(shù)瀏覽器自我發(fā)出的請求,如果需要去除這個請求,可以設置返
回一個有效的/favicon.ico 文件,并且指定expire 時間。
第3 章 Node.js 的Web 應用
·81·
圖3-4 Node.js 服務器運行流水日志圖
3.1.2 路由處理
了解Node.js 服務器創(chuàng)建功能實現(xiàn)后,接下來介紹根據(jù)不同客戶端的請求資源路徑,
來分配服務器處理邏輯。在3.1.1 節(jié)中已經初步了解到可以使用switch 來實現(xiàn)路由,當然
這是一種路由處理辦法,但是在請求資源非常復雜時,使用switch 來判斷處理就會顯得很
龐大,而且難以維護和擴展。本節(jié)將介紹兩種路由處理方法,大家可根據(jù)自己的想法設計
出更多的路由處理方法,另外在本章的習題1 中還會提供第三種路由處理方法。
1.特定規(guī)則請求路徑
特定規(guī)則請求參數(shù):可以根據(jù)用戶請求的url,依據(jù)特定的規(guī)則得到相應的執(zhí)行函數(shù),
例如請求參數(shù)/index,根據(jù)特定規(guī)則轉化為resIndex(res, req)方法。
這里將HTTP 的請求路徑/index,根據(jù)一定的規(guī)則得到其處理函數(shù)resIndex,當我們需要
新增處理邏輯時,例如/img,則必須在服務器端新增處理函數(shù)resImg。具體實現(xiàn)過程如下:
var param = pathname.substr(2),
// 獲取客戶端請求的url 路徑,并獲取其及時個參數(shù),將其小寫轉為大寫
firstParam = pathname.substr(1,1).toUpperCase();
// 根據(jù)pathname 獲取其需要執(zhí)行的函數(shù)名
var functionName = 'res' + firstParam + param;
response = res;
if(pathname == '/'){
resDefault(res)
} else if (pathname == '/favicon.ico') {
return;
}
else{
eval(functionName + '()');
}
[代碼說明]
firstParam = pathname.substr(1,1).toUpperCase():將參數(shù)的首字母改為大寫,例如
/index,獲取i,并將其改為大寫的I;
Node.js 開發(fā)實戰(zhàn)詳解
·82 ·
functionName = 'res' + firstParam + param:獲取需要執(zhí)行的函數(shù)名,res 為前綴,
firstParam 為首字母,例如/index,firstParam 為I,param 為ndex,因此functionName
為resIndex;
pathname == '/':無參數(shù)時返回default 頁面;
pathname == '/favicon.ico':對于該請求返回空信息;
eval(functionName + '()'):使用eval 執(zhí)行字符串函數(shù)。
該方法有一個很明顯的缺點,就是res 和req 參數(shù)必須設置為全局變量,否則函數(shù)中無
法獲取該res 和req 對象參數(shù)。
這里只是介紹了一種實現(xiàn)方式,可以根據(jù)/param 參數(shù)來判斷需要調用的模塊和函數(shù),
對于小項目而言可以實現(xiàn)這種路由處理。
2.利用附帶參數(shù)來實現(xiàn)路由處理
利用自帶參數(shù)來實現(xiàn)路由處理:url 路徑指定需要執(zhí)行的模塊,通過在HTTP 的url 中
攜帶一個c 參數(shù),表示需要調用的模塊中的方法名,從而實現(xiàn)簡單的路由處理。例如
/image?c=img 表示獲取index 模塊中img 方法,同樣/index?c=index 表示獲取index 模塊中
的index 方法。具體實現(xiàn)是創(chuàng)建client.js 作為服務器模塊,代碼如下:
/ 首先require 加載兩個模塊 /
var http = require('http'),
url = require('url'),
querystring = require("querystring");
/
@desc 創(chuàng)建web 服務器
/
http.createServer(function(req, res) {
/ 獲取用戶請求的url 路徑 /
var pathname = url.parse(req.url).pathname;
if (pathname == '/favicon.ico') { // 過濾瀏覽器默認請求/favicon.ico
return;
}
/ 根據(jù)用戶請求的url 路徑,截取其中的module 和controller /
var module = pathname.substr(1),
str = url.parse(req.url).query,
controller = querystring.parse(str).c,
classObj = '';
try { // 應用try catch 來require 一個模塊,并捕獲其異常
classObj = require('./' + module);
}
catch (err) { // 異常錯誤時,打印錯誤信息
console.log('chdir: ' + err);
}
if(classObj){ // require 成功時,則應用call 方法,實現(xiàn)類中的方法調用執(zhí)行
classObj.init(res, req);
classObj[controller].call();
} else { // 調用不存在的模塊時,則默認返回404 錯誤信息
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('can not find source');
}
}).listen(1337);
第3 章 Node.js 的Web 應用
·83·
[代碼說明]
var pathname = url.parse(req.url).pathname:獲取客戶端的HTTP 請求路徑,也就是
請求模塊;
controller = querystring.parse(str).c:獲取請求參數(shù)c,也就是請求模塊的方法;
classObj = require('./' + module):使用try catch 獲取一個require 模塊;
本書從實踐出發(fā),一步步地引領讀者深入學習Node.js的原生Web開發(fā)技術。書中的一些案例分析來自于作者的開發(fā)實踐,有很強的實用性和指導意義。總之,本書對于Node.js愛好者來說是一本非常有價值的參考書,值得閱讀。
——騰訊國際業(yè)務部社區(qū)平臺開發(fā)總監(jiān)劉志浩
本書高屋建瓴地闡述了Node.js的理論知識,又深入淺出地介紹了其技術細節(jié),談及的編程技巧可謂波譎云詭,而其應用實踐更是變幻莫測。總之,筆觸簡練深沉,力透紙背,行文如流水,讀來酣暢淋漓,全文一氣呵成,渾然一體,實乃作者扛鼎大作,亦屬業(yè)界佳品。
——騰訊公司后臺開發(fā)工程師 王震
本書結合工作項目,帶你領略一番JavaScript在服務器端的英姿,內容涵蓋了Node.js的精髓,很多內容是作者在項目應用中的成果。可以說,本書是當前市場上最為詳細而實用的一本Node.js開發(fā)圖書。
——騰訊公司CDG前端開發(fā)工程師 郭湃欽
本書就像描述一段曠世奇戀,隨著劇情的深入,每個人心中的記憶之門都在無意中被打開,而書中一個驚人的秘密也隨之被揭開:原來Node.js技術在騰訊帥哥工程師的筆下居然是如此引人入勝,相見恨晚。
——騰訊公司博學測試工程師吳曉丹
臟
不錯
太貴了,做這行沒辦法,讀起來還行
應該是放久了,有些舊
很有實用學習價值
不錯
買回來收藏的
紙質好。
挺好的,當當?shù)臇|西還是值得信任.就是物流方面需要加強點.
不錯,物流快。
嗯,不錯很喜歡
很好
評論有積分賺哦
不錯的一本書
例子挺多的,可以好好學習參考一下
包裝太差勁,一個角都裂開了
非常好的一本書,推薦閱讀!
書很好 發(fā)貨超快 閃速
喜歡,整體感覺不錯,包裝也很好
性價比高,是正版書,推薦購買。
好書好書,幫朋友買的
很不錯的書,斷斷續(xù)續(xù)看了部分,性價比高!
內容很好就是書中有錯誤不知道是印刷錯誤還是盜版,目前閱讀到17頁發(fā)現(xiàn)的一個錯誤
寫的很詳細
書的質量還可以,內容還沒有開始看。就是剛收到貨封皮就掉了,我也是真心醉了。
書的內容不錯 例子也很實用 只不過 node. js發(fā)展太快 版本不同一些代碼的寫法也不同了 。需要自己結合網上查的資料來學習
網上盛傳好,還沒有看多少。但是作者的精神而言應該錯不了的。書很大氣,很好。
用來學習前端知識— —知乎看到推薦買的,就買來了!