Jaxer aneb pokročilý JavaScript na straně serveru

Společnost Aptana vydala nedávno Jaxer 1.0, ostrou verzi svého „ajaxového serveru“. Základem je zdrojový kód Firefoxu 3 s doplněným rozhraním k databázím a souborovému systému. To umožňuje psát aplikace v JavaScriptu i na straně serveru, zbavit se přeskakování mezi jazyky a opakovaně využít část zdrojového kódu na obou stranách (např. validace). Přestože to není jediný pokus o server-side JavaScript, pravděpodobně patří k těm nejvíc životaschopným.

Jaxer je vytvořen jako modul pro webový server Apache a vydán pod licencí GPL. Tím, že je založen na jádru Firefoxu, získáváme na serveru i pokročilý JavaScript (označovaný jako verze 1.8). Jaxer přidává serverové API pro databáze, soubory, logování, procesy, e-mail, síťovou komunikaci a pomocné funkce.

V případě, že to bude vývojář potřebovat, může na straně serveru dokonce provádět manipulaci s DOM a používat známé knihovny Prototype, Scriptaculous, jQuery, Dojo, ExtJS apod. Já si však myslím, že to je spíš nouzové řešení, protože by spotřebovávalo zbytečně mnoho zdrojů na serveru. Proto se používání těchto knihoven na serveru vyhýbám.

Aptana Jaxer

AJAX jako prosté zavolání funkce

Vlajkovou lodí Jaxeru je jeho schopnost umístit vybrané funkce na server a přímo je volat z klientské strany. Jaxer se sám postará o komunikaci a serializaci. Funkce, které mají být umístěny na serveru a volány z klienta, stačí vložit do skriptu s atributem  runat="server-proxy".

V následujícím příkladu je tímto způsobem definována funkce item, která vrátí jednoduchý objekt odvozený z argumentu. V praxi by zde proběhl např. dotaz do databáze.

<script runat='server-proxy'>
  function item(id){
    return {
    recordId: id,
    moneyAmount: id * 100
    };
  }
</script> 

Pro využití dat ze serverové funkce vytvoříme na klientské straně funkci show, která zobrazí odpověď na webové stránce. Funkci přidáme parametr response, do níž nám Jaxer umístí objekt vrácený serverovou funkcí.

function show(response) {
    document.getElementById('asynchro').innerHTML += response.moneyAmount;
} 

Nyní už zbývá jenom asynchronně zavolat z klienta serverovou funkci. K tomuto účelu pro nás Jaxer vytvořil na klientovi proxy funkci, kterou nazval stejně jako její serverový protějšek – item. My na ní zavoláme metodu async. Jako první argument jí předáme funkci pro obsluhu odpovědi (funkce show). Jako ostatní argumenty jí předáme hodnoty, které chceme předat serverové funkci (v našem případě jenom id, např. číslo 5):

item.async(show, 5); 

Jaxer teď zavolá funkci item a jako argument jí předá číslo pět. Funkce item toto číslo převezme, vytvoří podle něho objekt ( {recordId: 5, moneyAmount: 500}) a vrátí ho. Funkce show dostane tento objekt jako svůj parametr (response) a zobrazí na stránce jeho peněžní částku  response.moneyAmount.

To je všechno, co jsme museli udělat pro případ asynchronního zavolání funkce. Pokud by nám stačilo zavolat serverovou funkci z klienta synchronně, byl by celý postup ještě jednodušší – pouhé zavolání funkce:

response = item(7);
document.getElementById('synchro').innerHTML += response.moneyAmount; 

Prohlédnout si můžete kompletní zdrojový kód tohoto příkladu (asynchronní i synchronní verze) včetně podoby HTML dokumentu, který Jaxer zašle klientovi.

Kategorie dostupnosti zdrojového kódu

Dostupnost zdrojového kódu lze v Jaxeru detailně řídit atributem runat skriptu. Tento atribut může nabývat hodnot:

  • server
  • server-proxy
  • server-nocache
  • both
  • both-proxy
  • both-nocache
  • client

Skript samotný může být přímo vložený do HTML stránky nebo být uvedený jako externí soubor.

Případ server-proxy jsme viděli v ukázce. Taková funkce běží na serveru a lze ji volat pomocí proxy funkce z klienta. Nelze ji volat přímo na klientovi. Na klientovi ani není dostupný její zdrojový kód. To je důležité z bezpečnostních důvodů, takto označíme např. funkce pro přihlášení, u kterých nechceme zbytečně poskytovat vodítka pro napadení serveru.

Hodnota server znamená, že funkce bude dostupná pouze na serveru, a to při základním zpracování stránky i v době callbacků (AJAXu) na tuto HTML stránku (tj. serverová funkce volaná z klienta přes proxy bude schopna na serveru zavolat tuto naši „čistě serverovou“ funkci).

Hodnota server-nocache znamená, že funkce bude dostupná pouze na serveru a nebude na ní vytvořena proxy funkce. Navíc bude dostupná pouze při základním zpracování HTML stránky, nikoliv v době callbacků.

Hodnota both, both-proxy a both-nocache přidává k server variantě schopnost běžet přímo na klientovi. Hodnota client (nebo vynechání atributu runat) znamená, že uvedený zdrojový kód poběží pouze na klientovi (klasický klientský JavaScript).

K dispozici je ještě atribut autoload, který umožňuje automaticky načíst serverový skript pro fázi callbacků. V tomto případě budou k dispozici funkce onoho skriptu a navíc bude vykonán jakýkoliv jeho javascriptový zdrojový kód.

Závěr

Z hlediska zkušeností lze říct, že v Jaxeru v současnosti vyvíjím jednu aplikaci a mám ji v docela pokročilém stadiu. Jaxer mi připadá ze všech server-side javascriptů nejživotaschop­nější.

Zdroje

Použili byste někdy Jaxer?
Komentáře: 10

Přehled komentářů

benzin A jak je to s vykonosti?
Ladislav Mrňák Re: A jak je to s vykonosti?
Ladislav Mrňák Re: A jak je to s vykonosti?
benzin Re: A jak je to s vykonosti?
Anonym Redakčně smazáno
Kája Jak to vypadá s ECMAScript 4/JavaScript 2?
Martin Hassman Re: Jak to vypadá s ECMAScript 4/JavaScript 2?
Ladislav Mrňák Re: Jak to vypadá s ECMAScript 4/JavaScript 2?
Anonym Js & jaxer
Ladislav Mrňák Re: Js & jaxer
Zdroj: https://www.zdrojak.cz/?p=2932