En ole kirjoittanut pitkään aikaan mitään Djangosta tai Railsista, koska minusta vaikuttaa, että ne ovat "valmiita" ja olen oppinut käyttämään kumpaakin melko kattavasti. Molemmissa on puutteensa ja molemmat kehittyvät edelleen, mutta mitään todella mullistavaa ei ole tapahtunut pitkään aikaan.

Sen sijaan Node.js on tällä hetkellä hyvinkin nopeatempoisessa ja mielenkiintoisessa kehitysvaiheessa. Sekä Node että NPM (Node Package Manager) ovat nykyään osana Ubuntu 12.04 LTS -käyttöjärjestelmää, joten oman Node-palvelimen pystyttäminen on hyvin yksinkertaista. Samaten Mac OS X:ssä Node on helppo asentaa Homebrew:llä.

Node-pohjaisia webbisovelluksia on tehty perinteisesti Expressillä, joka tarjoaakin siihen hyvän pohjan. Express on kuitenkin yhtä abstraktiokerrosta alempana kuin Rails ja Django. Se ei tiedä mitään MVC:stä, ellei ohjelmoija itse rakenna omaa MVC-frameworkiaan kontrollereineen ja tietomalleineen sen päälle.

Ratkaisuksi tähän puutteeseen on ilmestynyt ainakin kaksi vakavasti otettavaa projektia: RailwayJS ja Tower.js. Olen viime aikoina pohtinut kumpaa kannattaisi käyttää ja päädyin itse RailwayJS:ään. Kummassakin on kuitenkin yhä paljon puutteita ja on mahdotonta sanoa, tulevatko ne koskaan breikkaamaan todella isoiksi open source -projekteiksi laajoine ekosysteemeineen.

Luin aluksi tämän vertailun: Stack Overflow: RailwayJS vs. Tower.js. Sen perusteella molemmista frameworkeista löytyy samankaltaisia ominaisuuksia ja Tower on niistä ehkä vähän kunnianhimoisempi. Siksi halusin kokeilla kumpaakin. Vaatimuksenani oli lähinnä, että generoidun sovelluksen pitää olla CoffeeScriptiä ja sen tietomallin pitää tukea MongoDB:tä tietokantana. Lisäksi pidän sitä hyvänä asiana, että HTML/CSS-koodi generoidaan automaattisesti Twitter Bootstrap -pohjaiseksi.

* * *

Tower.js oli käytännössä pettymys. Sillä generoitu web-sovelluspohja näytti rumalta. Tyylipohjana on (kuten Railwayssakin) Twitter Bootstrap, mutta sitä on käytetty "väärin". Esimerkiksi lomakkeissa käytetään <ol>-listoja, jolloin jokaisen kentän eteen tulee järjestysnumero, jopa submit-painikkeen eteen! Muutenkin yleisvaikutelma oli, että generoitu HTML ei hyödyntänyt kunnolla Bootstrappia ja näytti vähän ikävältä.

Pahinta tässä oli se, että esimerkiksi nuo mainitut <ol>-listat on Towerissa koodattu kiinteäksi osaksi formFor-helperiä. Niitä ei siis voi helposti korvata omalla template-koodilla sovelluksessaan, jos haluaa käyttää formForia. Minulta loppui kesken energia selvitellä miten asia olisi korjattavissa muuten kuin puukottamalla Towerin lähdekoodia, joten siirryin RailwayJS:n pariin.

* * *

RailwayJS on pinnallisesti paljon Toweria siistimpi kokemus. Sen generoima Bootstrap-pohjainen sovellus näyttää nätiltä ja käyttää elementtejä ja tyylejä oikein.

Railwayn ongelmat alkavatkin näkyä sitten, kun mennään konepellin alle. Ihmettelin pitkään esimerkiksi sitä, miksei tietokanta-asetusten muuttaminen MongoDB:ksi vaikuttanut mitään. Sitten huomasin, että jos tietokanta-asetuksissa on pienikin virhe, niin Railway ei anna mitään virheilmoitusta, vaan käyttää vain oletusarvoaan (in-memory datastore). Tämä viittaa ikävästi siihen, että Railway voi olla huolimattomasti ohjelmoitu ("pinnalta korea, sisältä mätä", vähän niinkuin WordPress).

Seuraava ongelma tuli vastaan tietomallien beforeXxx-operaatioissa. RailwayJS käyttää tietomallien pohjana JugglingDB-ORM-kirjastoa. Se on ilmeisesti vielä melko epästabiili, sillä en onnistunut kovalla yrittämiselläkään päivittämään beforeSavessa tai beforeCreatessa tietomallini päivämääräkenttiä. Tuli nopeasti sellainen tunne, että sovelluksessa ei uskalla luottaa siihen, että beforeSave ja beforeCreate käsiteltäisiin luotettavasti joka tilanteessa, mikä taas on aika ehdoton edellytys MVC-pohjaiselle sovelluskehitykselle.

* * *

Yhteenvetona toteaisin siis, että Node.js:lle on saatavilla erilaisia MVC-frameworkeja ja niistä löytyy jo paljon hyviä ominaisuuksia, mutta ne eivät ole vielä lähelläkään Expressin kypsyystasoa. Päädyin tässä vaiheessa RailwayJS:ään lähinnä sen vuoksi, että minulle on tärkeää, että sovellusten HTML on kunnossa. Isompaa ja vakavampaa projektia en kuitenkaan uskaltaisi sillä lähteä vielä tekemään, vaan käyttäisin joko Expressiä tai Expressin ja Djangon yhdistelmää.