华丽的标题党
首先,感谢奥丁同学,给我推荐了《21小时精通Rust》的标题。论“标题党”的段位,他才是王者!本我只想用《21天精通Rust的Web开发》,经他点拨果断改了过来,以“华丽”的标题党开篇。
所谓的“21小时”,到底是真是假,里面水分有多大呢?我不好评判,裁判权留给大家,随便喷,反正我看不见也听不到 :)。
实际上,我在这里仅仅是想分享一下,我学习的整个过程,和写出来的代码作品。给自己点个赞的同时,也希望对大家有所帮助。
Rust很难学吗?
大家都知道Rust很好,代码安全、性能高,六边形战士几乎所有的开发场景都能独当一面。连Vue尤雨溪大神也在不断“安利”,建议大家去Rust,很多人有点亮这个技能的冲动,包括我自己。但是,我们也会听到一种声音,说Rust学习曲线十分陡峭,很多人因此被劝退了,包括去年的我。
现在的我,有话要说。按我的学习Rust经历,感觉并没有传说中那么困难,甚至觉得上手还是挺快的。“小马过河”的故事大家从小都听过,所以我的感觉我的经历并不代表所有人。
- 一般来说,对于没有编程基础的或者经验不丰富的开发者,Rust作为入门语言并不合适
- 但对老司机来说,我建议不要想太多直接学就是了!
天下事有难易乎?为止,则难者亦易矣;不为,则易者亦难矣。
把上面之乎者也翻译成现代的话:Just Do It 或 干!
我的学习路径
1、先放弃
上面说到,其实去年我就想学Rust,也到图书馆借了一本介绍Rust编程的书。翻了前面几章,将的基础语法感觉跟Go差别不大,我自己Go语言也有小成了,还学这玩意干啥?于是,弃书去读《苏东坡传》了。
2、再入坑
一年后,我写了一篇关于WebAssembly的文章才最终与Rust结缘。
我试过用.NET和Go生成WebAssembly老费劲了,而且生成的wasm文件Size非常大。改用Rust之后,简直不要太爽。文章中的测试代码,主要是AI帮我写的,我只copy过来,凭感觉做了些微调。随即我就立了Flag,一定要尽快把Rust给拿下!
3、先读书
于是,周末到图书馆找了两本Rust的书。虽是光看不练,但越是看到后面,越是喜欢,越是兴奋,高级语言应有的特性Rust一点都不,甚至还有其独特的创新点。Go语言与之相比,就像毛坯房VS精装修房的感觉一样。
不自觉地,开始琢磨着我的第一个Rust项目要做点什么。不过,最后我还是按捺着那点冲动,吸取去年的教训,先把书读完,在决定是入坑还是脱坑。
4、再实战
断断续续,看了是二十多天总算把书啃完了!终于,可以开干啦!
我的第一个练手的Rust项目是一个博客网站。嗯,好像我的个人Blog站点,每次都会被当成白老鼠。没办法,谁它跟我最熟,做项目做生不如做熟嘛~~
Web框架
首先,选一个Web框架。开始我选的是Rocket( https://rocket.rs/ )。听说它比较适合新手入门,然而,试了个小demo,最后还是放弃了。也许,因为这个框架依赖太多,显得太重了,一编译我的CPU风扇就嗷嗷地响。可能我是新手的缘故,一直没找到Rocket.yaml里面配置如何读取自定义内容。
既然复杂的框架玩不来,那就晚点轻量的依赖少的,最多自己手动去拼接各种组件。学习嘛,还是一板一眼比较好,少走捷径,功底才更扎实。
再次被选中的是warp框架( https://github.com/seanmonstar/warp ),WebAPI、WebSocket、静态文件、动态模板这些都不在话下。看起来是够用了,也够清爽,能满足我的代码洁癖。
模板引擎
tera是书上介绍过的HTML模板引擎( https://keats.github.io/tera/docs/ ),功能语法看了一下没有毛病还算够用!
mardown转HTML
我的Blog正文内容是以markdown格式存在数据库里,在web站点呈现需要先把内容格式转成html。所以markdown库是必须用上的。AI给我推荐了markdown-rs( https://github.com/wooorm/markdown-rs ),仅需要调用一个静态方法,就能解决问题,很好!
ORM
我的项目需要频繁跟postgres数据库进行交互,所以ORM显得十分关键。在书上主要介绍了Diesel,但看网上的文章说它的性能比较弱。性能不可妥协,果断放弃!
在github找了几个sample代码,有不少直接用sqlx库直接手搓SQL。呃,代码会变得有点丑陋。都2024年了,这样做开发不太好吧~
最后,兜兜转转找到了seaORM (https://www.sea-ql.org/SeaORM/docs/index/ ),一个基于sqlx的ORM封装。算是个还挺不错的折中的方案。关键它也有一些工具链,比如生成实体映射的Model类可以用sea-orm-cli generate entity
。
sea-orm-cli generate entity -u postgres://user:password@localhost:5432/myblog -s public -o ./src/entities -t articles,links
安装 sea-orm-cli
工具后,执行上面的代码就能自动生成实体映射,太方便了。虽然比.NET的SourceGenerator差一点,但是总比手撸代码要靠谱吧。
工具算是凑齐了,开始下锅煮菜了。
哈哈,动手之前,先跑一波AI。AI时代,我们开发习惯也要与时俱进啦。
首先,打开VS Code 的cline插件,我挂的是XAI的Grok模型,这个不重要大家也可以用chatGPT或者Claude。然后输入prompt,让AI帮我生成一个项目基础模板。
我需要生成一个博客网站的源代码:
1、项目服务端使用rust语言,MVC的架构
2、项目的web框架使用wrap
3、项目数据库是postgres,使用seaORM
4、项目模板引擎使用tera
5、项目只需要生成前台的代码,包括:首页(index)和内容页(post)。首页显示文章标题列表,需要带分页
不一会AI就帮我生成了项目模板,哈哈。看了一下XAI的后台,花了2美金。不心疼,因为马一龙同志每月白送25美刀的quota,还剩很多!
后来,想了一下我是应该弄个缓存。比如文章分类、友情链接这些,一般缓存起来降低数据库的访问压力。于是,我又给AI多家了一个prompt
请生成cache_service.rs的代码
1、用于将links和article_category两个表的数据缓存起来
2、使用HashMap缓存数据
AI出来的代码就能直接跑了吗?不,你这样的话你就太天真了!至少一个Rust项目来说试听难做到的。个人分析:
- 1、相对而言Rust还是比较新的语言,在网络上能提供给大模型训练的数据没那么齐全
- 2、Rust的语法,包括各种宏定义,比起其他语言复杂很多,AI生成难度也较大
- 3、Rust语言发展相当快,导致std的API与第三方库的API不稳定。新版本重构了API也会改动不少,AI抓取了不同版本的库凑在无法保证API兼容性。比如计算时间,AI老爱用第三方库
chrono::Duration
,实际上chrono
早就把Duration
移除了,因为标准库(std)已经把收过去了Duration
。
好吧,既然AI只能帮到这里,接下来就开始我自己的各种蒸腾、摆弄、踩坑、调试……
2天后,终于把我blog前台的所有功能1:1复刻出来了!我平均每天编码时间应该不超过10小时,所以,文章标题号称“21小时精通”也并非完全在夸大事实把。夸大的其实是“精通”这两个字,我的项目所用到Rust的核心库和特性也许还不到10%,平心而论把“精通” Replace成“入门”比较合适,但是为了传播需要,我这老脸暂时也搁在地上了!
是的,暂时!好的开始是成功的一半,精通是迟早的事。
感谢拥有1%灵感,并付出了99%汗水的我自己~
这一篇暂时闲扯到这里。接下来,我会将我这个项目代码详细拆解出来,继续跟大家分享,敬请期待。