SlideShare una empresa de Scribd logo
1 de 56
深入淺出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

Más contenido relacionado

La actualidad más candente

Redux+react js
Redux+react jsRedux+react js
Redux+react js國昭 張
 
20120613联动优势数据访问层DAL架构和实践4(刘胜)最新特性
20120613联动优势数据访问层DAL架构和实践4(刘胜)最新特性20120613联动优势数据访问层DAL架构和实践4(刘胜)最新特性
20120613联动优势数据访问层DAL架构和实践4(刘胜)最新特性liu sheng
 
DDD系統分析
DDD系統分析DDD系統分析
DDD系統分析國昭 張
 
大规模网站架构
大规模网站架构大规模网站架构
大规模网站架构drewz lin
 
豆瓣数据架构实践
豆瓣数据架构实践豆瓣数据架构实践
豆瓣数据架构实践Xupeng Yun
 
ASP.Net WebAPI經驗分享
ASP.Net WebAPI經驗分享ASP.Net WebAPI經驗分享
ASP.Net WebAPI經驗分享國昭 張
 
云梯的多Namenode和跨机房之路
云梯的多Namenode和跨机房之路云梯的多Namenode和跨机房之路
云梯的多Namenode和跨机房之路li luo
 
基于MySQL的分布式数据库实践
基于MySQL的分布式数据库实践基于MySQL的分布式数据库实践
基于MySQL的分布式数据库实践jackbillow
 
分布式缓存与队列
分布式缓存与队列分布式缓存与队列
分布式缓存与队列XiaoJun Hong
 
Big Data, NoSQL, and MongoDB
Big Data, NoSQL, and MongoDBBig Data, NoSQL, and MongoDB
Big Data, NoSQL, and MongoDBMonster Supreme
 
新浪微博分布式缓存与队列-2013版
新浪微博分布式缓存与队列-2013版新浪微博分布式缓存与队列-2013版
新浪微博分布式缓存与队列-2013版XiaoJun Hong
 
新浪微博Feed服务架构
新浪微博Feed服务架构新浪微博Feed服务架构
新浪微博Feed服务架构XiaoJun Hong
 
新浪微博redis技术演化
新浪微博redis技术演化新浪微博redis技术演化
新浪微博redis技术演化XiaoJun Hong
 
大规模数据库存储方案
大规模数据库存储方案大规模数据库存储方案
大规模数据库存储方案XiaoJun Hong
 
D baa s_in_xiaomi
D baa s_in_xiaomiD baa s_in_xiaomi
D baa s_in_xiaomihdksky
 
一个 Mongodb command 的前世今生
一个 Mongodb command 的前世今生一个 Mongodb command 的前世今生
一个 Mongodb command 的前世今生dennis zhuang
 
開放原始碼 Ch2.4 app - oss - db (ver 1.0)
開放原始碼 Ch2.4   app - oss - db (ver 1.0)開放原始碼 Ch2.4   app - oss - db (ver 1.0)
開放原始碼 Ch2.4 app - oss - db (ver 1.0)My own sweet home!
 
高性能队列Fqueue的设计和使用实践
高性能队列Fqueue的设计和使用实践高性能队列Fqueue的设计和使用实践
高性能队列Fqueue的设计和使用实践孙立
 
Leveldb background
Leveldb backgroundLeveldb background
Leveldb background宗志 陈
 
ASP.NET 5 快速入門 (Getting Started ASP.NET 5)
ASP.NET 5 快速入門 (Getting Started ASP.NET 5)ASP.NET 5 快速入門 (Getting Started ASP.NET 5)
ASP.NET 5 快速入門 (Getting Started ASP.NET 5)Jeff Chu
 

La actualidad más candente (20)

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

Similar a 深入淺出Node.JS

Introduction to NodeJS
Introduction to NodeJSIntroduction to NodeJS
Introduction to NodeJSTechParty@UIC
 
课题二:Node.js那些事儿
课题二:Node.js那些事儿课题二:Node.js那些事儿
课题二:Node.js那些事儿Liu Allen
 
基于Seajs的项目构建
基于Seajs的项目构建基于Seajs的项目构建
基于Seajs的项目构建Zhang Xiaoxue
 
Nodejs & NAE
Nodejs & NAENodejs & NAE
Nodejs & NAEq3boy
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合Qiangning Hong
 
2011新版首页总结 技术篇
2011新版首页总结 技术篇2011新版首页总结 技术篇
2011新版首页总结 技术篇传贵 谢
 
2013年京JS参会分享
2013年京JS参会分享2013年京JS参会分享
2013年京JS参会分享Jiyee Sheng
 
DAE 新变化介绍
DAE 新变化介绍DAE 新变化介绍
DAE 新变化介绍Tianwei Liu
 
Node.js中间件 connect模块深入浅出
Node.js中间件 connect模块深入浅出Node.js中间件 connect模块深入浅出
Node.js中间件 connect模块深入浅出Eric Xiao
 
移动端跨平台技术原理
移动端跨平台技术原理移动端跨平台技术原理
移动端跨平台技术原理gorillazf
 
網站上線了,然後呢?
網站上線了,然後呢?網站上線了,然後呢?
網站上線了,然後呢?Kirk Chen
 
HDInsight for Microsoft Users
HDInsight for Microsoft UsersHDInsight for Microsoft Users
HDInsight for Microsoft UsersKuo-Chun Su
 
Share module
Share moduleShare module
Share moduledpf2e
 
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛Edward Kuo
 
前端性能测试
前端性能测试前端性能测试
前端性能测试tbmallf2e
 
新浪云计算公开课第一期:Let’s run @ sae(丛磊)
新浪云计算公开课第一期:Let’s run @ sae(丛磊)新浪云计算公开课第一期:Let’s run @ sae(丛磊)
新浪云计算公开课第一期:Let’s run @ sae(丛磊)锐 张
 
51 cto下载 51cto信息图:openshift vs cloudfoundry
51 cto下载 51cto信息图:openshift vs cloudfoundry51 cto下载 51cto信息图:openshift vs cloudfoundry
51 cto下载 51cto信息图:openshift vs cloudfoundryHong Cai
 

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

Introduction to NodeJS
Introduction to NodeJSIntroduction to NodeJS
Introduction to NodeJS
 
课题二:Node.js那些事儿
课题二:Node.js那些事儿课题二:Node.js那些事儿
课题二:Node.js那些事儿
 
基于Seajs的项目构建
基于Seajs的项目构建基于Seajs的项目构建
基于Seajs的项目构建
 
Nodejs & NAE
Nodejs & NAENodejs & NAE
Nodejs & NAE
 
Meteor
MeteorMeteor
Meteor
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合
 
2011新版首页总结 技术篇
2011新版首页总结 技术篇2011新版首页总结 技术篇
2011新版首页总结 技术篇
 
2013年京JS参会分享
2013年京JS参会分享2013年京JS参会分享
2013年京JS参会分享
 
Web Development Roadmap
Web Development RoadmapWeb Development Roadmap
Web Development Roadmap
 
DAE 新变化介绍
DAE 新变化介绍DAE 新变化介绍
DAE 新变化介绍
 
Node.js中间件 connect模块深入浅出
Node.js中间件 connect模块深入浅出Node.js中间件 connect模块深入浅出
Node.js中间件 connect模块深入浅出
 
移动端跨平台技术原理
移动端跨平台技术原理移动端跨平台技术原理
移动端跨平台技术原理
 
網站上線了,然後呢?
網站上線了,然後呢?網站上線了,然後呢?
網站上線了,然後呢?
 
Docker基礎
Docker基礎Docker基礎
Docker基礎
 
HDInsight for Microsoft Users
HDInsight for Microsoft UsersHDInsight for Microsoft Users
HDInsight for Microsoft Users
 
Share module
Share moduleShare module
Share module
 
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
 
前端性能测试
前端性能测试前端性能测试
前端性能测试
 
新浪云计算公开课第一期:Let’s run @ sae(丛磊)
新浪云计算公开课第一期:Let’s run @ sae(丛磊)新浪云计算公开课第一期:Let’s run @ sae(丛磊)
新浪云计算公开课第一期:Let’s run @ sae(丛磊)
 
51 cto下载 51cto信息图:openshift vs cloudfoundry
51 cto下载 51cto信息图:openshift vs cloudfoundry51 cto下载 51cto信息图:openshift vs cloudfoundry
51 cto下载 51cto信息图:openshift vs cloudfoundry
 

Más de 國昭 張

8th ddd taiwan study group bounded context integration
8th ddd taiwan study group  bounded context integration8th ddd taiwan study group  bounded context integration
8th ddd taiwan study group bounded context integration國昭 張
 
Ddd(meetup 2) ddd with clean architecture
Ddd(meetup 2) ddd with clean architectureDdd(meetup 2) ddd with clean architecture
Ddd(meetup 2) ddd with clean architecture國昭 張
 
20190126 ddd-meetup1
20190126 ddd-meetup120190126 ddd-meetup1
20190126 ddd-meetup1國昭 張
 
事件風暴-設計衝刺
事件風暴-設計衝刺事件風暴-設計衝刺
事件風暴-設計衝刺國昭 張
 
事件風暴-領域建模
事件風暴-領域建模事件風暴-領域建模
事件風暴-領域建模國昭 張
 
Scrum essential
Scrum essentialScrum essential
Scrum essential國昭 張
 
Docker進階探討
Docker進階探討Docker進階探討
Docker進階探討國昭 張
 
DDD架構設計
DDD架構設計DDD架構設計
DDD架構設計國昭 張
 
Asp.net core v1.0
Asp.net core v1.0Asp.net core v1.0
Asp.net core v1.0國昭 張
 
前端自動化工具
前端自動化工具前端自動化工具
前端自動化工具國昭 張
 
例外處理與單元測試
例外處理與單元測試例外處理與單元測試
例外處理與單元測試國昭 張
 
NoSQL-MongoDB介紹
NoSQL-MongoDB介紹NoSQL-MongoDB介紹
NoSQL-MongoDB介紹國昭 張
 

Más de 國昭 張 (20)

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

深入淺出Node.JS