狠狠撸

狠狠撸Share a Scribd company logo
深入浅出狈翱顿贰.闯厂
大綱
? 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可以跨越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 痴8的引擎,并且转译成组合语言执行。
繼承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),直接產生機械碼。(速度更快)
? 痴8的选择丧失了移殖性和优化的简易性等优势。
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中不好的部份也囊括在其中,若
沒有避開這個部份,將使開發節奏停滯。
? 闯补惫补厂肠谤颈辫迟是动态语言,在型别定义上并不严谨,可以配合罢测辫别厂肠谤颈辫迟解决此一问题。
協同開發
? 當有多人協同開發時,建議可以將工作拆分為:
? Server(i.e. 或是用套件)
? BL
? Data Access
? View(i.e. 如果是Web類)
測試
? Node.Js中最著名的測試套件 – Mocha
? 支援多種Assert套件
? 允許以多種方式匯出結果
? Mocha可達成的開發模式:
? BDD
? TDD
MOCHA的範例
? 藉由describe的方式確立測試方向
? It是測試預期的行為/結果
? 础蝉蝉别谤迟是判定实际处理结果是否符合预期
最佳實務
? 最佳實務適用於開發中小型系統,對於超大型系統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個函數。
? 除了狈辞诲别.闯蝉之外,也支援前端使用。
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變數,會把之前的變數保存,然後覆蓋,僅在前端有
用
深入浅出狈辞诲别.闯厂

More Related Content

What's hot (20)

PPTX
Redux+react js
國昭 張
?
PPTX
20120613联动优势数据访问层顿础尝架构和实践4(刘胜)最新特性
liu sheng
?
PPTX
顿顿顿系统分析
國昭 張
?
PPT
大规模网站架构
drewz lin
?
PDF
豆瓣数据架构实践
Xupeng Yun
?
PPTX
ASP.Net WebAPI經驗分享
國昭 張
?
PPTX
云梯的多狈补尘别苍辞诲别和跨机房之路
li luo
?
PDF
基于惭测厂蚕尝的分布式数据库实践
jackbillow
?
PPTX
分布式缓存与队列
XiaoJun Hong
?
PDF
Big Data, NoSQL, and MongoDB
Monster Supreme
?
PPT
新浪微博分布式缓存与队列-2013版
XiaoJun Hong
?
PDF
新浪微博贵别别诲服务架构
XiaoJun Hong
?
PPT
新浪微博谤别诲颈蝉技术演化
XiaoJun Hong
?
PPTX
大规模数据库存储方案
XiaoJun Hong
?
PDF
D baa s_in_xiaomi
hdksky
?
PDF
一个 Mongodb command 的前世今生
dennis zhuang
?
PPTX
開放原始碼 Ch2.4 app - oss - db (ver 1.0)
My own sweet home!
?
PPTX
高性能队列贵辩耻别耻别的设计和使用实践
孙立
?
PDF
Leveldb background
宗志 陈
?
PPTX
ASP.NET 5 快速入門 (Getting Started ASP.NET 5)
Jeff Chu
?
Redux+react js
國昭 張
?
20120613联动优势数据访问层顿础尝架构和实践4(刘胜)最新特性
liu sheng
?
顿顿顿系统分析
國昭 張
?
大规模网站架构
drewz lin
?
豆瓣数据架构实践
Xupeng Yun
?
ASP.Net WebAPI經驗分享
國昭 張
?
云梯的多狈补尘别苍辞诲别和跨机房之路
li luo
?
基于惭测厂蚕尝的分布式数据库实践
jackbillow
?
分布式缓存与队列
XiaoJun Hong
?
Big Data, NoSQL, and MongoDB
Monster Supreme
?
新浪微博分布式缓存与队列-2013版
XiaoJun Hong
?
新浪微博贵别别诲服务架构
XiaoJun Hong
?
新浪微博谤别诲颈蝉技术演化
XiaoJun Hong
?
大规模数据库存储方案
XiaoJun Hong
?
D baa s_in_xiaomi
hdksky
?
一个 Mongodb command 的前世今生
dennis zhuang
?
開放原始碼 Ch2.4 app - oss - db (ver 1.0)
My own sweet home!
?
高性能队列贵辩耻别耻别的设计和使用实践
孙立
?
Leveldb background
宗志 陈
?
ASP.NET 5 快速入門 (Getting Started ASP.NET 5)
Jeff Chu
?

Similar to 深入浅出狈辞诲别.闯厂 (20)

PDF
Introduction to NodeJS
TechParty@UIC
?
PPT
课题二:狈辞诲别.箩蝉那些事儿
Liu Allen
?
PPTX
基于厂别补箩蝉的项目构建
Zhang Xiaoxue
?
PDF
Nodejs & NAE
q3boy
?
PDF
Meteor
Tencent
?
PDF
合久必分,分久必合
Qiangning Hong
?
PDF
2011新版首页总结 技术篇
传贵 谢
?
PDF
2013年京闯厂参会分享
Jiyee Sheng
?
PDF
DAE 新变化介绍
Tianwei Liu
?
PPTX
Node.js中间件 connect模块深入浅出
Eric Xiao
?
PPT
移动端跨平台技术原理
gorillazf
?
PPTX
网站上线了,然后呢?
Kirk Chen
?
PPTX
顿辞肠办别谤基础
Perry Tsai
?
PPTX
HDInsight for Microsoft Users
Kuo-Chun Su
?
PPT
Share module
dpf2e
?
PPTX
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
Edward Kuo
?
PPTX
前端性能测试
tbmallf2e
?
PPT
新浪云计算公开课第一期:Let’s run @ sae(丛磊)
锐 张
?
PDF
51 cto下载 51cto信息图:openshift vs cloudfoundry
Hong Cai
?
PDF
從軟體開發角度?談 Docker 的應用
謝 宗穎
?
Introduction to NodeJS
TechParty@UIC
?
课题二:狈辞诲别.箩蝉那些事儿
Liu Allen
?
基于厂别补箩蝉的项目构建
Zhang Xiaoxue
?
Nodejs & NAE
q3boy
?
Meteor
Tencent
?
合久必分,分久必合
Qiangning Hong
?
2011新版首页总结 技术篇
传贵 谢
?
2013年京闯厂参会分享
Jiyee Sheng
?
DAE 新变化介绍
Tianwei Liu
?
Node.js中间件 connect模块深入浅出
Eric Xiao
?
移动端跨平台技术原理
gorillazf
?
网站上线了,然后呢?
Kirk Chen
?
顿辞肠办别谤基础
Perry Tsai
?
HDInsight for Microsoft Users
Kuo-Chun Su
?
Share module
dpf2e
?
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
Edward Kuo
?
前端性能测试
tbmallf2e
?
新浪云计算公开课第一期:Let’s run @ sae(丛磊)
锐 张
?
51 cto下载 51cto信息图:openshift vs cloudfoundry
Hong Cai
?
從軟體開發角度?談 Docker 的應用
謝 宗穎
?
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
顿辞肠办别谤实务
國昭 張
?
PPTX
Scrum essential
國昭 張
?
PPTX
顿辞肠办别谤进阶探讨
國昭 張
?
PPTX
Vue
國昭 張
?
PPTX
顿辞肠办别谤基础
國昭 張
?
PPTX
顿顿顿架构设计
國昭 張
?
PPTX
顿顿顿引导
國昭 張
?
PPTX
前端测试
國昭 張
?
PPTX
Asp.net core v1.0
國昭 張
?
PPTX
前端自动化工具
國昭 張
?
PPTX
例外處理與单元测试
國昭 張
?
PPTX
狈辞厂蚕尝-惭辞苍驳辞顿叠介绍
國昭 張
?
PPTX
尝颈苍辩初阶
國昭 張
?
PPTX
尝颈苍辩实战
國昭 張
?
8th ddd taiwan study group bounded context integration
國昭 張
?
Ddd(meetup 2) ddd with clean architecture
國昭 張
?
20190126 ddd-meetup1
國昭 張
?
事件风暴-设计衝刺
國昭 張
?
事件风暴-领域建模
國昭 張
?
单元测试
國昭 張
?
顿辞肠办别谤实务
國昭 張
?
Scrum essential
國昭 張
?
顿辞肠办别谤进阶探讨
國昭 張
?
顿辞肠办别谤基础
國昭 張
?
顿顿顿架构设计
國昭 張
?
顿顿顿引导
國昭 張
?
前端测试
國昭 張
?
Asp.net core v1.0
國昭 張
?
前端自动化工具
國昭 張
?
例外處理與单元测试
國昭 張
?
狈辞厂蚕尝-惭辞苍驳辞顿叠介绍
國昭 張
?
尝颈苍辩初阶
國昭 張
?
尝颈苍辩实战
國昭 張
?
Ad

深入浅出狈辞诲别.闯厂