3. Miksi JavaScript myös palvelimessa?
• Sama ohjelmointikieli ja osittain sama ohjelmointiympäristö kuin
työasemassa
• Alustariippumattomuus
• KISS
• Open Source
3
4. Miksi ei?
• Palvelinympäristö on usein staattinen, tarvitaanko palvelinpäässä
alustariippumattomuutta
• Laaja integrointitarve, valmiit komponentit (muita kuin JS)
• Valmiimpi kehitysympäristö
• Sovellusarkkitehtuurin selkeys – voi olla etu, että UX on täysin eriytetty
palvelujen toteuttamisesta
4
6. Node.js in brief source: JSConf 2009
JSConf 2009
• Server-side Javascript
• Built on Google’s V8
• Evented, non-blocking I/O. Similar to EventMachine or Twisted.
• CommonJS module system.
• 8000 lines of C/C++, 2000 lines of Javascript, 14 contributors.
6
7. Mitä on node.js?
• JavaScript palvelimessa
• Event driven I/O
• Yksisäikeinen suoritus, kaikki requestit ajetaan samalla säikeellä
• Tehokas ja skaalautuva
• usean coren käyttö edellyttää toimenpiteitä
8. Node.js sisältö
• libuv – a high performance cross-platform evented I/O library
• V8 – Google’s JavaScript engine (the same that is used in Chrome)
• JavaScript ja C++ koodia
Nämä yhdessä muodostavat Node.js:n
9. Node.js asentaminen
• "Normaali" asennus
•
•
•
•
http://nodejs.org/
Asennusohjelmat Windowsille, OS X:lle ja muutamalle Linuxille
Myös lähdekoodi on saatavilla
Tarvittaessa github:sta saa halutun version
• "Azure"-asennus Node.js SDK
• Mikäli halutaan Azure Storage-modulit ja hieman suoraviivaisempi Azureintegrointi.
• http://www.windowsazure.com/en-us/downloads/?sdk=node
• IISNode – IIS:n ja Node.js:n integrointi
• https://github.com/tjanczuk/iisnode
9
10. Editors & Debuggers
• Cloud9 IDE https://c9.io/
• WebStorm http://www.jetbrains.com/webstorm/
• Komodo IDE http://www.activestate.com/komodo-ide
• ExlipseJS https://portawiki.abnoctus.com/view/NodeIDE.html
• And many many others
On Windows (Microsoft)
• Web Matrix
• Visual Studio 2013 (osittain)
• IISNode, sisältää myös debuggauksen
11. Node.js – Evented IO
• Kaikki IO – ja yleensäkin kaikki, mikä voi kestää – suoritetaan
asynkronisesti
• Node.js:n oma libuv-kirjasto on toteutettu näin
• Oma koodi pitäisi tehdä näin
• Kirjastot on tehty näin
• Luontevaa JavaScript –ohjelmoinnissa
• Mutta vähemmän luontevaa muille puolipiste-kieliä käyttäville
• Useita toteutustapoja
•
•
•
•
Eventloop
Callback
Publish/Subscribe
Stream
11
12. Modulit
• Node.js –sovellus voi käyttää ulkopuolisia moduleja.
• Moduulit ovat yleensä sovelluksen hakemistossa erillisissä tiedostoissa
Modulien lähteet
1. Built-in Modules
• esim. fs, http, crypto, os
• Käyttöönotto: var fs = require(‘fs’);
2. Projektissa tehdyt modulit
• jokainen .js –tiedosto on oma modulinsa
• modulissa exportoidaan se, mitä halutaan näyttää ulkopuolelle
• Käyttöönotto: var bar = require(‘../lib/bar’);
3. Kolmannen osapuolten modulit Node Package Manager (NPM) –
rekisteristä https://npmjs.org/
• Asennetaan npm install 'module name' –komennolla
• Käyttöönotto: var request = require(‘request’);
12
13. Mihin node.js soveltuu
• Voiko koko web-sivuston tehdä node:lla
• Kyllä voi http://nodejs.org/industry/
• Mutta tarviihan se ison panostuksen
• Luontevinta siellä, missä Node.js:n edut ovat merkittäviä
• suorituskyky
• JavaScript
• alustariippumattomuus
13
15. JavaScript
• Laajojen, ylläpidettävien (== enterprise scale) JS-sovellusten tekeminen
on haastavaa, ellei mahdotonta
• moni näistä haasteista kulminoituu tyyppijärjestelmän puuttumiseen
• intellisense-haste
• kontrahtien tekemisen haste
• käännösaikaisen tarkastamisen haasteet
• JS-kielen haasteet
• === on monelle kehittäjälle tuntematon
• this / closure –käsitteistä puhumattakaan
• JS modulointi on haastavaa
• Mutta se on välttämätön kieli alustariippumattomien client-sovellusten
tekemiseen
• joka BYOD-aikakaudella on välttämätöntä enterprise-sovelluskehityksessä
• JS:n tuki niin alustoiden kuin open-source kirjastojen puolesta on
ylivoimainen
15
16. TypeScript
• TypeScript tuo kehitys- ja käännösaikaisen tyyppijärjestelmän JS:n päälle
• JavaScript-koodi on sellaisenaan myös TypeScript-koodia
• Valid JavaScript is valid TypeScript
• Olemassa oleva JavaScript.js –tiedosto voidaan nimetä .ts –tiedostoksi ja kaikki
toimii
• TypeScript-kääntäjä tsc.exe kääntää .ts-tiedoston JavaScript:ksi
• Visual Studiossa tiedoston tallentamisen yhteydessä
• Käännöksen yhteydessä paljastuu kaikki tyyppitarkastuksessa havaitut virheet
• TypeScript-koodi toimii siis kaikilla alustoilla, kaikissa käyttiksissä, kaikissa
selaimissa
• Kehitysaikainen tyyppijärjestelmä mahdollistaa hyvän välinetuen
(intellisense)
• TypeScript on ainoastaan kehitysaikainen tyyppijärjestelmä, käännöksen jälkeen
ei ole mitään tarkistusta – sehän on vain JavaScript –koodia
• Kehittimiä: Visual Studio 2012 2013, Emacs, Vi,
http://www.typescriptlang.org/Playground/
• TypeScript on open-source –projekti
• http://www.typescriptlang.org
16
17. TypeScript ja vastaavat muut tuotteet
• CoffeeScript, DART, Ecma Script 6 (kun valmistuu, TS tukee)
http://smthngsmwhr.wordpress.com/2013/02/25/javascript-and-friends-coffeescript-dart-and-typescript/
17
20. Tyypin määrittely – Type Annotations ja Inference
// type Annotation
var num1: number = 7;
var num2: number;
// type inference, tyypin päättely käytön perusteella
// käytetään myös nimeä Contextual Typing
var num3 = 7;
var num4 = FunktioJokaPalauttaaNumberin( );
• Tyyppi on olemassa vain kehitysaikana,
käännöstuotoksessa (JavaScript) sitä ei ole
• Tyypittäminen on täysin vapaaehtoista
• mutta _erittäin_ suositeltavaa
• Type Annotationia tarvitaan kuitenkin melko harvoin, Contextual Typing _toimii_
21. Rajapinta callback-määrittelyssä
• Rajapinnan avulla voidaan esitellä callback-metodin rakenne
Moottorilla tulee olla
start ja stop-funktiot
interface IMoottori {
start() –metodi saa
callback-parametriksi on annettava funktio,
yhden parametrin,
joka hyväksyy nimi- ja käynnistyinimeltään callback
parametrit. Tyyppiturvallinen!
start(callback: (nimi:string, käynnistyi: boolean) =>
void): void;
callback() ei palauta
mitään
start() ei palauta
mitään
stop(callback: (nimi:string,
void): void;
}
sammutustapa: string) =>
21
22. Callback-rajapintaisen olion käyttäminen
intellisense pelittää ja kääntäjä tarkastaa
var am = new AutoMoottori('BMW V8');
am.start( (nimi: string, käynnistyi: boolean) =>
alert(nimi + " käynnissä:" + käynnistyi)
);
am.stop( (nimi, tapa) => alert(nimi + ':' + tapa));
• Intellisense
22
23. Mihin TypeScript sopii
• Kaikkeen JavaScript –ohjelmointiin
• Luontevinta siellä, missä “koko” sovellus tehdään JavaScriptillä
• suuri sovellus
• tarvitaan rajapintoja
• käytetään IDEä
23