Johdanto JavaScript-sovellusten kehitykseen Node.js:llä
Jaakko Salonen (@jsalonen)
5.6.2012 (päivitetty 17.9.2012)
Tässä artikkelissa kuvataan johdanto JavaScript-sovellusten kehitykseen Node.js:llä. Artikkeli käy läpi esittelynomaisesti kaikki vaiheet kokonaisen JavaScript-sovelluksen toteuttamiseksi node.js:llä. Oletuksena on, että lukija ymmärtää perusteet JavaScript-kielestä. Hyvä opas JavaScript-ohjelmointiin taustaksi on esimerkiksi JavaScript-puutarhan tarjoama dokumentaatio (http://bonsaiden.github.com/JavaScript-Garden/fi/).
IDE-ympäristöt
Eclipse JavaScript-tuella
Selainpohjaiset kehitysympäristöt (Cloud 9 IDE, Nide)
Yksinkertaisen web-sovelluksen toteutus
Node-sovellusten julkaiseminen
LAMP ja jaetut palvelinympäristöt
Julkaisu pilvialustalle
Julkaisu omalla palvelimella (Linux)
1. IDE-ympäristöt
JavaScript-palvelinsovellusten kehitys ei vaadi komentoriviä ja perustekstieditoria kummallisempia välineitä. Kehittyneet tekstieditorit ja IDE-ympäristöt voivat kuitenkin helpottaa sovelluskehitystä merkittävästi. Käymme läpi muutamia tällaisia vaihtoehtoja.
1.1. Sublime Text 2
Sublime Text on tekstieditori, johon on tuotu laajasti sovelluskehitystä helpottavia ominaisuuksia. Omalla kokemuksellani Sublime Text 2 on tällä hetkellä parasta, mitä näissä on tarjolla. Sovellus toimii sekä Windows, Linux että Mac-ympäristöissä. Sublime Text on maksullinen; sitä voi testata, mutta pidemmän päälle se kannattaa ostaa. Hinta ei päätä huimaa. Editorin tehokäyttö vaatii opettelua, mutta tuo työhön lisää tehokkuutta.
Lataa ja asenna Sublime Text 2 (http://www.sublimetext.com/2)
Sublime Text:n käyttö voi helpottaa laajennuksilla
Käyttöohjeisiin ja vinkkeihin kannattaa tutustua, jotta ohjelmasta saa parhaan mahdollisen hyödyn
Sublime Text:n parhaiten toimii Git:n komentorivityökalu: (http://git-scm.com/)
1.2. Jetbrains WebStorm
Jetbrains WebStorm on täysiverinen JavaScript IDE. Ympäristö tarjoaa IDE:lle tyypillisesti älykkäitä lisäpiirteitä, kuten koodin automaattisen käännöksen ja täydentämisen, refaktoroinnin sekä rakenteiset näkymät lähdekoodiin. IDE tukee myös Node.js:ää (1] sekä JavaScript-yksikkötestausta. Tuki git-versionhallinnalle löytyy ympäristöstä valmiina.
WebStorm on saatavilla 30-päivän kokeiluversiona (http://www.jetbrains.com/webstorm/). WebStorm on Sublimea hieman kalliimpi (hinta n. 100 € / kehittäjä).
1.3. Eclipse
Myös Eclipse saa sopivilla moduuleilla konfiguroitua JavaScript-kehitykseen soveltuvaksi:
Lataa Eclipse for JavaScript Web Developers (http://www.eclipse.org/downloads/packages/eclipse-ide-javascript-web-developers/heliossr1)
Asenna Git-tukea varten EGit-laajennus (http://www.eclipse.org/egit/)
Eclipse on ilmainen, mutta sen konfigurointi ja käyttöönotto on muita ympäristöjä haastavampaa. Myös helppokäyttöisyys jättää toivomisen varaa. Hyvänä puolena ilmaisuuden lisäksi Eclipsessä on sen joustavuus: alustan saa konfiguroitua myös erilaisiin sovelluskehitystarpeisiin.
Esitellyistä vaihtoehdoista Eclipse on ainoa, joka on täysin ilmainen. Toisaalta Eclipse on myös selvästi kankein ja tarjoaa vähiten hyötyjä sovelluskehitykseen. Käyttö voi kuitenkin tulla kysymykseen erityisesti silloin, kun samalla ympäristöllä halutaan kehittää useita erityyppisiä ohjelmistoja.
1.4. Selainpohjaiset kehitysympäristöt
Vaihtoehtona paikallisesti asennettaville kehitysympäristöille on sovelluskehitysympäristön ajaminen selainpohjaisesti tai pilvipalveluna. Kehitysympäristön käyttö pilvipalveluna on keveä ratkaisu, jossa kehitysympäristöä on helppo käyttää mistä tahansa. Haasteina keskitetyissä pilviympäristöissä on riippuvuus verkkoyhteydestä, sekä ulkoisesta toimijasta kehitystyössä.
Cloud9 IDE (http://c9.io) on täysiverinen node.js-kehitys ja -ajoympäristö, joka toimii kokonaan selaimella. Avoimen lähdekoodin sovellusprojekteihin Cloud9 on maksuton. Suljettuihin projekteihin ympäristö on ostettavissa käyttöön kuukausimaksuperustaisesti (http://c9.io/site/pricing/). Cloud9 sisältää myös versionhallintajärjestelmän ja integroituu node.js:n julkaisupalveluihin, jolloin koko kehitystyö voidaan tehdä alusta loppuun asti samassa ympäristössä ilman ulkoisia järjestelmiä.
Git on avoimen lähdekoodin hajautettu versionhallintajärjestelmä. Käytämme Git:iä erityisesti siksi, että se mahdollistaa 1) koko versiohistorian käsittelyn paikallisesti ilman keskitettyä palvelinta (ja internet-yhteyttä), 2) muutosten tarkan tallennuksen ja helpon yhdistämisen useiden repositorien välillä, sekä 3) Git:n avulla voidaan integroitua erilaisiin deployment-ratkaisuihin helposti (Heroku, CI-työvälineet). Git:n eduksi voidaan katsoa myös mahdollisuus tehdä helposti tuotanto- ja staging-ympäristöjen kautta muutoksia sovelluksiin hallitusti.
Git:n käyttöönotto riippuu IDE-ympäristöstä: tekstieditorien ja kevyiden IDE-ympäristöjen kanssa tarvitset Git:n komentorivityökalun. Varsinaiset IDE-ympäristöt tarjoavat Git:n laajennuksena -- katso tällöin oman ympäristösi tarkka ohjeistus
2.1. Komentorivi Git:n asentaminen ja käyttöönotto:
Lataa ja asenna Git (http://git-scm.com/)
Windowsissa Git:iä voi käyttää joko Git:n oman bash-tulkin kautta tai sen voi liittää osaksi komentotulkkia/PowerShelliä. Erillisen komentotulkin käyttö on makuasia, mutta tarvitset varmasti Git bash:ia ainakin käyttöönoton aikana.
Erittäin hyvä opas Git:n käyttöönottoon löytyy Githubista: https://help.github.com/articles/set-up-git
Jos suojaat SSH-avaimet salasanalla, helpota elämääsi seuraavalla ohjeella: https://help.github.com/articles/working-with-ssh-key-passphrases
Git:lle on olemassa erittäin kattava dokumentaatio: http://git-scm.com/documentation
Lyhyt oppimäärä Git-komentorivin käyttöön:
Kopio git-repository omalle koneelle git clone [lähde] -kommennolla
Kun teet muutoksen, merkitse se tallennettavaksi git add [tiedosto] -komennolla
Näet yhteenvedon merkityistä muutoksista git status -komennolla
Tallenna muutokset paikalliseen versionhallintaan git commit -m 'Kommentti' -komennolla
Lähetä paikallinen versio etäpalvelimelle git push -komennolla
Jos etäpalvelimella on muutoksia, saat ne omalle koneellesi git pull -komennolla.
Jos etäpalvelimella on uusia muutoksia omiesi kanssa rinnakkain, aja ensin git pull ja sitten git push. Git yrittää hoitaa muutosten yhdistelyn automaattisesti. Ainoastaan poikkeustilanteessa joudut korjaamaan konfliktit käsin.
Node.js on suhteellisen tuore - ja rehellisesti sanoen - vielä kovaa tahtia kypsyvä kirjasto. Palvelinpään JavaScript-ajoympäristöistä Node.js on tällä hetkellä selvästi pisimmälle viety. Tietyllä tavalla parhaimmillaan node.js on silloin, kun se voidaan ylläpitää pilvialustoilla: sen tekniset vaatimukset ovat melko niukat, jolloin kevytkin pilvialusta riittää hyvin suorituskykyisen node.js-palvelun ylläpitämiseen. Perinteisistä sovelluskehyksistä node.js poikkeaa myös siten, että se on vahvasti tapahtumavetoinen: sovellukset ohjelmoidaan nodelle lähtökohtaisesti asynkronisesti callback-mekanismien pohjalle. Etuna tässä on, että esimerkiksi yksittäisiin HTTP-pyyntöihin voidaan helposti kytkeä useita asynkronisia palvelukutsuja. Toinen merkittävä etu node:ssa on JavaScript-olioiden helppo sarjallistaminen sekä tietokannasta että selaimessa toimivista asiakassovelluksista. Näistä syistä myös reaaliaikaisten sovellusten ohjelmointi on poikkeuksellisen helppoa. Haastavaa noden käytöstä tekee sen, että callback-kutsuista voi helposti muodostua pitkiä, vaikeasti ymmärrettäviä ketjuja. Tätä "callback-viidakon" ongelmaa ratkotaan aktiivisesti (esimerkki: common-node). Toimi seuraavasti:
Lataa ja asenna node.js:
Testaa, että node.js toimii oikein. Avaa komentorivi ja kirjoita:
Jos kaikki menee hyvin saat tulosteen tyyliin:
Saat node.js-tulkin auki kirjoittamalla
Käytännössä node.js on siis JavaScript-tulkki. Hello world -esimerkki:
&gt; console.log('Hello World!')
JavaScript-sovelluksia ajetaan node:lla vastaavasti. Esimerkiksi:
Sovellukset, kuten myös konsolin, saa suljettu Ctrl+C:llä.
Node.js:n keskeinen dokumentaatio: http://nodejs.org/api/
Käytännössä node-sovelluksien asennus pysyvästi palvelimelle vaatii hieman lisätyötä. Yksittäinen node-sovellus käyttää (nykyisin) ainoastaan yhtä säiettä. Jos sovellus jostain syystä kaatuu tai heittää poikkeuksen, jota ei oteta kiinni, se pysähtyy. Node on ainoastaan kevyt, tapahtumapohjainen JavaScript-ajoympäristö. Jos node:lla halutaan toteuttaa verkkosovelluksia, kannattaa käyttöön lisäksi ottaa jonkinlainen web-sovelluskehys, kuten express.js (http://expressjs.com/). Vastaavasti myös palvelinasennus kannattaa järjestää siten, että sovellus tarvittaessa skaalautuu suuremmille käyttäjämäärille ja että node-sovelluksia ajetaan siten, että ne ovat vikasietoisia.
NPM (http://npmjs.org/) on node:n oma pakettienhallintajärjestelmä. Koko idea node:ssa on että sen ydin on kevyt ja mahdollisimman suurin osa toiminnallisuudesta saadaan ulkoisten pakettien avulla käyttöön. Tästä syystä npm:n käyttö ja sen ymmärtäminen on välttämätöntä node:n käytölle.
npm tulee yleensä mukana node.js:n asennuksessa
Katso, että ympäristömuuttujat (esim. Windows:ssa Path tai $env:PATH) sisältävät viittauksen kansioon, jossa npm-sovellus on.
Varmista, että npm asennettu oikein kirjoittamalla:
Tulosteena saat tiedon npm:n versiosta, esimerkiksi:
Omalla kokemuksellani npm on monipuolisin ja tehokkain pakettienhallintajärjestelmä, mitä olen ikinä käyttänyt. Esimerkiksi pakettien väliset riippuvuudet voidaan hallita moduulikohtaisesti ja riippuvuudet asentuvat automaattisesti. Lisäksi yksittäinen sovellus voi sisältää komponenttiensa kautta riippuvuuksia samojen kirjastojen eri versioihin, vaikka versiot olisivat keskenään epäyhteensopivia. Versioinnista saa myös semanttisen semver-lisäsovelluksella (http://npmjs.org/doc/semver.html). Myös pakettien listaus ja poistaminen ovat triviaaleja toimenpiteitä npm:llä.
Listaa kaikki asennetut paketit (suhteessa työhakemistoon):
Asenna express.js:
npm asentaa paketit aina node_modules-kansioon, riippuen valitsimista ja työhakemistosta:
Jos työhakemistossa on package.json-tiedosto, paketti asennetaan työhakemistoon node_modules-kansioon
Jos työhakemistossa ei ole package.json-tiedostoa, paketti asentuu ../node_modules-kansioon, jolloin se on kaikkien rinnakkaisten projektien käytettävissä
Tarvittaessa paketin voi pakottaa asentumaan globaalisti. Tällöin npm:lle on annettava lisäoptio -g. Globaalien pakettien sijainti on käyttöjärjestelmäkohtainen.
Kun npm:llä asennettuja paketteja käytetään osana sovelluksia, etsitään soveltuvaa pakettien vastaavassa järjestyksessä: ensisijaisesti ladataan projektikohtainen paketti ja vasta sen jälkeen haetaan vaihtoehtoja ylätason kansioista sekä globaaleista paketeista.
Lisävinkkejä npm:n käyttöön:
Jos haluat asentaa moduulin ja päivittää sen riippuvuudeksi package.json-tiedostoon, käytä -S -valitsinta (npm install -S [paketti])
node_modules kansion voi useissa tilanteissa sisällyttää versionhallintan, älä lisää sitä turhaan siis esim. .gitignore-tiedostoon (ks. http://www.mikealrogers.com/posts/nodemodules-in-git.html)
Komentoriviltä ajettavat skriptit asentuvat node_modules/.bin-kansioon
4. Yksinkertaisen web-sovelluksen toteutus
Käydään lopuksi läpi yksinkertaisen web-sovelluksen toteutus JavaScript-palvelinsovelluksena node.js:n avulla. Käytämme sovelluksen toteutukseen express.js-sovelluskehystä (http://expressjs.com). Kattavampi opas kehyksen käyttöön löytyy sen omaasta oppaasta (http://expressjs.com/guide.html).
4.1. Toteutus
Uuden projektin luonti tapahtuu komennolla express:
express hellojs
Projektin luonnin yhteydessä sovellukselle luodaan oletuksena seuraavanlainen runko:
Runkoa sovelletaan seuraavasti:
Kansioon public sijoitetaan julkisesti jaettavat (staattiset) tiedostot (kuvat, CSS, HTML, jne.)
routes sisältää ohjaimet, jotka määrittevät, kuinka palvelun eri URL-osoitteet käsitellän (MVC-mallin mukaisesti Controller)
views kansioon sijoitetaan näkymien toteutus HTML:llä. Oletuksena Express käyttää näkymissä Jade-merkkausta (http://jade-lang.com/).
app.js sisältää sovelluksen rungon. Myös sovelluksen konfiguroinnit eri ympäristöihin (testaus, tuotanto) upotetaan oletuksena tähän tiedostoon.
package.json-tiedosto kuvaa vasta luodun express-sovelluksen metatiedot erityisesti pakettienhallintaa varten. Myös sovelluksen riippuvuudet node-moduuleihin kannattaa kuvata tähän tiedostoon.
Jotta voit kokeilla luomaasi sovellusta on sinun ensin kuitenkin asennettava siihen liittyvät riippuvuudet komennolla:
Esimerkiksi jade on ulkoinen riippuvuus, joka pitää tällä tavalla asentaa.
Pääset nyt testaamaan sovellustasi ajamalla sen node:lla.
Avaa sovellus selaimeesi syöttämällä siihen osoite http://localhost:3000/
Linkkivinkkejä Express.js-sovelluskehykseen:
Express.js:n oma opas: http://expressjs.com/guide.html
Ohjevideoita: http://expressjs.com/screencasts.html
4.2. Sovelluksen laajentaminen kirjastoilla
Suosituksia kirjastoista käytettäväksi Express.js:n kanssa:
Yhdistäminen SQL-tietokantoihin: Sequalize (http://sequelizejs.com/)
MongoDB:n käyttö: Mongoose ODM (http://mongoosejs.com/)
Käyttäjätunnistus: Everyauth (http://everyauth.com/) tai Passport.js (http://passportjs.org/)
Istuntojen tallentaminen Redis-tietokantaan: connect-redis (https://github.com/visionmedia/connect-redis)
Vastaava MongoDB:lle: connect-mongodb (https://github.com/masylum/connect-mongodb)
5. Node-sovellusten julkaiseminen
5.1. LAMP ja jaetut palvelinympäristöt
Node.js-sovelluksien julkaiseminen web-palveluna on poikkeuksellisen hankalaa. Tyypillisesti erityisesti jaetuissa palvelinympäristöissä ylläpidetään valmista LAMP-pinoa (Linux, Apache, MySQL, PHP). Käytännössä node on asennettava palvelimelle näiden rinnalle. Node sisältää itsessään jo myös web-palvelimen, joten sitä ei sellaisenaan voi esimerkiksi Python-sovellusten tavoin ajaa esimerkiksi Apache-palvelimella.
Node.js-sovellusten julkaisun tekee myös haastavaksi se, että node itsessään ei ota kantaa siihen, miten esimerkiksi sovellukset skaalautuvat. Tavallisesti web-palvelimet ovat säikeistettyjä: esimerkiksi Apachelle voi määritellä, kuinka monta säiettä palvelin tarvittaessa avaa rinnakkain. Node-sovelluksien skaalaus tapahtuu esimerkiksi ajamalla samaa sovellusta rinnakkain, esimerkiksi useissa eri porteissa siten, että edustapalvelimella (proxy) hoidetaan pyyntöjen reititys vapaalle instanssille.
Node-sovellusten etuna on toisaalta myös julkaisuvaiheessa niiden keveys ja mahdollisuus tavalliseen HTTP-palvelimeen liittyen rajoitusten kiertämiseen. Esimerkiksi Web Socket -sovellusten toteutus node:n avulla on huomattavan helppoa. Koska node:n ajoympäristö on lisäksi suhteellisen kevyt, ei node aseta palvelimelle teknisesti kovia vaatimuksia.
5.2. Julkaisu pilvialustalle
Kaikista helpoin tapa node-sovellusten julkaisuun on valmiin pilvijulkaisualustan käyttö. Suomalaiset palveluntarjoajat eivät kirjoitushetkellä pilvialustoja tarjoa, mutta kansainvälisesti vaihtoehtoja node:llekin on jo runsaasti. Erityisesti seuraavat alustat tukevat nodea:
Joyent (http://www.joyent.com/)
Nodejitsu (http://nodejitsu.com/)
Heroku (https://devcenter.heroku.com/articles/nodejs)
Windows Azure (http://www.windowsazure.com/en-us/develop/nodejs/tutorials/deploying-with-cloud9/)
Maininnan arvoinen projekti on myös Nodester (https://github.com/nodester/nodester), joka kehittää avoimen lähdekoodin julkaisualustaa node:lle. Nodester on saatavilla myös palveluna (http://nodester.com), mutta itse palveluun kannattaa suhtautua lähinnä teknologiademona.
5.2.1. Esimerkki: sovelluksen julkaisu Heroku-alustalle
Herokun käyttö vaatii paikallisesti asennettavan työkalukirjaston (https://toolbelt.herokuapp.com/). Kirjaston avulla node-sovelluksia voi viedä ajoon Heroku-pilvialustalle helposti komentorivin avulla.
Periaatetasolla projektiin liitetään Procfile-tiedosto, joka kuvaa, mitä sovelluksia alustalla halutaan ajaa. Esimerkiksi, jos haluat ajaa app.js:ää node:n avulla, kirjoita Procfileen sisältö:
Herokun asennus perustuu git-versionhallinnan hyödyntämiseen. Jos projektisi ei ole vielä versioituna git:ssä, lisää se seuraavasti:
Tämän jälkeen voit luoda Herokuun sovelluksellesi ajoympäristön:
Ajoympäristön luonti liittää git:iin uuden etäkohteen heroku. Voit julkaista palvelun pilveen päivittämällä tämän etäkohteen komennolla:
Samassa yhdessä, kun git lähettää palvelimelle uuden version, Heroku asentaa myös automaattisesti package.json:ssa kuvatut riippuvuudet, sekä suorittaa myös muut tarvittavat alustustoimenpiteet. Tästäkin syystä on tärkeää, että node_modules-kansiota ei sijoiteta versionhallintaan!
Kun asennus on valmis, saat sovelluksen auki paikallisessa selaimessasi komennolla:
Sovelluksen tila näkyy komennolla:
Vastaavasti lokitiedot näkyvät komennolla:
Sovelluksen skaalaus useammalle prosessille on Herokussa todella helppoa. Jos sovelluksesta halutaan ajaa esimerkiksi 5 instanssia, voit kutsua komentoa:
heroku ps:scale web=5
Node:n ajoympäristö voidaan vaihtaa config komennnolla. Esimerkiksi, jos sovellus halutaan ajaa tuotantoympäristössä, voidaan ajaa:
Lisätietoja ja tarkemmat ohjeet Herokun käytöstä: https://devcenter.heroku.com/articles/nodejs
5.3. Julkaisu omalla palvelimella (Linux)
Node-sovellusten julkaiseminen omalla palvelimella vaatii hieman virittelyä, mutta ei ole missään määrin kovin hankalaa. Käymme tässä läpi muutamia lisäkirjastoja, joiden avulla julkaisu sujuu jouhevammin.
Lyhyenä yhteenvetona suosittelen seuraavaa:
Aloita forever:llä
Ota käyttöön upstart ja monit vasta, jos tarve vaatii
5.3.1. forever
Jotta sovelluksen kaatuminen ei lopettaisi palvelun toimintaa, on node-sovelluksien kaatumista jollain tavalla valvottava. Yksi hyvä sovellus tähän tarkoitukseen on forever (https://github.com/nodejitsu/forever/).
Aloita asentamalla forever npm:llä:
Voit nyt ajaa forever-sovelluksia valvotusti forever:llä:
Forever mahdollistaa myös sovellusten tausta-ajon:
Näet ajossa olevat sovellukset kommennolla:
Vastaavasti sovellukset saa pysäytettyä komennolla:
5.3.2. upstart
Pelkkä foreverin käyttö ei riitä, mikäli haluat, että sovelluksesi pysyvät pystyssä myös palvelimen uudelleenkäynnistyksen jälkeen. Tätä varten tarvitset käyttöösi esimerkiksi upstart:in.
Upstart (http://upstart.ubuntu.com/) on tapahtumapohjainen vaihtoehto Linuxissa yleisesti käytetylle /sbin/init daemonille. Upstarttia käytetään init:n tavoin pitämään huolta, että palvelimella pyörivät palvelut pysyvät pystyssä hallitusti, sulkeutuvat kun palvelin suljetaan sekä käynnistyvät uudelleen palvelimen uudelleenkäynnistyksen yhteydessä. Upstartin saa käyttöön helposti ainakin Ubuntu, Fedora ja Debian -jakeluissa.
Aloita asentamalla upstart:
Luo sovelluskohtainen upstart-konfiguraatiotiedosto, esim. Ubuntu 10.10:ssä /etc/init/app.conf (vrt. http://calip.so/installing-as-upstart-service.html):
description "Node-sovellus"
exec sudo -u username sh -c "NODE_ENV=production /usr/sbin/node app &gt;&gt; /var/www/app/logs/upstart.log 2&gt;&amp;1"
Esimerkissä säädöt ovat seuraavanlaiset:
Palvelu säädetään käynnistymään järjestelmän käynnistyessä ja sulkeutumaan sen sammuessa
Käynnistystä varten odotetaan ensin, että paikallinen tiedostojärjestelmä ja verkkoyhteys on buutattu
Palvelu sijaitsee hakemistossa /var/www/app
Upstart käynnistää palvelun käyttäjänimellä username
Node-ympäristö asetetaan tuotantotilaan (production)
Palvelun lokitiedot tallentuvat tiedostoon /var/www/app/logs/upstart.log
Asetuksella respawn upstart valvoo prosessia ja käynnistää sen uudelleen, mikäli se kuolee
Jos prosessi joudutaan käynnistämään uudelleen 3 kertaa 60 sekunnin aikana, lopettaa upstart uudelleenkäynnistysyritykset (respawn limit 3 60)
Tämän jälkeen voit käynnistää sovelluksesi upstartin avulla palveluna kutsumalla:
sudo start app
Palvelun tilan saa esille vastaavasti:
sudo status app
Uudelleenkäynnistys:
Ja pysäytys:
sudo stop app
5.3.3. monit
Vinkkejä monit:n käyttöön upstart:n kanssa:
http://wellconsidered.be/post/10519709073/node-js-with-upstart-and-monit
jsalonen 2012-12-08: Täydennyksiä upstart-ohjeisiin
jsalonen 2012-09-18: Korjattu sisältö ajan tasalle. Lisätty tietoa upstart:sta ja monit:sta.
jsalonen 2012-06-08: Lisätty tietoa npm:stä (-S valitsin ja .bin-kansio; kiitos @mutru vinkistä!)
jsalonen 2012-06-05: Lisätty johdanto sekä kuvaukset Cloud 9 IDE:stä ja Nidestä. Huomioitu, että node_modules:ia ei suositella enää lisättäväksi ignoreen [1] ja ettei myöskään globaalien pakettien käyttöä enää suositella. Kiitos palautteista @supertopi ja @Zharktas!