OCaml 適合開發網頁了嗎?
是的,但有些部分仍不足
OCaml 傳統上以其在系統程式設計、形式驗證以及眾多學術領域中的應用而聞名,目前在網頁開發領域正穩步成熟。憑藉其強大的靜態型別、對不可變性的強調以及卓越的效能,它正逐漸成為主流網頁開發語言的可行替代方案。
用 OCaml 開發的網頁快速且具有型別安全!根據您的需求,您可以選擇使用整潔的伺服器端網頁框架,或為整合網頁和行動應用程式的創新全端解決方案。為了在瀏覽器中執行,OCaml 會編譯為 JavaScript 和 WebAssembly!
事實上,OCaml 已被用於支援許多生產環境的網路系統,例如 Ahrefs、OCaml.org 或 Be Sport 社群網路。
如果您考慮使用 OCaml 來開發下一個網頁應用程式,您應該知道您可能需要自己撰寫相當數量的程式碼,並且無法獲得其他語言中所有慣用功能的對應項目。特別是,OCaml 沒有現成的身分驗證解決方案,也沒有完全可投入生產的查詢產生器。如果您需要與外部服務或外部 API 互動,也可能會遇到一些挑戰。
然而,這種情況通常可以被該語言的優勢和某些工具的功能所節省的時間所彌補。該語言強大的型別系統將在編譯時消除許多問題(例如 HTML 一致性),從而為您節省大量的除錯時間。多層次程式設計等創新解決方案可以大幅簡化客戶端-伺服器之間的通訊。最後但同樣重要的是,OCaml 甚至可以讓您在單一程式碼中開發您的網頁和行動應用程式。
想幫忙嗎?
以下是一些可以幫助 OCaml 成為更強大的網頁應用程式候選者的專案
- 改進 ocaml-swagger,使其能夠為 Stripe 等熱門網頁 API 產生 API。
- 建立 OAuth2 客戶端函式庫。
- 建立 Azure 服務 API 的客戶端。
- 🟡 網頁框架
- 🟢 瀏覽器
- 🟡 WebAssembly
- 🟡 底層網頁堆疊
- 🔴 HTTP 客戶端
- 🟡 樣板引擎
- 🟡 靜態網站產生
- 🟡 行動應用程式
- 🔴 身分驗證
- 🟡 二進制協定
- 🟠 資料庫
- 🆘 國際化
- 🆘 訊息佇列與鍵值儲存
- 🟡 序列化器
- 🟡 聯合供稿/RSS
- 🆘 外部網頁 API
- 🟠 日誌
- 🟠 電子郵件
- 🟡 壓縮
- 🟡 加密
- 🟠 編碼與解碼
- 🟢:穩定、經過測試且成熟
- 🟡:正在進步中,穩定但仍在成熟中
- 🟠:尚未穩定,但正在發展中
- 🔴:不穩定/不完整,需要努力
- 🆘:幾乎沒有,需要大力投入
詳細資訊
🟡 網頁框架
用於建構 OCaml 網頁應用程式的網頁開發框架。
- dream 整潔、功能齊全的網頁框架
- eliom 進階的客戶端/伺服器網頁和行動框架
- opium OCaml 網頁框架
- sihl Sihl 網頁框架
- ocsigen-start 用於開發具有使用者、註冊、通知等功能的網頁和行動應用程式的高階函式庫
🟢 瀏覽器
OCaml 對在瀏覽器中執行具有出色的支援!Js_of_ocaml 編譯器會將 OCaml 轉換為 JavaScript,是一個自 2010 年以來就已建立的工具。它與現有的 OCaml 生態系統無縫整合,並支援許多生產應用程式。
此外,Melange 是 OCaml-JavaScript 編譯器領域中較新的成員。Melange 起源於 ReScript 的分支,可能沒有 Js_of_ocaml 的廣泛歷史記錄,但它建立在非常堅實的基礎之上,並且已經與 OCaml 建置系統 Dune 良好整合。
- js_of_ocaml 從 OCaml 位元組碼到 JavaScript 的編譯器
- melange 從 Reason/OCaml 產生 JS 的工具鏈
- brr OCaml 的瀏覽器程式設計工具組
- gen_js_api 用於 JavaScript 函式庫的簡易 OCaml 綁定
- ts2ocaml 透過 TypeScript 編譯器 API 從 TypeScript 定義產生 OCaml 綁定
- ocsigen-toolkit 用於 Eliom 應用程式的可重複使用 UI 元件(僅限客戶端或客戶端-伺服器)
- bonsai 用於建構動態網頁應用程式的函式庫,使用 Js_of_ocaml
- ocaml-vdom 這是一個轉換套件,ocaml-vdom 現在命名為 vdom。請改用 vdom 套件
- fmlib_browser 以 elm 風格為瀏覽器撰寫網頁應用程式
🟡 WebAssembly
用於將 OCaml 程式碼編譯為 WebAssembly 的套件和工具。
- wasm_of_ocaml 從 OCaml 位元組碼到 WebAssembly 的編譯器
- wasocaml 從 OCaml 到 WebAssembly 的編譯器
- wasm 用於讀寫 WebAssembly (Wasm) 檔案和操作其 AST 的函式庫
- owi 用於使用 WebAssembly 的 OCaml 工具鏈,包括一個直譯器
🟡 底層網頁堆疊
提供基礎網路和通訊功能的套件。
- cohttp 一個用於 HTTP 客戶端和伺服器的 OCaml 函式庫
- httpaf 一個高效能、記憶體效率高且可擴展的 OCaml 網頁伺服器
- http HTTP 基本要素的類型定義
- ocsigenserver 一個功能完整且可擴展的網頁伺服器
- tls 純 OCaml 實作的傳輸層安全性 (TLS)
- websocket WebSocket 函式庫
- websocketaf 用於 http/af 的 WebSocket 實作
- gluten 一個用於網路協定的可重複使用執行期函式庫
- awa OCaml 中的 SSH 實作
- uri 一個 RFC3986 URI/URL 解析函式庫
- dns 一個有主見的網域名稱系統 (DNS) 函式庫
- tcpip OCaml TCP/IP 網路堆疊,用於 MirageOS
- charrua DHCP 封包編碼器和解碼器
- mirage-nat Mirage-nat 是一個用於網路位址轉換的函式庫,適用於 MirageOS
- arp 純 OCaml 實作的位址解析協定 (ARP)
- ethernet OCaml 乙太網路 (IEEE 802.3) 層,用於 MirageOS
- paf HTTP/AF 和 MirageOS
- mimic 一個簡單的協定分派器
- tiny_httpd 使用執行緒的最小 HTTP 伺服器
🔴 HTTP 客戶端
用於發出 HTTP 請求的 HTTP 客戶端函式庫。
- cohttp 一個用於 HTTP 客戶端和伺服器的 OCaml 函式庫
- hyper 支援 HTTP/1、HTTP/2、TLS 和 WebSocket 的網頁客戶端
- ocurl libcurl 的綁定
- http-lwt-client 使用 http/af、h2 和 lwt 的簡單 HTTP 客戶端
- ezcurl OCurl 的友善包裝
🟡 樣板
協助產生動態 HTML 或文字內容的套件。
- tyxml 一個用於建構正確 HTML 和 SVG 文件的函式庫
- embedded_ocaml_templates EML 是一種簡單的樣板語言,可讓您使用純 OCaml 生成文字
- dream-html Dream 的 HTML 生成器 eDSL
- ppx_dream_eml 處理 Dream 嵌入式 ML 語法的 PPX
- mustache OCaml 中的無邏輯 Mustache 樣板
- jingoo 幾乎與 Jinja2 (Python 樣板引擎) 相容的樣板引擎
🟡 靜態網站產生
用於產生靜態網站的套件。
- finch 簡單快速的網站產生器
- stone 簡單的靜態網站產生器,適用於作品集或文件頁面
- camyll 一個靜態網站產生器
- yocaml YOCaml 是一個靜態網站產生器,主要以 OCaml 編寫
- dream-serve 具有即時重載功能的靜態 HTML 網站伺服器
- soupault 基於 HTML 重寫的靜態網站產生器
- html_of_wiki 軟體專案的靜態網站產生器
🟡 行動應用程式
用於建立行動應用程式的套件
- eliom 進階的客戶端/伺服器網頁和行動框架
- ocsigen-start 用於開發具有使用者、註冊、通知等功能的網頁和行動應用程式的高階函式庫
- cordova 將 OCaml 綁定到 Cordova Javascript 物件。
- Ocaml-chcp 綁定以在您的 OCaml 行動應用程式中使用 Cordova-Hot-Code-Push Javascript 模組
- cordova-plugin-activity-indicator 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-activity-indicator。
- cordova-plugin-background-mode 使用 gen_js_api 綁定到 cordova-plugin-background-mode。
- cordova-plugin-barcode-scanner 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-barcode-scanner。
- cordova-plugin-battery-status 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-battery-status。
- cordova-plugin-camera 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-camera。
- cordova-plugin-clipboard 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-clipboard。
- cordova-plugin-datepicker 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-datepicker。
- cordova-plugin-device 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-device。
- cordova-plugin-device-motion 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-device-motion。
- cordova-plugin-device-orientation 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-device-orientation。
- cordova-plugin-dialogs 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-dialogs。
- cordova-plugin-email-composer 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-email-composer。
- cordova-plugin-fcm 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-fcm。
- cordova-plugin-file 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-file。
- cordova-plugin-file-opener 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-file-opener。
- cordova-plugin-file-transfer 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-file-transfer。
- cordova-plugin-geolocation 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-geolocation。
- cordova-plugin-globalization 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-globalization。
- cordova-plugin-image-picker 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-image-picker。
- cordova-plugin-inappbrowser 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-inappbrowser。
- cordova-plugin-insomnia 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-insomnia。
- cordova-plugin-keyboard 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-keyboard。
- cordova-plugin-loading-spinner 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-loading-spinner。
- cordova-plugin-local-notifications 使用 gen_js_api 綁定到 cordova-plugin-local-notifications。
- cordova-plugin-media 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-media。
- cordova-plugin-media-capture 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-media-capture。
- cordova-plugin-network-information 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-network-information。
- cordova-plugin-progress 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-progress。
- cordova-plugin-push-notifications 使用 gen_js_api 將 OCaml 綁定到 phonegap-plugin-push。
- cordova-plugin-qrscanner 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-qrscanner。
- cordova-plugin-screen-orientation 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-screen-orientation。
- cordova-plugin-sim-card 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-sim-card。
- cordova-plugin-sms 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-sms。
- cordova-plugin-social-sharing 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-x-socialsharing。
- cordova-plugin-statusbar 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-statusbar。
- cordova-plugin-toast 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-toast。
- cordova-plugin-touch-id 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-touch-id。
- cordova-plugin-vibration 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-vibration。
- cordova-plugin-videoplayer 使用 gen_js_api 將 OCaml 綁定到 cordova-plugin-videoplayer。
🔴 身份驗證
用於 OCaml 網頁應用程式中與身份驗證相關功能的套件。
- jwt OCaml 中的 JWT 實作。
- cookie 用於 OCaml 和 ReasonML 的 Cookie 處理
- FPauth Dream 框架的簡易身份驗證系統
- u2f OCaml 中的通用第二因素 (U2F) 實作
- webauthn WebAuthn - 使用公開金鑰密碼學驗證使用者對服務的身份
- ssl OpenSSL 的綁定
- twostep 用於兩步驟驗證的 HOTP 和 TOTP 演算法 (適用於 OCaml)
- oidc 用於處理 OIDC 的基礎套件
- spoke OCaml 中的 SPAKE+EE 實作
🟡 二進位協定
有許多流行協定的實作,其中一些是穩定的,但有些仍然不完整,需要更多測試。一些沒有套件的有用協定包括 FlatBuffers 和 AMQP。
- asn1-combinators 在 OCaml 中嵌入類型化的 ASN.1 文法
- avro 用於編碼/解碼 Avro 的執行期函式庫
- capnp Cap'n Proto 序列化框架的 OCaml 程式碼產生外掛程式
- grpc 一個模組化的 gRPC 函式庫
- protobuf OCaml 的 Protobuf 實作
- rpc 用於處理 OCaml 中的 RPC 的函式庫 - 元套件
- jsonrpc Jsonrpc 協定實作
- thrift Apache Thrift RPC 系統的 OCaml 綁定
- bson 一個 bson 資料結構,包括編碼/解碼
- cbor CBOR 編碼器/解碼器 (RFC 7049) - 原生 OCaml 實作
- mqtt OCaml MQTT 客戶端
- msgpck 快速 MessagePack (http://msgpack.org) 函式庫
🟠 資料庫
用於與 OCaml 網頁應用程式中的資料庫互動的資料庫相關套件,從簡單的連接器到類型安全的 SQL 包裝。
- petrol Petrol 是一個 OCaml SQL API,旨在快速運行
- caqti 關聯式資料庫函式庫的統一介面
- pgocaml PostgreSQL 資料庫的原生 OCaml 介面
- sqlite3 OCaml 的 SQLite3 綁定
- lmdb LMDB 的綁定,這是一個具有 ACID 交易的快速檔案內資料庫
- irmin Irmin 是一個分散式資料庫,其設計原則與 Git 相同
- mysql 用於與 Mysql/MariaDB/Percona 資料庫互動的 C 客戶端函式庫綁定
- postgresql PostgreSQL 函式庫的綁定
- aws-rds Amazon Web Services SDK 綁定到 Amazon Relational Database Service
- sequoia 用於 OCaml 的類型安全查詢建構器
- sqlgg SQL 引導式 (程式碼) 產生器
- mariadb MariaDB 的 OCaml 綁定
🆘 國際化
OCaml 應用程式的國際化和本地化。
- gettext 國際化函式庫 (i18n)
- ocsigen-i18n 使用 eliom 編寫的網站的簡易 I18n
🆘 訊息佇列和鍵值儲存
用於與流行的訊息佇列和鍵值儲存互動的套件。
- amqp-client Amqp 客戶端基礎函式庫
- kafka Kafka 的 OCaml 綁定
- redis Redis 客戶端
- zmq ZeroMQ 4.x 的 OCaml 綁定
🟡 序列化器
用於以不同格式序列化和反序列化資料的套件。
- atd ATD 資料格式描述語言的剖析器
- yojson Yojson 是用於 JSON 格式的優化剖析和列印函式庫
- jsonm 用於 OCaml 的非阻塞串流 JSON 編解碼器
- sexplib 用於將 OCaml 值序列化為 S 運算式並從中序列化的函式庫
- yaml 剖析和產生 YAML 1.1/1.2 檔案
- csv 用於讀取和寫入 CSV 檔案的純 OCaml 函式庫
- bencode OCaml 中的 Bencode (`.torrent` 檔案格式) 讀取器/寫入器
- toml 具有剖析器、序列化器和列印器的 TOML 函式庫
- xml-light Xml-Light 是用於 OCaml 的最小 XML 剖析器和列印器
- graphql 建構 GraphQL schema 並對其執行查詢
- omd 純 OCaml 寫成的 Markdown 前端
- cmarkit OCaml 的 CommonMark 解析器和渲染器
- css CSS 解析器和列印器
- csexp 以規範形式解析和列印 S-expressions
- data-encoding JSON 和二進制編碼組合器的函式庫
🟡 內容聯合/RSS
用於聯合內容和處理 RSS 訂閱的套件。
🆘 外部 Web API
提供 OCaml 綁定和客戶端以與外部 Web API 互動的套件。
- jsonschema2atd 從 JSON Schema 和 OpenAPI 文件產生 ATD 類型
- spotify-web-api Spotify Web API 的 OCaml 綁定
- disml 用於與 Discord API 介接的 OCaml 函式庫
- openai OCaml OpenAI 綁定
- github GitHub APIv3 OCaml 函式庫
- telegraml OCaml 的 Telegram Bot API
- slacko Slack API 的型別安全綁定
- ocaml-googlemaps Google Map 的 OCaml 綁定
- geoloc 使用 Google Map 的地理定位功能函式庫
- ocaml-woosmaps Woosmap 的 OCaml 綁定
- ocaml-mixpanel mixpanel 的綁定
- ocaml-gapi 用於在 Web 應用程式中實作 Google 登入的 Google API 綁定
- ocaml-twttr `twttr` Javascript 外掛程式(Twitter)的綁定
- ocaml-gtag Google GTag 的綁定
- ocaml-hls 將 hls.js 用於 OCaml 應用程式中 hls 影片播放器的綁定
- ocaml-js-video-players 將不同的影片播放器新增至 OCaml Web 或行動應用程式 (Youtube、Dailymotion、Vimeo)
🟠 記錄
用於記錄和監控的套件,有助於追蹤應用程式行為和效能。
- logs OCaml 的記錄基礎設施
- dolog 簡易的 OCaml 記錄函式庫
- tracing 追蹤函式庫
- catapult 基於 Catapult/TEF 格式的追蹤系統
- opentelemetry https://opentelemetry.io 的檢測
- prometheus Prometheus 監控的客戶端函式庫
🟠 電子郵件
用於傳送和管理電子郵件通訊的套件。
- tidy_email 簡化連線至電子郵件服務的 OCaml 函式庫
- emile 根據 RFC822 的電子郵件地址解析器
- smtp 具有 Unix 和 Lwt 後端的 SMTP 函式庫
- letters 用於透過 SMTP 傳送電子郵件的客戶端函式庫
- mrmime Mr. MIME
- sendmail sendmail 命令的實作
- received 根據 RFC5321 的 Received 欄位
- email_message 電子郵件訊息解析器
- colombe OCaml 中的 SMTP 協定
- dkim OCaml 中 DKIM 的實作
- uspf OCaml 中的 SPF 實作
🟡 壓縮
可在 OCaml Web 應用程式中實現資料壓縮和解壓縮的套件。
- zlib zlib 壓縮函式庫的綁定
- decompress OCaml 中 Zlib 和 GZip 的實作
- camlzip 以 ZIP、GZIP 和 JAR 格式存取壓縮檔案
- lz4 LZ4 壓縮演算法的綁定
- ezgzip 簡易的 gzip (解)壓縮函式庫
- hpack OCaml 中的 HPACK (HTTP/2 的標頭壓縮) 實作
- brotli Google Brotli 壓縮演算法的綁定
- zstd zstd 壓縮函式庫的綁定
- snappy snappy 的綁定 - 快速壓縮/解壓縮函式庫
- lzo LZO 的綁定 - 可攜式的無損資料壓縮函式庫
- zstandard Zstandard 的 OCaml 綁定
- carton OCaml 中 PACKv2 檔案的實作
🟡 密碼學
用於安全通訊、加密、雜湊和其他密碼編譯操作的套件。
- cryptokit 密碼編譯原語的函式庫
- mirage-crypto 現代簡易的對稱式密碼編譯
- nocrypto 更簡易的加密
- pkcs11 PKCS#11 OCaml 類型
- tls 純 OCaml 實作的傳輸層安全性 (TLS)
- x509 純 OCaml 寫成的公開金鑰基礎架構 (RFC 5280、PKCS)
- fiat-p256 從 Fiat 取得的橢圓曲線密碼編譯原語
- sha SHA 密碼編譯函式的綁定
- blake2 Blake2 密碼學
- blake3 Blake3 密碼學
- bls12-381 BLS12-381 曲線的實作 (Blst 函式庫的包裝器)
- pbkdf 來自 PKCS#5 的基於密碼的金鑰衍生函式 (PBKDF)
- dirsp-proscript ProScript 密碼編譯函式庫的 OCaml 化介面
- digestif 雜湊實作 (SHA*、RIPEMD160、BLAKE2* 和 MD5)
🟠 編碼與解碼
編碼和解碼各種資料格式。
- tar 以純 OCaml 解碼和編碼 tar 格式檔案
- imagelib 實作 PNG、BMP、PPM 等影像格式解析的函式庫
- base64 OCaml 的 Base64 編碼
- multipart-form-data multipart/form-data (RFC2388) 的解析器
- multipart_form Multipart-form:RFC2183、RFC2388 和 RFC7578
- biniou 二進制資料格式,專為速度、安全、易用性和隨著協定演進的向後相容性而設計