2011-12-13 8 views
5

In uno dei miei progetti, devo scrivere il codice JavaScript HTML &. Preferirei usare un linguaggio tipizzato staticamente, quindi sto valutando OPA. Tuttavia, il mio obiettivo è generare una raccolta di pagine statiche, quindi non mi interessa il server HTTP OPA e il livello persistente.generazione di pagine statiche in OPA

Quindi ecco la mia domanda: c'è un modo (facile) per generare una raccolta di pagine statiche in OPA?

risposta

5

Se ho capito bene, vuoi costruire xhtml con Opa, ma invece di servire, stampalo in file?

Abbiamo 2 funzioni che:

Le differenze tra queste 2 funzioni, è che il primo non genererà codice OPA associato js.

Quindi è possibile scrivere la stringa risultante in un file HTML su disco.

Nota che non forniamo alcun metodo per scrivere un file su disco nel nostro stdlib. Devi usare il sistema BSL per questo:

write = %%BslFile.of_string%% 

Un piccolo esempio:

static.opa

write = %%BslFile.of_string%% 

xhtml_page(num:int) = 
    <p>Page {num}</p> 

pages = [1, 2, 3, 4, 5] 

do List.iter(i -> 
    xhtml_content = xhtml_page(i) 
    string_content = Xhtml.serialize_as_standalone_html(xhtml_content) 
    write("{i}.html", string_content) 
, pages) 

Compilare ed eseguire: opa static.opa --

Questo genererà 5 pagine html.

+0

Dolce! Cosa succede se chiami alcune funzioni JavaScript in 'xhtml_page' (come' {Random.int num} ')? C'è un modo per garantire che la pagina generata non contenga codice JavaScript che proverà a comunicare con il server? – Thomas

+0

Non ci sarà comunicazione del server con 'Random.int' (nel mio esempio) perché verrà eseguito quando si generano le pagine. – Fred

+0

È possibile avere una comunicazione "server" se si collega un listener di eventi a una parte xhtml (ad esempio ''), ma se si utilizza 'Xhtml.serialize_as_standalone_html' tali azioni verranno rimosse dal xhtml , quindi non ci sarà alcuna chiamata al server. Dipende da quale HTML si vuole generare. Nota che non puoi generare qualcosa come perché Opa lo proibisce. – Fred

0

Thomas, Suppongo che desideri utilizzare Opa per il codice (anziché JS), corretto?

Avere solo un mucchio di pagine statiche non sarebbe un uso tipico per la lingua, ma sicuramente si può fare facilmente:

Server.start(Server.http, { resources: @static_resource_directory("resources") }) 

Quanto sopra è un programma completo Opa (S4 style) che sarà solo servire staticamente il contenuto della directory delle risorse (incluso HTML).

Lo scenario più convenzionale sarebbe utilizzare il meccanismo di Templating di Opa (un markup che accetta un grande sottoinsieme di HTML).

Spero che questo aiuti.

+0

Non proprio. Quello che voglio è scrivere un singolo file .opa per generare un sacco di pagine statiche. Sono felice di utilizzare solo un sottoinsieme di funzionalità OPA (ad esempio, non ho bisogno di alcun tipo di comunicazione).Quindi, le pagine statiche possono essere servite da qualsiasi server HTTP. – Thomas

+0

Vuoi dire che vuoi _programmaticamente_ generare quelle pagine? (Ad esempio, un programma genera una serie di pagine statiche?) – akoprowski

+0

Sì, esattamente! Naturalmente, posso scrivere la mia applicazione, eseguirla localmente, e poi usare wget per ottenere un sacco di pagine statiche (e le loro risorse) ... ma poi ho bisogno di fare affidamento sul compilatore OPA per non includere alcuna comunicazione lato server costruisce nelle pagine generate. – Thomas

2

È possibile utilizzare Xhtml.precompiled. Prende un valore xhtml e ti restituisce un xhtml che è precompilato (internamente già appiattito su una stringa).

È utile quando una parte della pagina Web è statica mentre quella rimanente è dinamica. È possibile evitare di pagare alcuni costi (serializzazione, memoria ...) per la parte statica.

Problemi correlati