2011-12-13 58 views
5

在我的一個項目中,我必須編寫HTML代碼爲&的JavaScript代碼。我寧願使用靜態類型語言,所以我正在評估OPA。但是,我的目標是生成一組靜態頁面,所以我不關心OPA HTTP服務器和持久層。在OPA中生成靜態頁面

因此,我的問題是:是否有一種(簡單)的方式來生成OPA中的靜態頁面集合?

回答

5

如果我理解正確,你想用Opa構建你的xhtml,但不是服務,打印到文件中?

我們有該2個功能:

那些2個功能之間的差別是,第一個不會產生相關的OPA js代碼。

然後,您可以將結果字符串寫入磁盤上的HTML文件。

請注意,我們不提供任何方法在stdlib中的磁盤中寫入文件。 你必須使用的BSL系統:

write = %%BslFile.of_string%% 

一個小例子:

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) 

編譯並運行:opa static.opa --

這將產生5個html頁面。

+0

甜!如果你在'xhtml_page'中調用了一些JavaScript函數(如'{Random.int num}'),會發生什麼?有沒有辦法確保生成的頁面不會包含一些JavaScript代碼,它將嘗試與服務器進行通信? – Thomas

+0

不會有'Random.int'的服務器通信(在我的例子中),因爲它會在您生成頁面時執行。 – Fred

+0

如果您將事件偵聽器附加到某個xhtml部件(例如''),那麼您可以進行「服務器」通信,但是如果您使用'Xhtml.serialize_as_standalone_html',那麼這些操作將從xhtml ,因此不會有服務器呼叫。這取決於你想要生成的html。請注意,您不能生成類似因爲Opa禁止它。 – Fred

0

托馬斯,我想你想用Opa代碼(而不是JS),對嗎?

有隻是一堆靜態網頁不會是對語言的典型使用,但相信你能做到這一點很容易:

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

上面是一個完整的OPA程序(S4 style),將只服務靜態地顯示資源目錄的內容(包含HTML)。

更傳統的情況是使用Opa的模板機制(一種接受HTML大集合的標記)。

希望有所幫助。

+0

不是。我想要的是編寫一個.opa文件來生成一堆靜態頁面。我很高興只使用OPA功能的一個子集(例如,我不需要任何形式的通信)。然後,靜態頁面可以由任何HTTP服務器提供服務。 – Thomas

+0

你的意思是你想_programatically_生成這些網頁? (即有一個程序可以生成一堆靜態頁面?) – akoprowski

+0

是的,確切!當然,我可以編寫我的應用程序,在本地運行它,然後使用wget獲取一堆靜態頁面(以及它們的資源)......但是,我需要依賴OPA編譯器不包含任何服務器端通信在生成的頁面中構造。 – Thomas

2

您可以使用Xhtml.precompiled。它需要一個xhtml值,並給你一個預編譯的xhtml(內部已經扁平化爲一個字符串)。

當網頁的一部分是靜態的,而其餘部分是動態的時,這是有用的。 您可以避免爲靜態部分支付一些費用(序列化,內存...)。