OCaml 能做网页开发吗?
可以,但有些部分仍未完善
OCaml 传统上以其在系统编程、形式化验证方面的实力而闻名,也是许多学术研究的语言选择,它在网页开发领域正在稳步成熟。凭借强大的静态类型、对不可变性的强调以及出色的性能,它正在逐渐成为主流网页开发语言的可行替代方案。
OCaml 中的网页开发既快又类型安全!根据您的需要,您可以选择使用简洁的服务器端网页框架,或采用创新的全栈解决方案,用于集成网页和移动应用程序。为了在浏览器中运行,OCaml 会编译成 JavaScript 和 WebAssembly!
事实上,OCaml 被用于为生产环境网页系统提供支持,例如 Ahrefs、OCaml.org 或 Be Sport 社交网络。
如果您正在考虑将 OCaml 用于下一个网页应用程序,您应该意识到您可能需要自己编写大量内容,并且还没有与其他语言相比的所有功能的等效项。特别是,OCaml 没有开箱即用的身份验证解决方案或完全可用于生产环境的查询生成器。如果您需要与外部服务或外部 API 交互,您可能也会遇到一些挑战。
然而,这通常会被您通过语言优势和某些工具的强大功能节省下来的时间所抵消。该语言强大的类型系统将通过在编译时消除许多问题(例如 HTML 符合性)来节省大量调试时间。多层编程等创新解决方案可以极大地简化客户端-服务器通信。最后但并非最不重要的一点是,OCaml 甚至允许您使用单一代码对网页和移动应用程序进行编程。
想要帮助吗?
以下是一些项目,可以帮助使 OCaml 成为更强大的网页应用程序候选者
- 改进 ocaml-swagger 以便能够为流行的网页 API 生成 API,例如 Stripe。
- 创建一个 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 的高性能、内存高效且可扩展的 Web 服务器
- http HTTP 核心要素的类型定义
- ocsigenserver 一个功能齐全且可扩展的 Web 服务器
- tls 纯 OCaml 实现的传输层安全协议
- 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 实现的地址解析协议
- 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 的 Web 客户端
- 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 的 Embedded 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 绑定以将 Cordova-Hot-Code-Push Javascript 模块用于您的 OCaml 移动应用程序
- 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 Web 应用程序中身份验证相关功能的包。
- jwt OCaml 中的 JWT 实现。
- cookie 用于 OCaml 和 ReasonML 的 Cookie 处理
- FPauth Dream 框架的简单身份验证系统
- u2f OCaml 中的通用第二因素 (U2F) 实现
- webauthn WebAuthn - 使用公钥密码学对服务进行用户身份验证
- ssl OpenSSL 的绑定
- twostep 用于两步验证 (用于 OCaml) 的 HOTP 和 TOTP 算法
- 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 Web 应用程序中与数据库交互的数据库相关包,从简单的连接器到类型安全的 SQL 包装器。
- petrol Petrol 是一个旨在快速运行的 OCaml SQL API
- caqti 关系数据库库的统一接口
- pgocaml PostgreSQL 数据库的本地 OCaml 接口
- sqlite3 OCaml 的 SQLite3 绑定
- lmdb 用于 LMDB 的绑定,LMDB 是一个具有 ACID 事务的快速文件内数据库
- irmin Irmin,一个遵循与 Git 相同设计原则的分布式数据库
- mysql 用于与 Mysql/MariaDB/Percona 数据库交互的 C 客户端库的绑定
- postgresql PostgreSQL 库的绑定
- aws-rds Amazon Web Services SDK 绑定到 Amazon 关系型数据库服务
- 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 一个纯 OCaml 库,用于读取和写入 CSV 文件
- bencode OCaml 中的 Bencode(`.torrent` 文件格式)读写器
- toml 带有解析器、序列化器和打印器的 TOML 库
- xml-light Xml-Light 是一个用于 OCaml 的最小 XML 解析器和打印器
- graphql 构建 GraphQL 架构并对它们执行查询
- omd 纯 OCaml 中的 Markdown 前端
- cmarkit 用于 OCaml 的 CommonMark 解析器和渲染器
- css CSS 解析器和打印器
- csexp 以规范形式解析和打印 S 表达式
- data-encoding JSON 和二进制编码组合器库
🟡 联合/RSS
用于联合内容和处理 RSS 提要的软件包。
🆘 外部 Web API
提供 OCaml 绑定和客户端以与外部 Web API 交互的软件包。
- jsonschema2atd 从 JSON 架构和 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 地图的 OCaml 绑定
- geoloc 使用 Google 地图的地理定位功能库
- ocaml-woosmaps Woosmap 的 OCaml 绑定
- ocaml-mixpanel 与 mixpanel 的绑定
- ocaml-gapi 与 Google API 的绑定,用于在 Web 应用程序中实现 Google 登录
- 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 先生 MIME
- sendmail sendmail 命令的实现
- received 根据 RFC5321 收到的字段
- 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 OCaml 与 Zstandard 的绑定
- carton OCaml 中的 PACKv2 文件的实现
🟡 密码学
用于安全通信、加密、哈希和其他密码操作的软件包。
- cryptokit 密码原语库
- mirage-crypto 现代时代的简单对称加密
- nocrypto 更简单的加密
- pkcs11 PKCS#11 OCaml 类型
- tls 纯 OCaml 实现的传输层安全协议
- 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 多部分表格:RFC2183、RFC2388 和 RFC7578
- biniou 旨在快速、安全、易于使用以及随着协议发展而保持向后兼容性的二进制数据格式