SlideShare a Scribd company logo
瞭解NodeJS開發技術by Fillano
課程主要內容NodeJS的背景知識如何撰寫NodeJS程式幾個codeexample展示與說明在Windows環境中執行NodeJS如何找到更多資源
NodeJS的背景知識作者、Javascript、V8及其它
什麼是NodeJS它主要是一個伺服器端的Javascript環境它提供了符合CommonJS1.0規格的模組機制,擴充功能非方便只要能使用模組來擴充功能,實際使用上並不限於伺服器程式
什麼是NodeJS舊瓶裝新酒1996–NetscapeLivewireinNetscapeEnterpriseServerASPwithJscript,Jscript.NETMozillaRhinoFlowscript for Apache Cocoon 2.1JavascriptWebflow for SpringHelma (http://helma.org)RingoJS(http://ringojs.org/)
什麼是NodeJS舊瓶裝新酒MozillaSpiderMonkeyAptanaJaxer(http://jaxer.org/)couchDB (RESTful API)GoogleV8v8cgi(http://code.google.com/p/v8cgi/)v8juice(http://code.google.com/p/v8-juice/)wikipedia: Comparison of server-side JavaScript solutions
什麼是NodeJS全新的生命力不需要倚賴其他伺服器
類似v8juice與jslib(http://jslib.mozdev.org/)
接下來會談到的成功因素為什麼這麼熱門因為執行速度非常快有多快?一些比較:http://shootout.alioth.debian.org/
vsphp (benchmarking nodejs basic performance tests against apache-php)
vsruby(express vs sinatra benchmarks)
vsringojs(RingoJS vs. Node.js: Runtime Values)為什麼它這麼快?它使用了GoogleV8Javascript 引擎特別的JIT技術:兩階段JIT
AST:將Javascript剖析成抽象語法樹
GenericCodeGen:直接產生尚未最佳化的機器碼執行
目前使用的最佳化技術Cranshaft
執行時期追蹤與Profiling
將型別資訊紀錄在相關AST節點中
OptimizedCodeGen
四階段最佳化,產生可利用暫存器存放變數的機器碼為什麼它這麼快?EventedI/OI/O的速度,遠比CPU執行的速度慢,所以最有效率的方法是在I/O完成時,由系統通知程式執行完畢,可以處理I/O動作執行的結果為什麼它這麼快?EventedI/O舊方法:select,poll,需要用兩個很慢的方法來監視資源
輪詢:每隔一段時間詢問系統是否有結果
遍歷:走訪每一個要監聽的檔案與網路port為什麼它這麼快?EventedI/O新方法:eventedI/O,告訴系統要監控的資源,當有變動時,系統以事件通知
Linux:epoll
BSD:kqueue
Windows, Solaris:IOCP (I/O Completion Port)誰創造了NodeJSRyanDahl在德國工作的美籍Freelancer,專長:InterruptableParser
Eventloops(event-machine, gearman…)
Responsetimehistorgram誰創造了NodeJSRyanDahl一些開放原始碼專案的發起者:Ebb web server
EY Load Balancer module for Nginx誰創造了NodeJSRyanDahl為了解決網站伺服器效能的問題,嘗試了:Ruby:EventMachine
Python:Twisted但是都不能滿意,在GoogleV8Engine發表後,決定自己寫一個:2009JSConf發表,獲得全場起立鼓掌
Crockford曾說:這是Javascript發展過程的一個重要案例,會影響未來ECMA-262規格的制定誰創造了NodeJSIssacSchlueter及其它開發者IssacSchlueter:NodeJS上最多人使用的套件管理系統-NPM的作者,目前是RyanDahl在Joyent的同事更多貢獻者:BertBelder(Releasemanager),TimCaswell(Howtonodewebsite),FelixGeisendorfer,TJHollowaychuck(ExpressFramework), PaulQuerna,MattRanney,MikealRogers,MicheilSmithetc…
哪裡可以找到NodeJShttp://nodejs.org最新版本的原始碼檔案下載
最新版本的Windows可執行檔下載
最新版本的API文件http://github.com/joynet/node原始碼 Repository
wiki:重點-如何在不同作業系統中編譯NodeJS
IssueTracker誰在使用NodeJSPlurk(www.plurk.com)http://www.slideshare.net/amix3k/comet-with-nodejs-and-v8Linkedin(www.linkedin.com)How LinkedIn used Node.js and HTML5 to build a better, faster app其它,參考:Projects, Applications, and Companies Using Node
(列表中有一些是提供NodeJSHosting服務的公司,他們自己也利用NodeJS開發相關管理方案,例如nodejitsu)使用NodeJS的時機快速反應!可以但並不適用於所有案例重點:當快速反應是最重要考量時並不適合需要大量運算的案例
使用NodeJS的時機快速反應!單一執行緒與eventloopJavascript程式本身只能在一個執行緒中執行
所有事件都是在一個eventloop依序執行
所以反應速度還是會隨著連線數上昇而逐漸下降解決方法在單一或多個機器上同時執行多個nodeinstance,使用proxy做loadbalance
新版的V8引擎可以支援一個行程多個instance當前開發狀態v0.5x(開發版)支援MicrosoftWindows
支援child_process
支援IOCP
可動態載入的原生模組
其它
支援VisualC++
之前只能在Cygwin及MSYS環境中編譯
v0.5.6將可以在VisualC++Express正確編譯當前開發狀態關鍵:libuv支援不同OS的eventedI/O抽象層
支援MicrosoftWindows的I/OCompletionPort機制
讓NodeJS抽換掉對於libeio,libevent,libev等的直接依賴
在Windows環境中可使用VisualC++編譯如何撰寫NodeJS程式Javascript知識、效能、NodeJS開發環境
最簡單的程式範例helloworld伺服器一頁就放的下的程式var http = require('http');http.createServer(function(req, res) {res.writeHead(200, {'Content-Type': 'text/plain'});res.end('Hello World.');}).listen(1337, "127.0.0.1");console.log('Server running at http://127.0.0.1:1337/');
最簡單的程式範例helloworld加上ExpressFramework一頁就放的下的程式var express = reuqire('express'),app=express.createServer();app.get('/',function(req,res){res.send('Hello World.');});app.listen(3000);
Javascript背景知識伺服器端的Javascript與瀏覽器中有什麼不同?沒有DOM物件
Global提供的環境不一樣其它地方大同小異因為都是Javascript(ECMAScript)
以NodeJS來說,大量使用非同步的執行方式,但是與在瀏覽器中事件與非同步的寫法也差不多Javascript背景知識eventloop
Javascript背景知識eventloopJavascript程式的LifeCycle第一步先執行GlobalContext中的程式碼
接下來,用eventloop的方式執行所有事件函數,直到結束
如果在瀏覽器中,可以利用動態新增script tag的方式,再次執行載入的script中GlobalContext中的程式碼,不過在NodeJS不會有這個狀況發生
所以,大部份時間可能都是在執行函數Javascript背景知識event loop優點沒有執行緒的額外負擔,反應速度快
共用的變數不需鎖定,程式結構簡單缺點某一函數執行時間長,就會推遲其它函數執行
無法把負載分散到不同的CPU解決方法(以NodeJS為例)同時執行多個instance,利用proxy做負載均衡
Intel的計畫,讓Javascript可以在多核心環境中進行平行處理
https://github.com/RiverTrail/RiverTrail
目前只支援FirefoxJavascript背景知識事件與callback函數通常在使用事件時,會傳遞給它一個函數,利用這個函數來執行事件觸發時要職行的動作,這個函數就叫做callback函數varelem=document.getElementById(‘target’);elem.addEventListener(‘click’,function(e){//thisisacallbackfunction},false);
Javascript背景知識事件與callback函數在瀏覽器中,通常很少超過兩層varelem=document.getElementById(‘target’);elem.addEventListener(‘click’,function(e){req.onreadystatechange=function(){	if(this.readyState===4&&this.status===200){varthat=this;window.setTimeout(function(){			alert(that.responseTest)		},500)		}}},false);
Javascript背景知識事件與callback函數在NodeJS環境中,有非常多的操作是用callback來完成,例如這一段mongo db的範例varp_client = new Db('integration_tests_20', new Server("127.0.0.1", 27017, {}), {'pk':CustomPKFactory});p_client.open(function(err, p_client) {p_client.dropDatabase(function(err, done) {p_client.createCollection('test_custom_key', function(err, collection) {collection.insert({'a':1}, function(err, docs) {collection.find({'_id':newObjectID("aaaaaaaaaaaa")}, function(err, cursor) {cursor.toArray(function(err, items) {test.assertEquals(1, items.length);p_client.close();});});});});});});
Javascript背景知識事件與callback函數為什麼會出現這麼多層的callbacks?重要的操作幾乎都透過callback已非同步的方式完成
所以常常在callbacks中使用其他功能,就需要另外加一層callbacks
在許多功能需要循序執行時,就需要在callbacks中使用下一個步驟的功能,這些還是需要callbacks來完成Javascript背景知識事件與callback函數複雜callbacks的問題程式邏輯會分散到各個callbacks,比較難除錯
不容易做單元測試解決方式借助一些模組的幫助,將這些非同步的callbacks改成同步的形式(底層還是使用非同步)
不要用匿名函數做callbacks,這樣對它做單元測試就比較容易Javascript背景知識撰寫Javascript程式的一些原則不要污染Global Scope利用Object把函數及變數Group起來(namespacing)
利用立即執行的匿名函數,把在Global Scope執行的程式包裝起來
不過只要好好使用模組,在NodeJS這不是大問題簡單的性能策略注意變數Scope解析的問題
需要花時間處理的程式,可以切割成數個函數,利用process.nextTick()非同步執行V8 Javascript VM的性能一些簡單的原則V8會依照函數執行的次數作為參考,進行最佳化(hot functions)某個函數預期它會在NodeJS instance生命週期中執行越多次,調整它對於效能就會更有效果
某些操作在Javascript中並沒有非同步執行的版本,例如JSON.parse/stringify,而這些操作比較花時間。這時可以找一找是否有人實作非同步的版本(模組)
例如: https://github.com/dominictarr/JSONStreamV8 Javascript VM的性能一些簡單的原則但是有一些地方會妨礙V8做最佳化無法決定scope中變數的型別時
某些Javascript函數,無法最佳化,所以使用到的話…
例如:用Array.prototype.slice.call(arguments,1)來把arguments轉換成陣列就比for(var i=0; i<arguments.length; i++)慢,因為後者可以最佳化開發NodeJS程式環境建置取得NodeJS可執行檔Unix-Like環境
需要預先安裝Python及GCC4.0以上
在nodejs.org網站取得原始碼
解開後依序執行./configure、make
需要安裝到系統中時,執行make install開發NodeJS程式環境建制取得NodeJS可執行檔Windows環境

More Related Content

PPTX
Nodejs introduce - using Socket.io
PDF
NodeJS基礎教學&簡介
PPTX
Node.js中间件 connect模块深入浅出
PDF
Node.js從無到有 基本課程
PDF
Node.js 淺談socket.io
PDF
學好 node.js 不可不知的事
PDF
Koa 正在等一個人
PDF
Network and Multitasking
Nodejs introduce - using Socket.io
NodeJS基礎教學&簡介
Node.js中间件 connect模块深入浅出
Node.js從無到有 基本課程
Node.js 淺談socket.io
學好 node.js 不可不知的事
Koa 正在等一個人
Network and Multitasking

What's hot (20)

PPTX
前端自動化工具
PDF
淺談 Groovy 與 Gradle
PPTX
Docker進階探討
PDF
D2_node在淘宝的应用实践_pdf版
PDF
Node.js 進攻桌面開發
PDF
用最潮的 Java script 盡情開發 kde qt 程式
PDF
Java script 全面逆襲!使用 node.js 打造桌面環境!
PPT
Node分享 展烨
PDF
使用Javascript及HTML5打造協同運作系統
PDF
不一樣的Web server... coServ
PDF
Node.js 入門 - 前端工程開發實務訓練
PDF
Spock:願你的測試長長久久、生生不息
PDF
Browser vs. Node.js Jackson Tian Shanghai
PDF
Npm 套件管理 & 常用開發工具介紹
PPTX
JavaScript 物件導向觀念入門 v.s. TypeScript 開發實戰 (微軟實戰課程日)
PPTX
Getting started with test automation
PPTX
Docker實務
PDF
再生龍於雲端環境之應用
PPTX
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
PDF
認識那條鯨魚 Docker 初探
前端自動化工具
淺談 Groovy 與 Gradle
Docker進階探討
D2_node在淘宝的应用实践_pdf版
Node.js 進攻桌面開發
用最潮的 Java script 盡情開發 kde qt 程式
Java script 全面逆襲!使用 node.js 打造桌面環境!
Node分享 展烨
使用Javascript及HTML5打造協同運作系統
不一樣的Web server... coServ
Node.js 入門 - 前端工程開發實務訓練
Spock:願你的測試長長久久、生生不息
Browser vs. Node.js Jackson Tian Shanghai
Npm 套件管理 & 常用開發工具介紹
JavaScript 物件導向觀念入門 v.s. TypeScript 開發實戰 (微軟實戰課程日)
Getting started with test automation
Docker實務
再生龍於雲端環境之應用
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
認識那條鯨魚 Docker 初探
Ad

Viewers also liked (20)

ODP
Asynchronous I/O in NodeJS - new standard or challenges?
PDF
Microservices and Seneca at RomaJS group
PPTX
Node Interactive : 7 years, 7 design patterns, will node continue to outshine
PDF
The Seneca Pattern at EngineYard Distill 2013 Conference
KEY
Introducing the Seneca MVP framework for Node.js
PPTX
Writing Test Cases with PHPUnit
PDF
NodeJS Microservices, Built it Now, Scale it Later!
PDF
Richard rodger technical debt - web summit 2013
KEY
NodeJS
PDF
JavaScript as a Server side language (NodeJS): JSConf 2011, Dhaka
PDF
Nodejs in Production
PPTX
Building Web Apps & APIs With Node JS
PPT
How to scale and deploy NodeJS app
PDF
NodeJS security - still unsafe at most speeds - v1.0
PDF
Nimrod: MongoDB Shell in NodeJS (JSConfUY 2015)
PPTX
Java script at backend nodejs
PPTX
High Performance NodeJS
PDF
Testing NodeJS Security
PPTX
NodeJS - Server Side JS
PPT
Why Reactive Architecture Will Take Over The World (and why we should be wary...
Asynchronous I/O in NodeJS - new standard or challenges?
Microservices and Seneca at RomaJS group
Node Interactive : 7 years, 7 design patterns, will node continue to outshine
The Seneca Pattern at EngineYard Distill 2013 Conference
Introducing the Seneca MVP framework for Node.js
Writing Test Cases with PHPUnit
NodeJS Microservices, Built it Now, Scale it Later!
Richard rodger technical debt - web summit 2013
NodeJS
JavaScript as a Server side language (NodeJS): JSConf 2011, Dhaka
Nodejs in Production
Building Web Apps & APIs With Node JS
How to scale and deploy NodeJS app
NodeJS security - still unsafe at most speeds - v1.0
Nimrod: MongoDB Shell in NodeJS (JSConfUY 2015)
Java script at backend nodejs
High Performance NodeJS
Testing NodeJS Security
NodeJS - Server Side JS
Why Reactive Architecture Will Take Over The World (and why we should be wary...
Ad

Similar to All about NodeJS (12)

PPTX
深入淺出Node.JS
PDF
Noder eyes for frontend guys
PPTX
快速入坑 Node.js - 0613 SITCON 雲林定期聚
PPTX
猴子也能懂的Node.js
PDF
用十分鐘瞭解 《JavaScript的程式世界》
PDF
Class 20170126
PDF
北護樂學程式冬令營 2017
PDF
Introduction to NodeJS
PDF
KSDG meet-up #1
PDF
COSCUP 2010 - node.JS 於互動式網站之應用
PDF
深入浅出NodeJS
PPT
课题二:Node.js那些事儿
深入淺出Node.JS
Noder eyes for frontend guys
快速入坑 Node.js - 0613 SITCON 雲林定期聚
猴子也能懂的Node.js
用十分鐘瞭解 《JavaScript的程式世界》
Class 20170126
北護樂學程式冬令營 2017
Introduction to NodeJS
KSDG meet-up #1
COSCUP 2010 - node.JS 於互動式網站之應用
深入浅出NodeJS
课题二:Node.js那些事儿

All about NodeJS