Palvelujen ohjelmointi JavaScriptillä* Node.js* TypeScript
Ahti HaukilehtoSovelto
Microsoft Regional Director, FinlandMicrosoft Certified TrainerProfessional Scrum Trainer
Sisältö
• Miksi JavaScript palvelimessa?
• Mitä on Node.js?
• Mitä on TypeScript?
2
Miksi JavaScript myös palvelimessa?
• Sama ohjelmointikieli ja osittain sama ohjelmointiympäristö kuin työasemassa
• Alustariippumattomuus
• KISS
• Open Source
3
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
Node.js
5
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
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ä
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
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 Azure-
integrointi. • http://www.windowsazure.com/en-us/downloads/?sdk=node
• IISNode – IIS:n ja Node.js:n integrointi• https://github.com/tjanczuk/iisnode
9
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
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
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
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
TypeScript
14
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
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
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
TS koodin modulointi
18
Module
Class
FieldsConstructorPropertiesFunctions
Interface
Tyyppijärjestelmä
19
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_
Rajapinta callback-määrittelyssä
• Rajapinnan avulla voidaan esitellä callback-metodin rakenne
21
interface IMoottori {
start(callback: (nimi:string, käynnistyi: boolean) =>void): void;
stop(callback: (nimi:string, sammutustapa: string) =>void): void;
}
Moottorilla tulee olla start ja stop-funktiot
start() –metodi saa yhden parametrin, nimeltään callback
callback-parametriksi on annettava funktio, joka hyväksyy nimi- ja käynnistyi-
parametrit. Tyyppiturvallinen!
callback() ei palauta mitään
start() ei palauta mitään
Callback-rajapintaisen olion käyttäminen
• Intellisense
22
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));
Mihin TypeScript sopii
• Kaikkeen JavaScript –ohjelmointiin
• Luontevinta siellä, missä “koko” sovellus tehdään JavaScriptillä• suuri sovellus• tarvitaan rajapintoja• käytetään IDEä
23