在Zig中实现类型安全的HTML模板
Type-safe HTML templating in Zig
作为一名从PHP 3.0时代就开始做Web开发的老兵,我从未想过会在Zig这种底层语言中重新探索前端。过去两年,我在构建Zio和Dusty生态系统时,发现配合arena allocators和Zig的comptime特性,甚至能打造出无需JavaScript的SPA。然而,一直缺少一个理想的模板方案。最终,我受Ziex和Templ启发,开发了zt——一个专为Zig打造的类型安全HTML模板库。它能在编译期检查所有输入类型,杜绝运行时错误;默认转义所有动态内容以防XSS;生成的代码直接写入std.Io.Writer,零分配、高性能。模板错误直接体现为Zig编译器报错,让调试变得前所未有的清晰。
模板错误现在就是Zig编译器的错误,如果拼错变量名,zig build会直接告诉你。
HN 评论区
61- flossly
我挺喜欢 Kotlin 里的 kotlinx.html;它是一个用于在纯 Kotlin 中编写 HTML 的领域特定语言(eDSL)。这样我就能在模板代码里设置断点了。它比那种“字符串加插值”类型的模板库稍微慢一点点,但慢得微不足道,这个代价我愿意付。另外,它对编译时间的影响也比“字符串加插值”类型的库大一些。
你得到的类型安全就是 Kotlin 本身已有的,外加一点额外保障:你不能把某些 HTML 元素嵌套在某些其他元素中(遵循 HTML 规范)。你可以自定义元素和属性,但 HTML 规范里的那些通常也能在 kotlinx.html 里找到(因此可以自动补全)。
这个库的很大一部分是从实际的 HTML 规范生成的。
Claude Code 写这个似乎毫无问题(我自己现在几乎不怎么写模板了)。
https://github.com/kotlin/kotlinx.html
https://dzone.com/articles/modern-type-safe-template-engines...
- solatic
我喜欢这个设计,尤其是它利用了 Zig 的构建链;我预计重新构建的速度会足够快,基本上能在开发周期中实现类似 JS 的热重载。现在只需要为 Zig 移植 https://github.com/air-verse/air 就行了(Ziex 的 CLI 里自带了一个,但只适用于 Ziex)...
期待看到一些基准测试!
- pjmlp
> 两年前我接触了 Zig,我从未想过我会考虑用这种底层语言做 Web 开发。
这句话有点好笑,考虑到作者是从 2000 年开始做 Web 开发的,用的是 PHP 3.0。
我是从 1997 年开始的,我们分布式系统课的作业就是用 Perl 和 C 写 CGI。
1999 年到 2001 年间,我雇主的 Web 开发大部分是用 Tcl 和 C,ASP 自然是 VB 和 C++ COM 组件的混合体,还有写各种 mod_something Apache 扩展模块和 IIS ISAPI 模块的乐趣,当然都是用 C 和 C++ 写的。
啊,微软当时也在推 ATLServer,毕竟谁不想用 ATL 做 Web 开发呢?而 Borland/Inprise 也在为 Delphi 和 C++ Builder 推出类似的东西。
PHP 本身在 3.0 版本时,内置功能还很少,所以用 C 写扩展模块非常普遍。
所以,读到这种“回归到 2010 年代慢速脚本语言接管之前”的说法,确实有点讽刺,毕竟那时候没人会想到要这么干。
- stefs
我也在用一个我自己设计的“类型安全”模板引擎(针对 Kotlin,作为一个 Gradle 插件),不过它走的是另一条路——不是把模型类嵌入模板,而是生成一个模板类,把所有值作为参数传入。
比如 MyTemplate.tpl.html:
{if $foo}hello world, {$myname}!{else}goodbye, world.{/if}
这会生成一个 Kotlin 类,可以这样使用:
MyTemplate(
foo = true,
myname = "bar"
).toString()
对我来说最大的好处是,这种方式能获得完整、自由的 IDE 支持;如果映射不是 1:1 的,我也不需要额外编写视图模型;性能也相当不错,因为最终除了基础的 JDK 开销外,没有运行时解析/编译/解释(不过还有更快的引擎)。
https://codeberg.org/h34tnet/tempolin
警告:目前我是唯一的用户,所以别在生产环境用它。另外,我目前正在做一些改进,还没推送到仓库。
- fergie
W3C:为什么我们不能直接用 <includes src="./header.html"> 然后搞定呢?