原文摘自個人前端博客,歡迎你們來訪問前端
http://www.hacke2.cnjava
第二章 Js概覽
基於GoogleV8引擎
- Object.keys(o)
- 數組方法:遍歷forEach、過濾filter、改變map
- 實現了String.prototype.trim()
- 含有JSON解析
第三章 阻塞與非阻塞IO
單線程注意點
- 當心處理內存中的變量,可能會影響兩次訪問的結果
- 不要編寫阻塞式代碼,可能會影響第二次訪問的時間
事件輪訓
- 先註冊事件
- 不斷詢問這些事件是否已經分發dispatch
- 當事件分發了,相應的回調就會被觸發
- 若是事件未觸發,則繼續執行其餘代碼
- 捕獲將來纔會執行到的函數所拋出的異常是不可能的
- 避免同步IO
第四章 Nodez中的Javascript
global對象
process對象
- process.nextTick == serTimeout(fn,1)
模塊
- require module exports
- NPM
- 絕對模塊指Node內置模塊以及在node_modules模塊require(‘fs’)
- 相對模塊指經過相對路徑找的模塊require(‘./module’)
- 暴漏數據exports.a(多個)、重寫module.exports(一個)
##事件node
- EventEmitter
- 事件監聽 on,事件分發emit,事件移除removeListener
- 只執行一次once
- data事件 數據是部分到達,而不是一次性全到達返回給你
buffer
第五章CLI &FS API
Stream
- stdin 可讀流 stdout/stderr可寫流
- stdin.resume 等待用戶輸入
- console == process.stdout.write(str + ‘\n’)
fs
- readdirSync(__dirname) readFileSync同步
- readdir(‘.’, async) readFile 異步
- createReadSteam 讀取可變大小 有data、end事件多用於圖片、大型文件等
- watchFile監視文件是否改變
process
- process.argv 運行的參數
- process.cwd 獲取當前工做目錄
- process.env 環境變量
- process.exit退出
- 信號量
第六章TCP
TCP
- 面向鏈接,基於IP協議
- IP協議發包無序,TCP給發送的IP包含了標示符和數據流順序信息
- 面向字節 對字符以及字符編碼徹底無知,很好的靈活性
- 可靠性 三次握手、窗口時間重發
- 流控制,對接收和發送的速度控制
- 擁堵控制 避免擁堵、數包報的延遲率和丟包率不會過高
Telnet
- 當不是telnet協議是自動降級爲TCP
- 發送GET /HTTP/1.1模擬瀏覽器請求,兩次回車
net
- Node.js核心TCP模塊
- data close end事件
- conn.setEncoding(‘utf-8’) 或 Buffer.toString(‘utf-8’)
- 服務端createServer 客戶端connect方法 connect事件
第七章HTTP
HTTP
- TCP上層協議
- Content-Type類型 文本、HTML、XML、JSON、PNG
- Transfer-Encoding: chunked 輸出的內容長度不能肯定,Node天生的異步機制, 這樣相應能夠逐造成
- 301 永久轉移 302 臨時轉移 304資源未改變 403未受權 404資源未找到
- 表單Content-Type application/x-www-form-unencoded
http 模塊
- request、response 參數
- 判斷路由爲method+url
- querystring模塊 將字符串解析成對象
- request方法模擬一個請求,傳回來的數據2進制,設置utf-8
- superagent 模擬客戶端(模擬一個請求)模塊
- up 重啓服務器模塊
第八章Connect
工具集&中間件
- 模塊:connect
- 中間件調用server.user(...)
- 日誌中間件console.log(‘%s %s ’, req.method, req.url)
- 模擬請求時間過長中間件,在res.end是清除定時器
- static中間件 處理靜態文件connect.static(‘..’)
- query中間件 獲取查詢字符串connect.query
- logger 中間件connect.logger(‘dev’)
- body parser中間件connect.bodyParser()若是在POST使用了JSON格式,body parser自動轉JSON對象,還能夠處理用戶上傳文件req.body.file多文件表單name 使用name=」file[]」
- seesion中間件 會話connect.session 使用方法req.session.user
- redis session 會話持久化中間件
- methodOverride 中間件 讓低版本瀏覽器支持PUT、DELETE、PATCH
- basicAuth中間件 用戶身份驗證
第九章EXPRESS
express
- WEB應用開發框架,基於Connect
- app.set(‘view engine’, ‘ejs’) 設置EJS模板引擎
- app.set(‘view’, __dirname + ‘/view’) 設置視圖層路徑
- app.set(‘view cache’, ‘true) 設置模板緩存
- 使用app.get()、app.put()、app.post()配置路由,可傳參數如:id,獲取req.params.id
- res.render(‘search’,obj) 渲染模板
- 其餘設置大小寫敏感、嚴格路由、jsonp回調
- 爲res和req提供了快捷方法 render渲染、redirect重定向req.header檢查頭信息
- 中間件 app.user(function(req, res, next){})
- 代碼組織 分層、分包、MVC,建議仿照Spring MVC
模板引擎
Express/Haml/Jade/CoffeeKup/JQuery Templates for nodegit
#第十章WebSocketweb
Ajax
- 異步javascripy
- 缺陷;每次都創建HTTP請求,消耗網絡資源,不適於實時服務 HTML5 WebSocket
- 基於ws協議
- node支持:websocket.io
- 客戶端new WebSocket
缺陷
- 關閉不意味着斷開,使用心跳檢測機制判斷
- 對JSON支持不夠友好
- 客戶端臨時斷開沒法解決 使用定時器或者刷新頁面?
- 兼容性
第十一章Socket.io
優點
- 跨瀏覽器,支持WebSocket則原生,不支持使用長鏈接方式,鏈接會持續打開 20-50s
- 即便瀏覽器支持的WebSocket被代理或者防火牆禁止了,Socket.io仍然會經過其 他技術來解決
- 若是客戶端中止傳輸信息,而且必定時間沒有正常的關閉,則認爲鏈接已經斷開
- 當鏈接丟失時,自動重連
- 對邏輯進行分層,有命名空間
- 支持emit分發和listen監聽事件
第十二章MongoDB
MongoDB
- 面向文檔,絕大多數狀況是JSON
- 鏈接 new mongodb.Server(‘127.0.0.1’, 27017)
- API open insert find ensureIndex findOne
- $set 設置 $push 推入數組
Mongoose
- 相似於JAVA中ORM框架,簡化數據庫開發
- 鏈接mongoose.connect(‘mongodb://localhost/database’)
- Schema:一種以文件形式存儲的數據庫模型骨架,不具有數據庫的操做能力
- Model: 由Schema發佈生成的模型,具備抽象屬性和行爲的數據庫操做對
- Entity:由Model建立的實體,他的操做也會影響數據庫
- index 索引 title : {type : String, index : true} unique : true 惟一
- new Schema({}).pre(‘save’, function(){})保存以前作一些處理
- 經常使用API find,findOne,remove,update,count
- new Schema({}).find({_id:‘xx’}).where(‘title’,‘xxx’).sort(‘content’, -1).limit(5).run(function(err, data){}) 相似JQ查詢
- .select(‘_id’, ‘name’)選擇查詢指定字段
- .skip 跳過 mongoose.Schema.ObjectId 生成隨機ID
- clazz : [Clazz] 嵌套的Sehema
- clazz: {type : ObjectId , ref: ‘Clazz’} 關聯查詢
- 添加靜態PersonSchema.statics.findByName經過model調用
- 添加實例方法 PersonSchema.methods.findSimilarTypes Entity調用
第十三章MySQL
MySQL
- 主要使用query執行SQL
- 有佔位符 ? 插入數據(和JAVA同樣)
- 使用seqelize Node版ORM框架
第十四章Redis
Redis
- 應用場景:簡單數據模型、數據集。適合存儲在內存
- seesion持久化
第十五章 代碼共享
書寫兼容性代碼
(function(module){
module.exports = function(a, b ){
return a+b;
}
If(‘undefined’ != typeof window) {
Window.add = module.exports;
}
})(‘undefined’ == typeof module ? {module : {exports : {}}}: module)redis
- 模擬實現ECMA:擴展原型或者實現工具函數
- EventEmitter。Assert、XMLHttpRequest、DOM、WebSocket、node-canvas都在 git上有實現
- bowserbuild 將node模塊轉爲瀏覽器可識別的代碼
第十六章測試
assert
- 經常使用API ok,be/equal/eql/a/macth...
Mocha