NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því...

32
NODE.JS FYRIRLESTUR 21, 3. NÓVEMBER 2014 ÓLAFUR SVERRIR KJARTANSSON, [email protected]

Transcript of NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því...

Page 1: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

NODE.JSFYRIRLESTUR 21, 3. NÓVEMBER 2014ÓLAFUR SVERRIR KJARTANSSON, [email protected]

Page 2: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

SAGANBúið til af Ryan Dahl og

Gerði tilraunir með C, Lua og Haskell en með útgáfu V8varð JavaScript fyrir valinu

Stutt af og í dag viðhaldið af

fyrst gefið út 2009

Joyent TJ Fontaine

Page 3: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

NODE.JSNode.js er verkvangur (platform) byggður á V8 til að smíðahröð, skalanleg netforrit

Node.js notar atburðadrifið, ekki-blokkandi I/O módel semgerir það létt, skilvirkt og fullkomið fyrir rauntíma forritsem meðhöndla mikil gögn yfir dreifð kerfi

Page 4: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

NODE.JSBeislar kraft V8 með því að skrifa lag ofan á það

core í node.js reynir að vera mjög einfalt – flækjan ípökkum

Mjög gott pakkakerfi, NPM, styður við þetta

Kynning frá Ryan Dahl

Page 5: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

V8Open source JavaScript vél, hönnuð af Google fyrirChrome

Skrifuð í C++ og útfærir ECMAScript, þriðju útgáfu

Þýðir JavaScript í vélamál fyrir keyrslu í staðinn fyrir aðtúlka og með ýmsum bestunar aðferðum keyrir JavaScripthratt

https://developers.google.com/v8/

Page 6: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

ÚTGÁFURÚtgáfur af node.js eru stöðugar fyrir jafnar tölur enóstöðugar fyrir odda tölur

Núverandi stöðuga útgáfa er 0.10

Óstöðug útgáfa er 0.11 sem mun verða gerð stöðug fyrir0.12

Page 7: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

UPPSETNINGSeinustu útgáfur hafa bætt töluvert stuðning við stýrikerfiog uppsetningu

Í dag eru til pakkar fyrir Windows, Machintosh og Linuxsem auðvelt er að setja upp

NPM fylgir með

http://nodejs.org/download/

Page 8: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

REPLNode.js kemur með REPL – Read-Eval-Print Loop

Skel fyrir Node.js sem getur verið mjög hjálpleg í að prófaokkur áfram eða debugga kóða

node> foo = 11> _ + 2 (_ gefur aðgang að seinasta skilagildi)3

Page 9: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

LIBUVÍ fyrstu var node.js skrifað með libev sem veitir eventloopu, en það er aðeins fyrir Unix

libuv er útfærsla sem keyrir á mörgum stýrikerfum ogfókusar á async I/O

Node.js getur þar með keyrt á Windows

Orðið nokkuð þroskað verkefni og notað af fleirum í dag

Page 10: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

ATBURÐADRIFIÐNode.js forrit eiga að vera atburðadrifin – erfitt að skrifaekki þannig

Gefum upp callback fall fyrir hluti sem taka tíma, kallað íþað þegar aðgerð klárast

Allar aðgerðir í core sem gera eitthvað í lengri tíma takavið callback

Node.js er sjálfgefið keyrt í einum process, þar sem CPU eryfirleitt ekki það sem takmarkar

Þ.a. ef við blokkum -- bíðum eftir I/O, minni, neti o.sfr. þáblokkar allt node.js keyrsluumhverfið

Page 11: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

EKKI-BLOKKANDI I/O –ASYNC I/O

I/O er ótrúlega hægt m.v. annað sem við gerum

Þegar við biðjum um I/O í node.js sendum við atburði semverða keyrðir þegar stýrikerfi er búið

Þurfum því ekki að bíða! Gerum eitthvað nytsamlegt ámeðan

Page 12: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

ASYNC I/O - DÆMIvar fs = require('fs');

fs.readFile(__dirname + '/data.txt', function (err, data) { console.log(data);});

Page 13: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

CALLBACKSLang flest API í node.js taka við callbacks

Ef villa kom upp eru gögn í err, annars eru niðurstöður ídata

function (err, data) { }

Page 14: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

CALLBACK HELLEf við framkvæmum margar async aðgerðir hverja á eftirannari, förum við að dragast óþarflega langt til hægri

Getum forðast með því að:

nota ekki nafnlaus föll í callbacks

halda kóðanum grunnum

skipta kóða upp í módúla

http://callbackhell.com/

Page 15: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

GLOBAL BREYTAN PROCESSÍ vafra höfum við window

Í Node.js höfum við process

Gefur okkur aðgang að umhverfi

Page 16: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

DEBUGGERGetur verið erfitt að debugga event drifin kóða, svipað og ívafra

Getum notað V8 debugging með því að setja debugger; íkóða

Keyrum með node debug og fáum þá gdb-líkt viðmót tilað debugga

Hægt að fá sjónræn tól, t.d. node-inspector

Page 17: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

VEFÞJÓNN Í NODE.JSvar http = require('http');

http.createServer(function (request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World\n');}).listen(8124);

console.log('Server running at http://127.0.0.1:8124/');

Page 18: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

EVENTEMITTERSObserver pattern

Getum látið vita þegar eitthvað á sér stað, hentar vel fyrirasync aðgerðir

Erfum EventEmitter og getum þá notað emit() fall til aðframkalla atburð sem fólk getur skráð sig á með on()

Page 19: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

STRAUMARHugmyndin um strauma hefur verið til síðan unix var aðverða til

Hver hlutur gerir einn hlut vel og síðan streymiru á milliþeirra – búum til stórt kerfi úr mörgum litlum

Virkar vel með async I/O og mikið notað í Node.js

Page 20: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

LESA SKRÁ ÁN STRAUMAvar http = require('http');var fs = require('fs');

var server = http.createServer(function (req, res) { fs.readFile(__dirname + '/data.txt', function (err, data) { res.end(data); });});server.listen(8000);

Bíðum eftir allri skránni í minni áður en nokkuð gert

Page 21: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

LESA SKRÁ MEÐ STRAUMUMvar http = require('http');var fs = require('fs');

var server = http.createServer(function (req, res) { var stream = fs.createReadStream(__dirname + '/data.txt'); stream.pipe(res);});server.listen(8000);

Streymum skjali frá okkur yfir í HTTP strauminn

Page 22: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

STRAUMAHANDBÓKIN er mjög afkastamikill node.js

forritari

Yfir

Heldur úti , flest allt sem þú þarft að vitaef þú ert að vinna með strauma í node.js

James Halliday / substack

400 pakkar á NPM

Stream Handbook

Page 23: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

UMSTRAUMABRIAN W. KERNIGHAN

Page 24: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

MÓDÚLARGetum og ættum að búa til módúla úr forritunum okkar

Skipta virkni í minni einingar sem auðvelt er að hugsa um

Node.js kemur með nokkrum módúlum, við getum skrifaðokkar eigin og sótt í gegnum NPM

Page 25: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

MÓDÚLARFærum ákveðna virkni í módulinn foo, og notum svo varfoo = require('./foo');

Búum til möppu með virkni og

index.js með virkni

package.json sem lýsir virkni

npm init leiðir okkur í gegnum þetta

Útfærum virkni og exportum með

module.exports = virkni

Page 26: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

NPM

"Node Packaged Modules"

Page 27: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

NPM

http://www.modulecounts.com/

Page 28: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

NPMGetum búið til okkar módúl og installað með NPM

npm install <module name>

Þurfum að skilgreina

package.json með name og version

readme.md með skjölun

Kóða

Gott til að dreifa kóða í stærri verkefnum eða til að gefa útmeð NPM

Page 29: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

EXPRESSWeb app framework fyrir node

Smátt í sniðum en gefur möguleika á middleware til aðbæta við hegðun

Notaði Connect middleware sem gefur aðgang að t.d.logger, authentication, json o.s.fr. en það er allt núna settsérstaklega upp

Page 30: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

MIDDLEWAREMiddleware er hugbúnaður sem tengir forrit

Í frameworkum er þetta yfirleitt einhverskonar pluginarkítektúr sem keyrir fyrir hvert request/response

Bætir við ákveðinni virkni í request eða response

Page 31: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

EXPRESS/CONNECTMIDDLEWARE

Middleware er bætt við á "stack" þar sem tekið er við req,res og next færibreytum þar sem:

req er hlutur sem inniheldur request frá client

res er hlutur sem inniheldur svar frá server

next er fall sem keyrir næsta middleware

fyrir logging, til að parse'a cookies

O.fl.,

morgan cookie-parser

listi hjá Connect

Page 32: NODE - notendur.hi.isosk1/vefforritun/2014/pdf/21.nodejs.pdf · NODE.JS Beislar kraft V8 með því að skrifa lag ofan á það core í node.js reynir að vera mjög einfalt –

EXPRESS - UPPSETNINGnpm init - búum til package.json

npm install express --save - setur express semdependency

npm install express-generator -g - tól sem scaffoldarvef fyrir okkur

express myapp - útbýr myapp í núverandi möppu

npm install - sækir öll dependency fyrir myapp

DEBUG=myapp ./bin/www eða set DEBUG=myapp & node.\bin\www á windows til að keyra