package eliom

  1. Overview
  2. Docs
Client/server Web framework

Install

Dune Dependency

Authors

Maintainers

Sources

10.1.0.tar.gz
md5=ab397324d7fc2251318c2c78fa31ddf5
sha512=27d56b5bddfc4e9056a0d167cfc7ffee3b1dbade1f76e53759b881a440a94f8a60515aa188c916d928d426f9762b81647a6d1d27be671ea4cdb67d66758470c6

Description

Eliom is a framework for implementing client/server Web applications. It introduces new concepts to simplify the implementation of common behaviors, and uses advanced static typing features of OCaml to check many properties of the Web application at compile-time. Eliom allows implementing the whole application as a single program that includes both the client and the server code. We use a syntax extension to distinguish between the two sides. The client-side code is compiled to JS using Ocsigen Js_of_ocaml.

Published: 28 Sep 2023

README

Eliom - the full-stack OCaml Web and mobile framework

Eliom is a framework for building client/server Web and mobile applications in OCaml.

It transforms OCaml into a multi-tier language, making it possible to implement both the server and client parts of a Web and mobile app as a single program.

This simplifies a lot the communication between server and client. Applications can run on any Web browser or mobile device (iOS, Android), saving from the need to develop one version for each platform.

Eliom has support for reactive pages (generated on server or client), advanced session mechanism, server to client communication, continuation based Web programming, etc.

Eliom is part of the Ocsigen project.

Installation Instructions

opam install eliom

Getting started

Defining a service on path /foo, taking any GET parameters:

let myservice =
  Eliom_service.create
    ~path:(Eliom_service.Path ["foo"])
    ~meth:(Eliom_service.Get (Eliom_parameter.any))
    ()

let () =
  Eliom_registration.Html.register ~service:myservice
    (fun get_params () ->
      Lwt.return
         Eliom_content.Html.F.(html (head (title (txt "")))
                                    (body [h1 [txt "Hello"]])))

Inserting a link towards that service, with parameters:

Eliom_content.Html.D.a ~service:myservice [txt "Home"] [("param1", "v1"); ("param2", "v2")]

Event handlers are written in OCaml:

div ~a:[a_onclick [%client (fun ev -> ... )]] [ ... ]

The client-side and server sides are written as a single program:

let%server a = ... (* code for the server part of the application *)

let%client b = ... (* code for the client part of the application *)

let%shared c = ... (* code that will be included in both parts *)

Using a server-side value in client-side code:

let%server a = ...

let%client f () =
  print_endline ~%a ; (* print in browser console *)
  ...

Calling a server function from the client program:

let%rpc f (x : int) : string Lwt.t = ... (* server-side code *)

let%client () =
  let%lwt r = f 4 in
  ...

Saving session data on the server using Eliom references:

let%server r = Eliom_reference.eref ~scope:Eliom_common.default_session_scope 0

let%server f () =
  let%lwt v = Eliom_reference.get r in
  Eliom_reference.set r (v + 1);
  ...

Where scope can be:

  • Eliom_common.default_session_scope (different value for each browser),

  • Eliom_common.default_process_scope (different value for each tab),

  • Eliom_common.default_group_scope (different value for each user),

  • Eliom_common.site_scope (value for the whole site),

  • Eliom_common.global_scope (global value for the whole server). Eliom references are persistant if you add optional parameter ~persistent to function Eliom_reference.eref.

Learning Eliom

More documentation here.

Write your first Web and mobile application with Eliom using Ocsigen Start

Authors

  • Vincent Balat

  • Jérôme Vouillon

  • Grégoire Henry

  • Pierre Chambart

  • Benedikt Becker

  • Vasilis Papavasileiou

  • Boris Yakobowski

  • Hugo Heuzard

  • Raphaël Proust

  • Jan Rochel

  • Idir Lankri

  • Stéphane Glondu

  • Gabriel Radanne

  • Gabriel Kerneis

  • Denis Berthod

  • Jaap Boender

  • Simon Castellan

  • Mauricio Fernandez

  • Archibald Pontier

  • Simon Castellan

  • Kate Deplaix

Dependencies (20)

  1. ppx_optcomp
  2. ocsipersist >= "1.0" & < "2.0"
  3. base-bytes
  4. reactiveData >= "0.2.1"
  5. ipaddr >= "2.1"
  6. ocsigenserver >= "5.1.0" & < "6.0.0"
  7. tyxml >= "4.4.0" & < "4.6.0"
  8. lwt_ppx >= "1.2.3"
  9. lwt_log
  10. js_of_ocaml-tyxml >= "3.6.0"
  11. js_of_ocaml-ppx_deriving_json >= "3.6.0"
  12. js_of_ocaml-ppx >= "3.6.0"
  13. js_of_ocaml-ocamlbuild build
  14. js_of_ocaml-lwt >= "3.6.0"
  15. js_of_ocaml >= "3.6.0"
  16. js_of_ocaml-compiler >= "3.6.0"
  17. ppxlib >= "0.15.0"
  18. ppx_deriving
  19. ocamlfind
  20. ocaml >= "4.08.0"

Dev Dependencies

None

Used by (2)

  1. ocsigen-start >= "6.1.0" & < "6.3.0"
  2. ocsigen-toolkit >= "1.1.0" & < "3.3.4"

Conflicts

None