Schizofrene code met node.js
This post was originally published on Coding Glamour.
Allereerst een kleine update, op 1 oktober ben ik overgestapt van de
de gevestigde ordenaar de wondere wereld van een startup. Niet alleen cultureel een verschil, maar
ook een shift van .NET naar javascript, van Solr naar Redis, van SVN naar
Git en van een Xeon workstation naar een Macbook Air. En nog belangrijker,
van tafeltennis naar tafelvoetbal. Voor de mensen die niet 74 feeds in
Google Reader hebben zitten: Cloud9 is een IDE, vergelijkbaar met Eclipse
of Visual Studio, maar volledig draaiend in de browser; het is 'c9.io'
intikken en gaan. Debugging, stack exploration, versiebeheer, you name
it.
Cloud9 is helemaal gebouwd in javascript, de client is gebouwd op APF, een open source framework voor web applicaties
dat intern is ontwikkeld (heeft wel wat weg van Webforms). De backend draait
op node.js, een event-based
framework voor het schrijven van server side applicaties in javascript.
Doordat node vanaf design geschreven is met het idee dat alle code event-driven
moet werken heb je bijna geen blocking calls, en kunnen je threads sneller
vrijgegeven worden: ergo: je kan meer requests handlen in je web server
(gesimplificeerde weergave
).
Direct spelen met alle code
Het leuke van werken aan een IDE is dat je features die je zelf handig
vind gewoon kan inbouwen, zoals het met een klik laten klonen van de GitHub
repository waar alle code samples uit de blogpost zitten. Ergo, om alle
code uit deze post in hun echte context te zien en meteen te runnen klik
hieren druk hierna op 'Run'.
Javascript, javascript, javascript
Werken met node.js heeft tot logisch gevolg dat je hele applicatie, van
caching-layer tot menu, en van syntax highlighting tot routing draait op
dezelfde code. En dat heeft tot gevolg dat het doel dat Microsoft ooit
voor ogen had met Microsoft Volta:
Schizofrene modulesMicrosoft heeft een eerste community technology preview van het ASP.net-framework Volta uitgebracht. Met het pakket hoeven ontwikkelaars zich niet meer over de scheiding tussen server- en clientside code druk te maken.
Tijd voor code! Hier een heel simpele javascript module die werkt met RequireJS: calc.js.
An sich een normale module, alleen gewrapped in een functie 'define', waardoor deze on demand in te laden is.
Client side gebruiken
Client side usage is eenvoudig, je include RequireJS en vraagt daarna je modules op:
En nu server side!
Als je de app runt, vind je op /calc?1&2 de server side weergave van deze module:
Als web framework bovenop node.js gebruik ik hier connect, deze heeft een routing module die werkt als:
Om RequireJS modules te gebruiken in node.js hebben we een gemockte versie van de 'define' functie nodig, deze zie je op line 1:
Hierna zijn RequireJS modules in te laden via de normale 'require' functie in node.js (die synchronous is, en zonder callback werkt). Je kunt nu de module opvragen en de beschikbare functies server side aanroepen.
En dit is handig omdat?
De code editor die onderdeel is van Cloud9, en inmiddels ook integraal onderdeel van GitHub is heet Ace, en wordt volledig opgebouwd in javascript. Toen ik een server side highlighter nodig had kon ik met 36 regels code de view-only versie van de editor aanbieden aan iedereen zonder dependencies op javascript!
jQuery en de DOM
Ook werken met de DOM is mogelijk. Zie bijvoorbeeld mijn zeer intelligente jQuery plugin. Standaard formaat en geen extra code geschreven. Op de client kan je hem gebruiken zoals je elke jQuery plugin gebruikt.
Om deze plugin zijn werk server side te laten doen hebben we een server side implementatie van de browser nodig: jsdom. Je kunt deze aanroepen via 'jsdom.env', en een aantal script dependencies meegeven die direct gebruik maken van de DOM:
Tah dah!
Hopelijk heeft dit jullie nieuwsgierigheid gewekt want het geeft een geweldig gevoel om (bijvoorbeeld) validatie code nog maar 1 keer te schrijven waarna je de echte validatie zowel client- als server side kan uitvoeren. Daarnaast is het ook gewoon heel cool om webapplicaties in een browser te schrijven. Have fun Nogmaals: om de samples direct live te zien: fork me! Klik op 'Run' en een web server met deze examples starten.
There are 16 comments on this article, read them on Coding Glamour.