SlideShare a Scribd company logo
深入淺出NODE.JS
大綱
• Node.Js的由來
• Node.Js的特性
• Node.Js的Get Start
• JavaScript引擎: V8
• Node.Js實務
• Node.Js最佳實務
• 總結
• 起因是Ryan想要做出網頁檔案上
傳時正確的顯示進度。
• 2009年,Node.Js專案正式啟動並公
開。
• Joyent公司延攬Ryan。
• 2011年Joyent與微軟協同開發微軟
版Node.Js。
• 2012年Ryan交棒給Isaac開發npm。
NODE.JS的由來
Ryan Dahl
NODE.JS的官網
NODE.JS的特性
• 跨平台
• Node.Js可以跨越Linux/Windows/OSX
• 高I/O效能
• 作為網頁伺服器,其效能較Apache/IIS佳
• 繼承Js的良好部份
• 動態型別
• 事件驅動
• 單執行緒
• 已具備生態系
NODE.JS 的架構堆疊圖
Node Standard Library
Node bindings
V8
非同
步
(libeio)
Event
Loop
(libev)
C
JavaScript
• Node.Js頂層為Core JavaScript
• 底層部份由各種Lib實際關鍵功能
• V8: JavaScript編譯器
• Libeio: 處理非同步I/O
• Libev: 達成事件驅動
跨平台
• 撰寫跨平台的Node.Js首先要注意的是每種O.S.都有自己的檔案路徑表示法。
• 可以到官網依O.S.下載Node.Js
高I/O效能
• Node.Js屬Non-Blocking的程式語言
• 底層採用Google V8的引擎,並且轉譯成組合語言執行。
繼承JS良好的部份
• 動態型別(Dynamic Type)
• 可自由擴充物件內容
• 原型鏈(Prototype Chain)
• 可自由組合繼承模型
• 函數導向(Functional Programming)
• 以函數處理反覆的邏輯
• 閉包(Closure)
• 避開變數的污染
事件驅動
單執行緒
• Node.Js如同JavaScript一般採用單執行緒,但利用Event Loop提高效能。
單執行緒 V.S. 多執行緒
• 單執行緒 + Non-Blocking
• 省去上下文切換(Context-Switch)所帶來的資源成本,配合Non-Blocking提升效
率(Throughput)。
• 多執行緒 + Blocking
• 當API是Blocking式,需額外增生執行緒伴隨著大量的上下文切換,在多核心
伺服器上有好的表現。
• 多執行緒 + Non-Blocking
• 當API是Non-Blocking式,工作執行緒會將任務交遞給I/O執行緒,藉由執行緒
的反覆利用降低超量執行緒所帶來的負面影響。
已具備生態系
NODE.JS的GET START
• Node.js提供相當便利的CLI(Command-Line Interface),可在命令提示字元中操作
Node.Js。
Node.js命令集
第一步: 創建PACKAGE.JSON檔案
以npm init指令創建package.json
第二步:安裝所需套件
安裝套件時,額外指定—save
(此指令會同步package.json)
第三步: 添加INDEX.JS
第四步: 撰寫BUILD語法
添加scrpts中的屬性: start
在值中撰寫啟動命令
第五步: 執行
以npm指令間接呼叫package.json中
Scripts中的start的語法
JAVASCRIPT引擎: V8
• 為Google開發的一款JavaScript引擎
• 特性:
• 使用JIT編譯
• 精確的垃圾回收機制
• 動態式隱藏類別
• 內嵌的屬性快取
編譯器-
靜態類別的處理
• C++/Java等語言對於欄位和方法是利用陣列儲存其內容,並以偏移(Offset)來對應
欄位和方法名稱。
• 欄位和方法的儲存位置,是依類別而定。
• 語言解譯系統只需要利用陣列和偏移量就可以存取某類別的欄位/方法。
編譯器-
動態類別的處理
• 動態類別每個物件都有自己專屬的屬性/方法紀錄表。
• 每一次存取屬性/方法都要檢索該物件的紀錄表。
• 在存取屬性/方法時都要先檢查物件的類別。
• 利用Hash Table來搜尋和查找屬性/方法,並以字串作為鍵(Key)。
• JavaScript沒有類別,在查找Hash Table時無法利用”依類別加速搜尋”。
V8引擎-
使用JIT編譯
• 針對編譯過的程式碼進行快取。
• V8並不會產生中間碼(ByteCode),直接產生機械碼。(速度更快)
• V8的選擇喪失了移殖性和優化的簡易性等優勢。
V8引擎-
精確的垃圾回收
• 採用世代(Generation)式G.C
• 精確GC會壓縮(Defrag)空間,但由於V8不使用Token Handler所以在搬移物件時會
採用複製,藉此避開Token Handler所造成的間接定址的效能負擔。
V8引擎-
動態式隱藏類別
• 為每個物件建立一個類別並利用表格管理的方式將新建立的類別進行整理。
• 每個物件會依其屬性和方法被指派一個隱藏的類別,當此物件動態新增一個屬
性時,會動態產生一個新的類別並放入管理表格中。
V8引擎-
內嵌的屬性快取
• V8將屬性/方法如同靜態類別語言的編譯器一樣存放在陣列中,利用偏移量存取
指定的屬性/方法。
• V8因為具有隱藏類別,故,本質式已經類似於靜態類別語言,因此可以採用靜態
類別語言編譯器在屬性/方法查找的優化方法。
NODE.JS實務
• 在Node.Js開發前先準備好所需工具。
先準備好IDE
• Node.Js可以選擇以下IDE:
Sublime Text Editor Atom Brackets
Chocolat
CodeRunner WebMatrix
WebStorm Coda 2
Expresso Komodo IDE Cloud9 IDE Visual Studio
思考要做的東西
• 什麼伺服器?
• Web/Socket/DNS…
• 系統的複雜程度?
• 幾人協同開發?
• 測試?
需要什麼伺服器
• Node.Js本身可以成為伺服器,而在撰寫程式時,除了設計商業邏輯之外,仍需要
自行打造出所需要的伺服器(or 使用套件)
• Node.js本身可以成為以下伺服器:
• Http Server
• Socket Server
• DNS Server
系統的複雜程度
• 隨著系統的複雜程度增加,開發Node.Js的複雜程度將以非線性成長。
• Node.Js主要開發語言是JavaScript,故,JavaScript中不好的部份也囊括在其中,若
沒有避開這個部份,將使開發節奏停滯。
• JavaScript是動態語言,在型別定義上並不嚴謹,可以配合TypeScript解決此一問題。
協同開發
• 當有多人協同開發時,建議可以將工作拆分為:
• Server(i.e. 或是用套件)
• BL
• Data Access
• View(i.e. 如果是Web類)
測試
• Node.Js中最著名的測試套件 – Mocha
• 支援多種Assert套件
• 允許以多種方式匯出結果
• Mocha可達成的開發模式:
• BDD
• TDD
MOCHA的範例
• 藉由describe的方式確立測試方向
• It是測試預期的行為/結果
• Assert是判定實際處理結果是否符合預期
最佳實務
• 最佳實務適用於開發中小型系統,對於超大型系統Node.Js仍有天生的弱勢。
• 適合多人協作開發。
• 最佳實務從幾個面向討論:
• 定義Tier/Layer
• 錯誤處理
• 程式結構
定義TIER/LAYER-
模組化
• Node.js遵守CommonJS規範,故,其具備高度移殖功能。
• CommonJS的目標是為了達成JavaScript在非前端系統的可移殖性。
• Node.Js自身實現了require方法作為其引用模組的方法,同時NPM也基於
CommonJS定義的套件規範,實現了相依性管理和模組自動安裝等功能。
定義TIER/LAYER-
模組化實做
模組實現:
模組引用:
定義TIER/LAYER-
思路
• 在分層時要先確立要做的是什麼伺服器,而該伺服器的傳輸協定的特性是什麼。
• Node.Js本身絕大多數的API是非同步/事件驅動,分層時要小心這個特性。
• TCP協定在實做多採用事件驅動,而Node.Js本身就是事件驅動。
• 系統規模大小與協作人數的確立。
• 確立系統要優先注重的品質因子排序。
定義TIER/LAYER-
檔案結構
• /models
• 包含所有ORM所需要的模型
• /views
• 包含所有可置換的頁面內容
• /public
• /assets/images: 圖檔
• /assets/pdf: 靜態pdf檔
• /css: css檔
• /js: 前端js檔
• /controllers
• 所有route
• /spec
• 包含所有BDD測試的規格
架構思維
• Mobile
• 穿戴式裝置
• 網際網路相關
• 響應式頁面
• 針對裝置進行內容微調
• 針對效能進行內容快取
• 藉由分析和觀查使用者行為施行使用者
個人化服務
• 服務層的聚集與協作
• 提供服務檢索
• 依資料協定做資料轉型
• 現存的資料/服務系統
• 外部第三方服務
Client層
Delivery層
Aggregation層
Service層
RESTFUL範例-簡易版
原始碼:
結果:
RESTFUL範例-資料庫
資料查詢的邏輯放在API的函數本體內,會造成
未來程式碼維護的負擔。
RESTFUL範例-資料庫‧改
將資料處理的程式碼移置另一個檔案中,其參數是一個回呼函數,並提供錯誤處理
SEQUELIZE套件-定義MODEL
Sequelize具有自動產生Table和關聯及鍵值的能力,但是仍無法自動產生DB
SEQUELIZE套件-新增&查詢
Sequelize在方法呼叫上允許採用Promise的鏈式呼叫
錯誤處理
• 因為Node.Js的非同步特性,因此,過去在其它高階語言的錯誤處理並不適用於
Node.Js。
謬思- TRY/CATCH
• Node.Js是非同步,故,當在主控制流程以Try/Catch環繞可能的錯誤區塊時,錯誤發
生時,會發現Try/Catch毫無作用。
• Node.Js採用事件導向機制;在錯誤處理方面應該採用這兩種方式去實踐。
沒意義ˇ
NODE.JS的ERROR物件屬性
• Stack: 發生此Error的完整呼叫堆疊
• Inner:
• Stack: 巢狀內部Error物件的完整呼叫堆疊
• Message: 巢狀內部Error物件挾帶的錯誤訊息
• Serverity: 錯誤嚴重層級
• Message: 錯誤訊息
• Code: 錯誤代碼
NODE.JS該怎麼處理錯誤
• 拋出Error物件
• throw new Error(‘~~’)
• 採用事件機制
• 傳遞Error物件到Callback函數中
程式結構
• 程式碼結構重在可讀性,由此延伸到可維護性
• Node.Js在撰寫上很容易出現巢狀式Callback結構
套件:ASYNC
• 提供巢狀callback這類流程控制的一個解套的方案。
• Async提供了超過20個函數。
• 除了Node.Js之外,也支援前端使用。
ASYNC常用函數(一) – 集合
函數 描述
Each 如果對同一個集合中所有元素都執行同一個異步操作。
Map 對集合中的每一個元素,執行某個非同步操作,得到結果。而所有的結
果都將匯總到最終的callback裡。
與Each的區別是:Each只關心操作而不管最終結果,而Map關注的是最終
結果
Filter 使用非同步操作對集合中的元素進行篩選,要注意的是,iterator的callback
僅支援一個參數,且只能接收true/false。
Reject Reject與Filter剛好相反,當測試為true時則拋棄。
Reduce 先設定一個初始值,用它與集合中每一個元素做運算,
Detect 用於取得集合中滿足條件的第一個元素
SortBy 對集合中的元素排序,由小到大排序
Some 當集合中是否有至少一個元素滿足條件,最終的callback得到值為true,反
之為false
Every 如果集合中每一個元素都滿足條件,則最終callback得到值為true,反之為
false
Concat 將多個非同步操作結果合併為一個值陣列。
ASYNC常用函數(二) – 流程控制 – PART1
函數 描述
Series 循序執行,一個函數陣列中的每個函數,每一個函數執行完畢後才能
執行下一個函數。
Parallel 平行執行多個函數,每個函數都是立即執行,不需要等待其它函數執
行完畢,傳遞給最終callback的陣列中的資料會依照tasks中宣告的順序。
Whilst 相當於While操作,但其中的非同步操作將在完成後才會進行下一次
循環
doWhilst 相當於do~While,doWhilst交換了fn/test的位置,先執行一次再作test判斷
Until 與whilst相反,當test為false才執行
doUntil 與doWhilst相反,當test為false才執行
Forever 只要內部不發生錯誤,就會無限執行
Waterfall 依順序依次執行一組函數,每個函數的結果值都將傳遞給下一個函
數
Compose 建立一個囊括一組非同步函數的函數集合,每個函數會消費
applyEach 對函數陣列中每個函數傳遞相同的參數,透過callback回傳。如果只
回傳第一個參數,將回傳一個函數物件,可以傳參考呼叫之。
ASYNC常用函數(二) – 流程控制 – PART2
函數 描述
Queue 為一訊息佇列,透過限制worker數量,若已用罄則將新的訊息放入佇
列
Cargo 與Queue類似;與之不同之處在於要等到任務單元全數執行完畢
worker才會再取新的任務單元
Auto 用來處理有依賴關係的多個任務的執行
Iterator 將函數陣列包裹成Iterator;會執行陣列中第一個函數並回傳第二個
函數以供呼叫。
Apply 使用一個函數包裹多個函數
nextTick 定義好函數後,函數會在下一個事件輪詢中執行
Times 非同步執行,times可以指定呼叫次數,並將結果放入陣列中回傳
timesSeries 與time類似,唯一不同之處是同步
ASYNC常用函數(三) – 工具
函數 描述
Memoize 紀錄函數參數與運算結果,當參數重覆就直接取得結果
Log 執行某非同步函數,並紀錄它的回傳值,日誌輸出
Dir 與log類似,不同之處在於呼叫的是console.dir()函數,顯示為DOM View
noConflict 若已定義過async變數,會把之前的變數保存,然後覆蓋,僅在前端有
用
深入淺出Node.JS

More Related Content

PPTX
ASP.Net MVC Framework
PPTX
Team Foundation Server
PPTX
架構設計-資料存取的選擇
PPTX
Asp.net core v1.0
PPTX
浅谈电商网站数据访问层(DAL)与 ORM 之适用性
PPTX
React js
PPTX
Full stack-development with node js
PPTX
SQL Server效能調校
ASP.Net MVC Framework
Team Foundation Server
架構設計-資料存取的選擇
Asp.net core v1.0
浅谈电商网站数据访问层(DAL)与 ORM 之适用性
React js
Full stack-development with node js
SQL Server效能調校

What's hot (20)

PPTX
Redux+react js
PPTX
20120613联动优势数据访问层DAL架构和实践4(刘胜)最新特性
PPTX
DDD系統分析
PPT
大规模网站架构
PDF
豆瓣数据架构实践
PPTX
ASP.Net WebAPI經驗分享
PPTX
云梯的多Namenode和跨机房之路
PDF
基于MySQL的分布式数据库实践
PPTX
分布式缓存与队列
PDF
Big Data, NoSQL, and MongoDB
PPT
新浪微博分布式缓存与队列-2013版
PDF
新浪微博Feed服务架构
PPT
新浪微博redis技术演化
PPTX
大规模数据库存储方案
PDF
D baa s_in_xiaomi
PDF
一个 Mongodb command 的前世今生
PPTX
開放原始碼 Ch2.4 app - oss - db (ver 1.0)
PPTX
高性能队列Fqueue的设计和使用实践
PDF
Leveldb background
PPTX
ASP.NET 5 快速入門 (Getting Started ASP.NET 5)
Redux+react js
20120613联动优势数据访问层DAL架构和实践4(刘胜)最新特性
DDD系統分析
大规模网站架构
豆瓣数据架构实践
ASP.Net WebAPI經驗分享
云梯的多Namenode和跨机房之路
基于MySQL的分布式数据库实践
分布式缓存与队列
Big Data, NoSQL, and MongoDB
新浪微博分布式缓存与队列-2013版
新浪微博Feed服务架构
新浪微博redis技术演化
大规模数据库存储方案
D baa s_in_xiaomi
一个 Mongodb command 的前世今生
開放原始碼 Ch2.4 app - oss - db (ver 1.0)
高性能队列Fqueue的设计和使用实践
Leveldb background
ASP.NET 5 快速入門 (Getting Started ASP.NET 5)
Ad

Similar to 深入淺出Node.JS (20)

PDF
Noder eyes for frontend guys
PDF
Node.js從無到有 基本課程
PPTX
All about NodeJS
PPT
Node分享 展烨
PDF
北護樂學程式冬令營 2017
PDF
NodeJS基礎教學&簡介
PPTX
猴子也能懂的Node.js
PPTX
快速入坑 Node.js - 0613 SITCON 雲林定期聚
PPTX
Nodejs introduce - using Socket.io
PDF
Node.js 入門 - 前端工程開發實務訓練
PDF
KSDG meet-up #1
PDF
Node js实践
PDF
Node.js 進攻桌面開發
PDF
Introduction to NodeJS
PPTX
前端自動化工具
PPT
课题二:Node.js那些事儿
PDF
COSCUP 2010 - node.JS 於互動式網站之應用
PDF
D2_node在淘宝的应用实践_pdf版
PPT
Node.js在淘宝的应用实践
PDF
Node.js Quick Tour
Noder eyes for frontend guys
Node.js從無到有 基本課程
All about NodeJS
Node分享 展烨
北護樂學程式冬令營 2017
NodeJS基礎教學&簡介
猴子也能懂的Node.js
快速入坑 Node.js - 0613 SITCON 雲林定期聚
Nodejs introduce - using Socket.io
Node.js 入門 - 前端工程開發實務訓練
KSDG meet-up #1
Node js实践
Node.js 進攻桌面開發
Introduction to NodeJS
前端自動化工具
课题二:Node.js那些事儿
COSCUP 2010 - node.JS 於互動式網站之應用
D2_node在淘宝的应用实践_pdf版
Node.js在淘宝的应用实践
Node.js Quick Tour
Ad

More from 國昭 張 (20)

PPTX
8th ddd taiwan study group bounded context integration
PPTX
Ddd(meetup 2) ddd with clean architecture
PPTX
20190126 ddd-meetup1
PPTX
事件風暴-設計衝刺
PPTX
事件風暴-領域建模
PPTX
單元測試
PPTX
Docker實務
PPTX
Scrum essential
PPTX
Docker進階探討
PPTX
PPTX
Docker基礎
PPTX
DDD架構設計
PPTX
DDD引導
PPTX
前端測試
PPTX
Asp.net core v1.0
PPTX
例外處理與單元測試
PPTX
NoSQL-MongoDB介紹
PPTX
Linq初階
PPTX
Linq實戰
PPTX
Entity Framework實戰
8th ddd taiwan study group bounded context integration
Ddd(meetup 2) ddd with clean architecture
20190126 ddd-meetup1
事件風暴-設計衝刺
事件風暴-領域建模
單元測試
Docker實務
Scrum essential
Docker進階探討
Docker基礎
DDD架構設計
DDD引導
前端測試
Asp.net core v1.0
例外處理與單元測試
NoSQL-MongoDB介紹
Linq初階
Linq實戰
Entity Framework實戰

深入淺出Node.JS