微信扫码
添加专属顾问
最近,我一直在思考是否应该从我当前的 Web 应用栈(FastAPI、HTML、CSS 和少量 JavaScript)迁移到现代 Web 框架。
我特别对 FastHTML、Next.js 和 Svelte 感兴趣。
为了深入了解这些框架,我使用每个框架构建了同一个 Web 应用。我称之为“查看你的数据”,它允许用户:
通过在每个框架中实现这些 CRUD[9](创建、读取、更新、删除)操作,我希望了解每个框架的独特特性和开发体验。为简化起见,我将使用 SQLite 作为数据库。作为基准,我将从我熟悉的 FastAPI 开始构建应用。
我在 Twitter[10] 和 LinkedIn[11] 上对这三个框架进行了投票。
使用 FastAPI 构建应用相当直接(代码[12])。主要组件包括:
main.py:处理上传/下载数据、更新字段、删除行的路由。index.html:定义脚本、表格和按钮的 HTML 文档。style.css:视觉样式设置,如列宽、文本换行、滚动等。script.js:客户端功能,包括上传 CSV、加载和显示数据、更新/删除行,以及下载更新后的数据为 CSV。以下是该 Web 应用的界面。虽然在美观度上不算出色,但它满足了我们的功能需求。为了专注于框架和功能,而非设计,我特意在当前和后续的应用中保持了最简化的视觉样式。
为了学习 FastHTML,我首先查阅了文档[13],并通过这个示例[14]构建了一个简单的 ToDo 应用[15]。对于不熟悉的组件,我向 Cursor 提供了相关文档的链接,如 ft components[16]、htmx[17]、pico.css[18] 作为参考。使用 FastHTML,我可以在一个 main.py 和一个小的 style.css 中实现整个应用(代码[19])。
以下是应用界面。
在我完成初版后,Hamel 热心地与我进行结对编程,从头开始构建应用。他还邀请了 FastHTML 的创造者 Jeremy Howard 加入。他们教了我一些技巧,例如为 Cursor 提供 LLM 友好的 FastHTML(llms-ctx.txt[20])和 FastLite(html.md[21])文档。他们还分享了一个关于使用 htmx 和 Hyperview 构建简单应用的优秀资源[22]。Jeremy 甚至展示了如何在仅 50 行代码[23]内构建该应用!
from fasthtml.common import *
db = database(':memory:')
tbl = None
hdrs = (Style('''
button,input { margin: 0 1rem; }
[role="group"] { border: 1px solid #ccc; }
'''), )
app, rt = fast_app(live=True, hdrs=hdrs)
@rt("/")
async def get():
return Titled("CSV Uploader",
Group(
Input(type="file", name="csv_file", accept=".csv"),
Button("Upload", hx_post="/upload", hx_target="#results",
hx_encoding="multipart/form-data", hx_include='previous input'),
A('Download', href='/download', type="button")
),
Div(id="results"))
def render_row(row):
vals = [Td(Input(value=v, name=k)) for k,v in row.items()]
vals.append(Td(Group(Button('delete', hx_get=remove.rt(id=row['id'])),
Button('update', hx_post='/update', hx_include="closest tr"))))
return Tr(*vals, hx_target='closest tr', hx_swap='outerHTML')
@rt
async def download():
csv_data = [",".join(map(str, tbl.columns_dict))]
csv_data += [",".join(map(str, row.values())) for row in tbl()]
headers = {'Content-Disposition': 'attachment; filename="data.csv"'}
return Response("\n".join(csv_data), media_type="text/csv", headers=headers)
@rt('/update')
def post(d:dict): return render_row(tbl.update(d))
@rt
def remove(id:int): tbl.delete(id)
@rt("/upload")
async def post(csv_file: UploadFile):
global tbl
if not csv_file.filename.endswith('.csv'): return "Please upload a CSV file"
tbl = db.import_file('test', await csv_file.read(), pk='id')
header = Tr(*map(Th, tbl.columns_dict))
vals = [render_row(row) for row in tbl()]
return Table(Thead(header), Tbody(*vals))
serve()
以下是 Jeremy 的应用界面:
为了学习 Next.js,我完成了 React 基础[24]和 Next.js[25] 教程。后者通过循序渐进的实践课程教授 Next.js 的基础知识,最终构建一个仪表盘应用。教程共有 16 章,可能需要一些时间来学习和编码。然而,我建议至少学习到第 12 章关于数据转换的部分,并享受平稳的学习曲线和实用的项目。
创建 Next.js 应用模板的方法:
npx create-next-app@latest
在 Next.js 中构建相同的应用需要更多的代码(代码[26]),但其组织结构相当直观:
api:处理数据表(GET、PUT、DELETE)和文件上传/下载的路由。pages.tsx 和 layout.tsx:特定页面和通用的用户界面组件。components:可重用的 React 组件,如表格和上传/下载按钮。lib:实用函数;在本例中,包含一个用于 SQLite 的函数。以下是 Web 应用界面。内置的 Tailwind CSS[27] 集成使应用看起来比简约的 FastAPI 和 FastHTML 应用更为精致。
为了学习 Svelte,我完成了其在线教程[28]的一部分。教程分为四部分:(i)Svelte 基础、(ii)Svelte 高级、(iii)SvelteKit 基础和(iv)SvelteKit 高级。我完成了 Svelte 基础和 SvelteKit 基础部分,然后开始构建应用(代码[29])。
创建 SvelteKit 应用模板的方法:
npm create svelte@latest my-app
与 Next.js 类似,SvelteKit 的模板包含多个目录和组件:
components:可重用的 Svelte 组件,如数据表和上传按钮。api.ts 和 db.ts:用于 API 获取、更新和删除数据的函数(api.ts)以及在 SQLite 数据库中查询和更新的函数(db.ts)。routes:处理表(GET)、行(PUT、DELETE)和上传/下载的路由。+page.svelte:应用的主页面。app.html:入口点和主要的 HTML 文件。以下是应用界面。我稍作调整,将“选择文件”和“上传”功能合并到一个按钮中,去除了“上传 CSV”按钮。
我还尝试了使用 FastAPI 作为后端、Svelte 作为前端构建应用(代码[30])。所有功能和 API 都在 main.py 中,而前端 UI 和 API 交互由 +page.svelte 和 api.ts 处理。要运行应用,我需要同时启动 FastAPI 服务器和 Svelte 开发服务器。
以下是 Web 应用界面。(我将上传功能恢复到原始的 FastAPI 应用,即有一个单独的“上传 CSV”按钮。)
主要挑战是在开发过程中协调两个服务器的通信。在生产环境中,Svelte 应用将被编译为静态文件,API 请求将发送到 FastAPI 后端。
这个练习让我思考,基于互联网数据训练的 LLM 提供的编码助手将如何影响我们的开发选择。例如,对于像 Svelte 和 FastHTML 这样的小众或新兴框架,LLM 驱动的编码助手在编写和建议代码时是否同样有效?下面的推文或许有些夸张,但确实提出了一个值得关注的问题。
我并不乐意地说,但 Svelte 已经过时了,因为 LLM 基础模型更擅长编写 React。——Jess Martin[31]
由于 React 和 Next 的广泛使用和较长历史,大多数 LLM 的训练数据中可能包含更多的 React 和 Next 代码,Svelte 的代码则相对较少。FastHTML 也是如此。这可能导致编码助手在处理和建议已成熟的框架(如 FastAPI、React 和 Next.js)时更为高效。
根据我的经验,在使用 Cursor + Claude 构建 FastAPI 和 Next.js 应用时更为顺利,而在 FastHTML 和 SvelteKit 上则遇到了更多困难。由于 FastHTML 在撰写本文时仅存在几周,其代码和文档可能尚未进入大多数 LLM 的训练数据中,这解释了它们在 FastHTML 上的有限能力。
为了解决这个问题,FastHTML 的创建者 Jeremy Howard 提供了针对上下文学习优化的 llms.txt[32] 和 llms-ctx.txt[33]。同样,Rich Harris(在 Vercel 负责 Svelte 开发)计划[34]为 Svelte 发布更多 LLM 友好的文档。Victor Dibia 也撰文[35]讨论了编码助手可能如何影响开发者的习惯和选择,以及我们需要为人类和机器编写文档。
时间将证明这些努力在解决新兴或小众框架在编码助手中的冷启动问题上能取得多大成效。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-07-02
AReaL 2.0 正式发布:面向 Agent 应用的 Online RL 微服务架构升级
2026-06-19
从 BERT 标注到 Agent Skill:短文本标签体系的四次“工业革命”
2026-05-14
多轮 Agent 场景下,滴滴的 EAGLE-3 训推加速实践
2026-05-06
谁说 Mac 只能写代码?Google 官宣:M 芯片本地微调 Gemma 4 时代开启!
2026-04-20
用 Unsloth 微调 Embedding 模型,让你的 RAG 检索不再答非所问
2026-04-15
ComfyUI v0.19.0 更新:大量新节点、新模型、新修复与性能优化全面落地,工作流与训练能力再升级
2026-04-13
Agent 持续学习落地路径:先做 Traces,再做 Context,最后才微调模型 | Jinqiu Select
2026-03-23
养死四只龙虾的小白有感
2026-04-15
2026-04-13
2026-04-20
2026-05-06
2026-05-14
2026-06-19
2026-07-02
2026-01-02
2025-11-19
2025-09-25
2025-06-20
2025-06-17
2025-05-21
2025-05-17
2025-05-14
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。