Chrislearn's Blog
作者的图片

Chrislearn Young

Rust open-source maintainer. Author of Salvo and Palpo. Passionate about Rust, web frameworks, and clean abstractions.
  • 首页
  • 标签
  • 归档
  • 关于
  • GitHub
  • RSS

Background Images and CSS in HTML Email

五月 28, 2009 发布在 CSS, HTML

http://www.mailchimp.com/blog/background-images-and-css-in-html-email/

We’ve noticed a few people having issues with background images in their HTML email designs, so we thought we’d post some quick tips here.

Lots of email applications (especially the browser-based ones, like Yahoo!Mail, Hotmail and Gmail) strip out your ,

阅读全文

div设置float后高度不自动增加

九月 14, 2008 发布在 CSS

如果您没有闭合(清除)浮动元素,它将造成的后果是—–div的高度不能自动增加。

阅读全文

© 2026 Chrislearn Young. All Rights Reserved
by

Salvo vs. Axum: A Tale of Two Design Philosophies

Apr 4, 2026

In the Rust web framework world, Axum and Salvo are often put side by side. Both are written in Rust, both run on top of hyper, and both are async. But once you’ve built a few real services with each, you’ll realize they aren’t really competing on the same axis at all — they represent two genuinely different worldviews. This article isn’t about putting one above the other (Axum is an excellent framework); it’s about showing how a different abstraction layer leads to a noticeably different developer experience and expressive power.

The Axum version referenced here is 0.8.x. One quick clarification: Axum 0.8 followed matchit 0.8 in switching its path-parameter syntax from :name / *name to {name} / {*name}, which on the surface looks almost identical to Salvo’s. But the real difference has never been “braces vs. colons” — it’s the abstraction model itself.


Salvo 为什么不采用宏式路由

Apr 4, 2026

Actix-web、Rocket 等框架支持这样的写法:

#[get("/users/{id}")]
async fn show(id: web::Path<i32>) -> impl Responder { /* ... */ }

很多人觉得这"很优雅"——一个属性宏挂在函数上方,路径、方法、参数一目了然,像 Spring MVC 的 @GetMapping,像 FastAPI 的 @app.get。每隔一段时间,就有人在 Salvo 的 issue 区问:能不能也加一个 #[get]?

Salvo 故意没有采用。本文想认真解释这个决定背后的原因。


Salvo 与 Axum 的设计思想对比

Apr 4, 2026

在 Rust 的 Web 框架江湖里,Axum 与 Salvo 常常被放在一起比较。两者都用 Rust 写成,都跑在 hyper 之上,都支持异步,但只要写过几个真实业务,你就会发现:它们其实是两种完全不同的"世界观"。本文不是要贬低任何一方——Axum 是一个优秀的框架——而是想说明:当抽象层次不同时,开发体验和表达能力会显著不同。

本文对比的 Axum 版本为 0.8.x。需要先澄清一点:Axum 0.8 跟随 matchit 0.8 把路径参数语法从 :name / *name 改成了 {name} / {*name},看起来与 Salvo 的占位符语法几乎一致。但真正的差异从来不在"花括号还是冒号"这种表层,而在抽象模型本身。


Why Salvo Doesn't Embrace Macro-Style Routing

Apr 4, 2026

Frameworks like Actix-web and Rocket support writing routes like this:

#[get("/users/{id}")]
async fn show(id: web::Path<i32>) -> impl Responder { /* ... */ }

Many people think this is “elegant” — an attribute macro sits right above the function, and the path, method, and parameters are all visible at a glance, much like Spring MVC’s @GetMapping or FastAPI’s @app.get. Every so often someone files a Salvo issue asking: can we have a #[get] too?

Salvo deliberately doesn’t. This article tries to seriously explain the reasoning behind that decision.


Salvo:六年陈酿的 Rust Web 框架

Feb 2, 2026

在 Rust Web 开发的酒肆江湖里,有一坛自 2019 年便封坛陈酿的佳酿,它不事张扬,却让懂行的开发者甘愿为之驻足 —— 这便是 Salvo。Salvo 这坛酒,也在近六年的时光里,酿出了独一份的厚重与绵长。

奇妙的是,这坛 “老酒” 却总被误作新酿。只因它从不停歇对新鲜的追求,如同技艺精湛的酿酒师,在坚守传统工艺的同时,总能敏锐捕捉风味的进阶可能。从原生支持 HTTP/2、HTTP/3 协议的前瞻布局,到路由系统的设计创新;从内存占用的持续优化,到中间件系统的革命性统一设计,Salvo 在岁月沉淀中不断焕发新生,每一次版本更新都像给陈酿注入了鲜活气息,既保有老框架的可靠底色,又藏着让人惊喜的新鲜口感。它从不是被时代淘汰的旧物,而是在时光里愈发鲜活的经典。


Ubuntu-Server启动错误修复

Aug 8, 2018

前两天服务器(Ubuntu 18.04.1)重启后出现了这个严重错误, 导致系统无法启动:


螺旋数的一个解法

Jun 6, 2018

题目是: 给定一个自然数n,将n*n个数字按顺时针方向填入一个二维数组, 比如: n=4, 则结果为:


一个让Rust能简单写网站后端服务的的框架

Jun 6, 2018

话说 Rust 本身确实是一门学习曲线陡峭的语言, 一时半会驾驭不了它. 相比于 Rust, 同期的 Go 语言似乎更受欢迎. Go 你随便花上两天就能追到手, 可是 Rust 你可能要花上两个月, 然后还不能流畅地书写. 感觉 Go 就是一个青楼女子的模样, 人人可上手. 而 Rust 像啥? 大家闺秀? 感觉更像性冷淡, 对你的追求也是视而不见. 不过呢, 你如果足够用心, 你会发现, 她是你的好妻子, 上得厅堂, 下得厨房. 啥事都能做, 而且运行速度快, 占用资源少. 在安全方面尤其地安全, 相比之下其他的语言多少有点浪, 放家里总觉得有那么点不安全, 而 Rust 的性冷淡特性决定了她非常安全, 完全不用胆小有西门庆上门搞出点啥个事情来.

废话说得有点多, 回归正题, 如何用 Rust 搞一个网站后端服务? 说实话, 相比 Golang 等语言下面的五颜六色的框架来说, Rust 下可供选择的网站后端框架有点寒碜. 现在最主流的解决方案是使用 Actix-web 和 Rocket 两个比较成熟的框架. 我感觉可能是我比较愚笨, Actix-web 觉得好难, Rocket 似乎也不能满足我需求, 也不觉得好用. 于是就有了 Salvo.

做 Salvo 这个框架的初衷就是简单, 尤其是路由要够好用. 我并不希望框架帮我干很多的事情, 比如, 像 Rocket 等会直接把传来的数据映射为本地的数据结构, 但是我并不想那么干, 我觉得这个是使用者自己的事情, 映射本身很简单, 而且我更希望在映射出错时提供自定义的错误提醒.


为什么都说生男生女是男人决定的

Jun 6, 2018

生男生女是有男人还是女人决定的? 有点知识的人肯定觉得这问题特别简单, 所有的教科书都会告诉你, 是由男人决定的. 但是我却觉得这个结论有点荒谬.


如何解决前进过程中某些掉队队友的负面影响

May 5, 2018

昨天, 老板问我一个问题, 大致内容是: “当你设立了公司的目标, 团队一起努力前进的时候, 总会有些队友因为某些挫折而产生消极的工作情绪, 而这种情绪又会很快影响周围的队友, 像传染病一样扩散, 如何化解这种负面影响?”


118 posts found