前語:nodeJs這書早在五月份的時候就已經買了,那時候纔剛剛接觸node,本想着這書應該是node入門級比較系統化的書,可翻了幾頁以後呢,發現好多地方都晦澀難懂,特別是看到內建模塊的C++實現時,瞬間有想瞌睡的感受....-_-從這以後,這書一直被我閒置在書桌角落,再無動過,看書學習node的想法就這樣放棄了,轉爲上網學習基礎的語法API..就這樣,邊看API邊跟着作一些小例子,慢慢的,發現基本的API用法都已經掌握了,因而,去搜搜與node有關的一些技術博客,但願可以進階去了解node。開始去嘗試用node作一些完整的小例子,好比簡單的博客實現,聊天室...就這麼過了兩個月左右,發現對node的瞭解基本上已經算是有了一個全面大體的認識了,全部的知識點都瞭解得差很少了,因而開始着手去實現一個簡單的訂餐app,在此以前,爲了可以強化全部知識點以便順利完成服務器端的編寫,再一次翻開了那本稍有些許灰塵的<<深刻淺出nodeJs>>,這一次,沒有了初次的那種陌生羞澀感,有的只是對現有知識體系的擴充與強化,那麼,我將用本身的語言來將這本書中的重要知識點一一記下來....javascript
第一章 概述前端
node的起源及基本做用java
node的特色:node
一、異步I/O (發送請求與處理請求互不干擾)linux
$.POST(URL,function(data){ console.log('成功收到'); }) console.log('發送成功');
二、事件與回調函數(node是事件驅動的)c++
var http = require('http'); http.createServer(function(req,res){ var postData = ""; req.setEncoding('url8'); req.on('data',function(trunk){ postData += trunk; }); req.on('end',function(){ res.end(postData); }); }).listen(8080); console.log('服務器正在運行');
三、單線程npm
優點:資源合理分配利用,避免了多線程上下文切換時的開銷,性能更佳json
劣勢:後端
- 沒法利用多核CPU數組
- 單一線程某處一旦出現錯誤,將致使整個線程退出
- 大量計算佔用CPU致使沒法繼續調用異步I/O
四、共享平臺 (linux和window)
node的應用場景:
一、I/O密集型
二、分佈式應用
第二章 模塊機制
node是基於javascript,而javascript自己又是有許多先天不足的,並且它的使命是爲了服務客戶端,對於服務器端的支持 (模塊系統,標準庫,標準接口,缺少包管理系統),簡直就是不了了之,根本就不在乎.好在,CommonJS規範面世了,它的使命就是 但願Javascript可以在任何地方運行.
commonJS對模塊的定義有三個部分,分別是:一、模塊引用 二、模塊定義 三、模塊標識
-require
-exports
-module
一、模塊引用:
var math = require ('math');
二、模塊定義:
//math.js exports.add = function (){ var sum = 0; while (sum < 10){ sum += 1; } return sum; }
而後經過,require來引入模塊,就能夠調用定義的屬性和方法了.require == exports
三、模塊標識:
傳遞給require方法的參數 , 字符串或路徑
2.2 Node的模塊實現
在Node中引入模塊,經歷三個步驟:
(1) 路徑分析
-- 核心模塊 , fs http
-- 文件模塊 , .或者..開始的相對路徑文件模塊
-- 以/開頭的絕對路徑模塊
-- 非路徑形式的內建模塊,如自定義的connect模塊
(2) 文件定位
-- 按路徑
-- 按後綴名, .js 、.node 、.json
(3) 編譯執行
-- javascript 核心模塊,經歷標識符分析後,直接定位到內存中,比普通的文件模塊從磁盤中查找要快得多
-- c++內建模塊,二進制、數組、內存,使用Binding()方法來協助加載內建模塊
如何編寫: NODE_MODULE()最底層 --> process.binding 定義到內存中
如何導出:層級依賴關係,內建c++ --> 核心模塊Javascript --> 文件模塊
2.3 包與NPM
模塊組織代碼,包組織模塊
package.json描述文件,dependencies:依賴的包列表
發佈包, npm publish <folder>
2.4 先後端共用模塊
先後端模塊的側重點不一樣。前端須要重服務器加載,用到了異步加載模塊,後端的模塊都存在本地,用到了同步加載。
CommodJs規範:同步模式,適用後端
AMD規範:異步模式,適用前端
CMD規範:國人自創,前二者的結合體,加載和定義相似AMD,模塊導出和引入接近CommonJs規範的定義
兼容多種規範的定義:
爲了讓同一模塊能夠在先後端運行,實現以下:
// 將hello 方法定義到不一樣的運行環境中
(function(name,definition){ // 檢測上下文環境是不是 AMD 或者 CMD var hasDefine = typeof define === 'function'; // 檢測上下文環境是不是Node var hasExports = typeof module !=='undefined' && module.exports; if(hasDefine){ // AMD CMD define(definition); }else if(hasExports){ // Node module.exports = definition(); }else{ // 將模塊的執行結果掛在window變量中,在瀏覽器中this指向window對象 this[name] = definition(); } })('hello',function(){ var hello = function(){} return hello; });