2011-12-13 27 views
5

Trong một trong các dự án của tôi, tôi phải viết mã HTML & JavaScript. Thay vào đó, tôi thích sử dụng ngôn ngữ được nhập tĩnh hơn, vì vậy tôi đang đánh giá OPA. Tuy nhiên, mục tiêu của tôi là tạo một tập hợp các trang tĩnh, vì vậy tôi không quan tâm đến máy chủ OPA HTTP và lớp liên tục.tạo các trang tĩnh trong OPA

Vì vậy, đây là câu hỏi của tôi: có cách nào (dễ) để tạo tập hợp các trang tĩnh trong OPA không?

Trả lời

5

Nếu tôi hiểu chính xác, bạn muốn xây dựng cho bạn xhtml với Opa, nhưng thay vì phục vụ, hãy in nó thành tệp?

Chúng tôi có 2 chức năng cho rằng:

Sự khác biệt giữa những 2 chức năng, là người đầu tiên sẽ không tạo mã OPA liên js.

Sau đó, bạn có thể viết chuỗi kết quả vào tệp HTML trên đĩa.

Lưu ý rằng chúng tôi không cung cấp bất kỳ phương pháp nào để viết tệp trong đĩa trong stdlib của chúng tôi. Bạn phải sử dụng hệ thống phòng thí nghiệm BSL cho rằng:

write = %%BslFile.of_string%% 

Một ví dụ nhỏ:

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) 

Biên dịch và chạy: opa static.opa --

này sẽ tạo ra 5 trang html.

+0

Ngọt ngào! Điều gì sẽ xảy ra nếu bạn gọi một số hàm JavaScript trong 'xhtml_page' (như' {Random.int num} ')? Có cách nào để đảm bảo rằng trang được tạo sẽ không chứa một số mã JavaScript sẽ cố gắng liên lạc với máy chủ không? – Thomas

+0

Sẽ không có giao tiếp máy chủ với 'Random.int' (trong ví dụ của tôi) vì nó sẽ được thực thi khi bạn tạo trang của mình. – Fred

+0

Bạn có thể có giao tiếp "máy chủ" nếu bạn đính kèm trình xử lý sự kiện vào một số phần xhtml (ví dụ ''), nhưng nếu bạn sử dụng 'Xhtml.serialize_as_standalone_html', các hành động đó sẽ bị xóa khỏi xhtml , do đó sẽ không có cuộc gọi máy chủ. Nó phụ thuộc vào html bạn muốn tạo ra. Lưu ý rằng bạn không thể tạo thứ gì đó như vì Opa cấm nó. – Fred

0

Thomas, tôi cho rằng bạn muốn sử dụng Opa cho mã (thay vì JS), đúng không?

Có chỉ là một loạt các trang tĩnh sẽ không thể là một cách sử dụng tiêu biểu cho ngôn ngữ, nhưng chắc chắn bạn có thể làm điều đó một cách dễ dàng:

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

Trên đây là một chương trình Opa đầy đủ (S4 style) mà sẽ chỉ phục vụ tĩnh nội dung của thư mục tài nguyên (bao gồm HTML).

Kịch bản thông thường hơn sẽ là sử dụng cơ chế Templating của Opa (đánh dấu chấp nhận một tập hợp con lớn của HTML).

Hy vọng điều đó sẽ hữu ích.

+0

Không thực sự. Những gì tôi muốn là viết một tệp .opa duy nhất để tạo ra một loạt các trang tĩnh. Tôi rất vui khi chỉ sử dụng một tập hợp con các tính năng OPA (ví dụ, tôi không cần bất kỳ loại giao tiếp nào).Sau đó, các trang tĩnh có thể được phục vụ bởi bất kỳ máy chủ HTTP nào. – Thomas

+0

Bạn có nghĩa là bạn muốn _programatically_ tạo các trang đó? (ví dụ: có một chương trình tạo ra một loạt các trang tĩnh?) – akoprowski

+0

Vâng, chính xác! Tất nhiên, tôi có thể viết ứng dụng của tôi, chạy nó cục bộ, và sau đó sử dụng wget để có được một loạt các trang tĩnh (và các tài nguyên của họ) ... nhưng sau đó tôi cần phải dựa vào trình biên dịch OPA để không bao gồm bất kỳ giao tiếp phía máy chủ nào xây dựng trong các trang được tạo. – Thomas

2

Bạn có thể sử dụng Xhtml.precompiled. Nó lấy một giá trị xhtml và cho bạn trở lại một xhtml được biên dịch trước (nội bộ đã được san phẳng thành một chuỗi).

Điều này hữu ích khi một phần của trang web tĩnh trong khi phần còn lại là động. Bạn có thể tránh phải trả một số chi phí (serialization, memory ...) cho phần tĩnh.

Các vấn đề liên quan