<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>PankitGG的博客</title><description>山桃红花满上头，蜀江春水拍山流。
花红易衰似郎意，水流无限似侬愁。</description><link>https://blog.ai-nous.com/</link><language>zh_CN</language><item><title>fresh2开发及快速入门（2）重构三国</title><link>https://blog.ai-nous.com/posts/fresh2%E5%BC%80%E5%8F%91%E5%8F%8A%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A82/</link><guid isPermaLink="true">https://blog.ai-nous.com/posts/fresh2%E5%BC%80%E5%8F%91%E5%8F%8A%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A82/</guid><description>fresh2开发及快速入门（2），手把手教你开发一个AI全栈应用</description><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;终于到了令人激动的时刻。这一章我将带你使用&amp;lt;b&amp;gt;全栈&amp;lt;/b&amp;gt;+&amp;lt;b&amp;gt;Fresh&amp;lt;/b&amp;gt;+&amp;lt;b&amp;gt;群岛架构&amp;lt;/b&amp;gt;+&amp;lt;b&amp;gt;AI&amp;lt;/b&amp;gt;初步搭建开发一个好玩的游戏。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“从水下第一个生命的萌芽开始，到石器时代的巨型野兽，再到人类第一次直立行走，你已经历许多。现在，开启你伟大的探索吧：从早期文明的摇篮，到浩瀚星宇。” -- 文明六&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;好玩的游戏一定是可以让人沉迷的。做游戏的第一步就是设计好这个游戏的规则和机制。&lt;/p&gt;
&lt;h2&gt;一、初步设计游戏规则&lt;/h2&gt;
&lt;p&gt;大模型和故事存在着共通性，学会用信息论的角度去理解世界。故事的本质是信息的压缩与变换，如果我们将一本故事想象成一个信息系统，那么这本书就是信息的压缩包，而我们的阅读过程就是解压。而大语言模型则是信息的压缩，他将世界上的普遍真理压缩到模型中以实现AGI的愿景。&lt;/p&gt;
&lt;p&gt;在以上理解的基础上，我们从最经典的三国下手，架构一个起伏变化的信息加解压缩的软件。&lt;/p&gt;
&lt;h3&gt;1. 游玩规划&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;二、初始化项目&lt;/h2&gt;
&lt;p&gt;项目结构介绍
项目包含以下关键目录和文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rb3k-workspace/
├── assets/           # 静态资源（图片、CSS 等）
├── bin/              # 可执行文件目录
├── components/       # 可重用的 UI 组件
├── islands/          # 交互式组件（岛屿）
├── routes/           # 基于文件的路由
│  └── api/           # API 路由
├── static/           # 静态资源（图片、CSS 等）
├── .env.test/        # 环境变量配置文件（私有化运行需去掉.tset）
├── main.ts           # 应用入口文件
├── deno.json         # Deno 配置文件
└── README.md         # 项目文档
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>仿openclaw调度，手搓一个免安装的windows个人助手，我管他叫智心一梦</title><link>https://blog.ai-nous.com/posts/%E4%BB%BFopenclaw%E8%B0%83%E5%BA%A6%E6%89%8B%E6%90%93%E4%B8%80%E4%B8%AAwindows%E4%B8%AA%E4%BA%BA%E5%8A%A9%E6%89%8B%E6%88%91%E5%8F%AB%E4%BB%96%E6%99%BA%E5%BF%83%E4%B8%80%E6%A2%A6/</link><guid isPermaLink="true">https://blog.ai-nous.com/posts/%E4%BB%BFopenclaw%E8%B0%83%E5%BA%A6%E6%89%8B%E6%90%93%E4%B8%80%E4%B8%AAwindows%E4%B8%AA%E4%BA%BA%E5%8A%A9%E6%89%8B%E6%88%91%E5%8F%AB%E4%BB%96%E6%99%BA%E5%BF%83%E4%B8%80%E6%A2%A6/</guid><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;初衷&lt;/h2&gt;
&lt;p&gt;一直想搞一个提效工具，像一个团队一样的帮我思考和解决问题。&amp;lt;code&amp;gt;openclaw&amp;lt;/code&amp;gt;，我不是说他不好，只是太大太复杂了，纯手工（编程也有一天会变成&amp;lt;b&amp;gt;非遗&amp;lt;/b&amp;gt;吗？）写一些简单的功能，就能实现一个复杂的多agent的调度系统。&lt;/p&gt;
&lt;p&gt;在我的记忆里，小的时候很喜欢玩QQ宠物，对于一个小学生来说10块是一笔巨款，为此省吃俭用买粉钻，疯狂玩游戏赚取胡萝卜，现在想起来还十分上头。所以一直想做一个桌面助手，拥有美好的社区和游戏，以及帮助我完成一些简单的任务，最重要的是要所有数据都是用户的。在AI的时代，我们有能力实现这一目标。&lt;/p&gt;
&lt;p&gt;所以我的一开始的目的就是&lt;/p&gt;
&lt;p&gt;:::tip[核心构成]
&lt;strong&gt;宠物系统&lt;/strong&gt; + &lt;strong&gt;员工系统&lt;/strong&gt; + &lt;strong&gt;记忆系统&lt;/strong&gt;
:::&lt;/p&gt;
&lt;p&gt;于是便有了这个 &amp;lt;code&amp;gt;一键启动免安装的&amp;lt;/code&amp;gt;，纯客户端的项目，所有数据均存储在用户本地。&amp;lt;b&amp;gt;拥有了它就拥有了一个&amp;lt;code&amp;gt;专业团队&amp;lt;/code&amp;gt;和一个&amp;lt;code&amp;gt;宠物&amp;lt;/code&amp;gt;&amp;lt;/b&amp;gt;，他们都在你的帮助下成长。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://studio.ai-nous.com/&quot;&gt;智心一梦助手 介绍网站&lt;/a&gt;
&lt;img src=&quot;./images/zxym-0.png&quot; alt=&quot;智心一梦助手&quot; /&gt;
智心一梦助手页面
&lt;img src=&quot;./images/zxym-2.png&quot; alt=&quot;智心一梦助手页面&quot; /&gt;
&amp;lt;div class=&quot;bg-blue-50 dark:bg-blue-900/30 border-l-4 border-blue-500 p-4 my-4 rounded-r-lg shadow-sm&quot;&amp;gt;
&amp;lt;p class=&quot;font-bold text-lg mb-1 text-blue-700 dark:text-blue-300&quot;&amp;gt;🎉 会议室模式&amp;lt;/p&amp;gt;
&amp;lt;p class=&quot;text-gray-700 dark:text-gray-300&quot;&amp;gt;
开会开会，一堆 &amp;lt;span class=&quot;font-bold text-red-500 bg-red-100 dark:bg-red-900/50 px-1 rounded&quot;&amp;gt;乱七八糟&amp;lt;/span&amp;gt; 的员工在为你工作！
&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&lt;img src=&quot;./images/zxym-8.png&quot; alt=&quot;会议开始&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::tip[感谢]
特别需要感谢 &lt;a href=&quot;https://github.com/taochunyu&quot;&gt;taochunyu&lt;/a&gt;、&lt;a href=&quot;https://github.com/gnenux&quot;&gt;gnenux&lt;/a&gt;在我开发的过程中提供了很多帮助和建议，大家看到的右上角的小绿条token计数就是他的创意。
:::&lt;/p&gt;
&lt;h2&gt;架构&lt;/h2&gt;
&lt;h3&gt;openclaw的架构&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./images/zxym-1.png&quot; alt=&quot;openclaw的架构&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;目前架构&lt;/h3&gt;
&lt;p&gt;之所以说是目前的架构，是因为仍然在快速开发和变更：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/zxym-architecture.svg&quot; alt=&quot;目前的架构&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::tip[关于架构]
从整体上仍然是通过一个常驻线程进行调度，但是在细节上有一些区别。关于架构的，我会单独写一篇文章分析，因为还是比较复杂的。
:::&lt;/p&gt;
&lt;h2&gt;开始使用&lt;/h2&gt;
&lt;h3&gt;下载安装&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://studio.ai-nous.com/&quot;&gt;智心一梦助手官网&lt;/a&gt; 或者 &lt;a href=&quot;https://github.com/Pankitgg/open-ai-tool/releases&quot;&gt;github release&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;开始使用&lt;/h3&gt;
&lt;h3&gt;设置&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./images/zxym-4.png&quot; alt=&quot;设置&quot; /&gt;
点击添加模型配置默认模型，填写模型的api key和base url。如果没有模型可以在&lt;a href=&quot;https://www.bigmodel.cn/glm-coding?ic=W2CYSKAEOC&quot;&gt;智谱&lt;/a&gt;,&lt;a href=&quot;https://www.aliyun.com/benefit/ai/aistar?clubBiz=subTask..12415419..10263..&quot;&gt;阿里云&lt;/a&gt;,&lt;a href=&quot;https://platform.deepseek.com/usage&quot;&gt;deepseek&lt;/a&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;推荐购买按次收费的codeingplan计划，比较省钱。&amp;lt;b&amp;gt;免费模型的性能较差可能影响体验&amp;lt;/b&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;填写模型的api key和base url。&lt;/p&gt;
&lt;p&gt;&amp;lt;b&amp;gt;智谱&amp;lt;/b&amp;gt;
&lt;img src=&quot;./images/zxym-3.png&quot; alt=&quot;智谱模型配置&quot; /&gt;
&amp;lt;b&amp;gt;deepseek&amp;lt;/b&amp;gt;
&lt;img src=&quot;./images/zxym-5.png&quot; alt=&quot;deepseek模型配置&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::caution[注意]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;模型配置只需要添加一次，后面就可以在设置中切换模型。&lt;/li&gt;
&lt;li&gt;模型配置中的api key和base url是你自己的，不要分享给任何人。&lt;/li&gt;
&lt;li&gt;如果任何情况下没有回复，首先是模型配置的问题，检查一下模型配置是否填写正确。
:::&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;员工&lt;/h3&gt;
&lt;p&gt;添加员工，在AI自动生成中输入你想要的员工，点击生成即可&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;例如：我想添加一个叫智心一梦的员工，我可以输入：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;智心一梦是一个很有才华的员工，他会帮助我完成一些任务
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;或者是&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;石头人是一个杠精，他会无情的干掉ADC
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./images/zxym-6.png&quot; alt=&quot;添加员工&quot; /&gt;
&lt;img src=&quot;./images/zxym-7.png&quot; alt=&quot;添加员工&quot; /&gt;
重复操作即可添加多个员工&lt;/p&gt;
&lt;h3&gt;会议室&lt;/h3&gt;
&lt;p&gt;进入会议室后，点击添加员工，开始会议即可
&lt;img src=&quot;./images/zxym-8.png&quot; alt=&quot;会议开始&quot; /&gt;。
点击每个员工头像，可以查看员工记忆和对话
&lt;img src=&quot;./images/zxym-9.png&quot; alt=&quot;员工记忆和对话&quot; /&gt;
在员工界面也可以查看员工的记忆
&lt;img src=&quot;./images/zxym-10.png&quot; alt=&quot;员工记忆和修改&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;技能/工具&lt;/h3&gt;
&lt;p&gt;到此已经基本上具备基本功能了。下一步还可以配置一些技能/插件，让助手除了说还可以干活。&lt;/p&gt;
&lt;p&gt;&amp;lt;b&amp;gt;生成工具&amp;lt;/b&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;点击首页进入工具箱，输入你想要的工具，点击生成
例如你可以输入&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;一个用来展示条目信息的组件

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;点击左侧可以选择样式
&lt;img src=&quot;./images/zxym-13.png&quot; alt=&quot;生成工具样式&quot; /&gt;
&lt;img src=&quot;./images/zxym-12.png&quot; alt=&quot;生成工具&quot; /&gt;
等待一段时间即可生成工具
:::tip[注意]
生成工具需要一定的时间，取决于模型的性能。生成过程不会被打断，后续修改仍然可以在工具箱页面修改
:::
生成如下，可以通过AI优化和自定义修改工具
&lt;img src=&quot;./images/zxym-16.png&quot; alt=&quot;生成工具&quot; /&gt;
点击安装，我们可以在下方的调试区进行调试，包括模式切换和数据调试，以及AI调试修改
&lt;img src=&quot;./images/zxym-17.png&quot; alt=&quot;生成工具&quot; /&gt;
&lt;img src=&quot;./images/zxym-18.png&quot; alt=&quot;生成工具&quot; /&gt;
生成的工具可以在任何地方使用。首页可以直接点击工具，右键可隐藏&lt;/p&gt;
&lt;p&gt;&amp;lt;b&amp;gt;工具/技能使用&amp;lt;/b&amp;gt;&lt;/p&gt;
&lt;p&gt;生成的工具可以配置给员工，员工可以在会议室中使用。
首先点击进入数字员工界面，点击技能库新增技能
&lt;img src=&quot;./images/zxym-19.png&quot; alt=&quot;工具配置给员工&quot; /&gt;
&lt;img src=&quot;./images/zxym-20.png&quot; alt=&quot;工具配置给员工&quot; /&gt;
技能类型选择tool，工具选择已配置好的工具
点击进入员工界面，点击需要配置技能/工具的员工，在技能下拉内容增加所需技能即可
&lt;img src=&quot;./images/zxym-21.png&quot; alt=&quot;工具配置给员工&quot; /&gt;
:::tip[注意]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;技能/工具配置给员工后，员工可以在会议室中使用。&lt;/li&gt;
&lt;li&gt;技能/工具的使用，需要员工自己触发，目前没有自动触发的功能。&lt;/li&gt;
&lt;li&gt;系统默认增加了一些技能
:::&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;宠物模式&lt;/h3&gt;
&lt;p&gt;点击首页宠物图标，即可进入宠物模式
&lt;img src=&quot;./images/zxym-14.png&quot; alt=&quot;宠物模式&quot; /&gt;
右键宠物模式可以退出宠物模式
&lt;img src=&quot;./images/zxym-15.png&quot; alt=&quot;退出宠物模式&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;最佳实践（一场酣畅淋漓的会议）&lt;/h2&gt;
&lt;p&gt;&amp;lt;!-- 视频占位 --&amp;gt;
视频还未录制（等我录制完再放出来）&lt;/p&gt;
&lt;h2&gt;后续计划&lt;/h2&gt;
&lt;p&gt;后续会增加 &lt;strong&gt;小鱼干&lt;/strong&gt; ，作为一种和宠物交互的代币。增加宠物更多的好玩的特征，以及建设一个插件市场，来在市场中上架游戏（其实就是插件），让宠物和自己写的插件交互等等。&lt;/p&gt;
&lt;p&gt;会议室/员工，会增加一些最好用的样例。我不想做成一个大而全，像是cherrystudio那种啥都有的，所以这个的配置一定是我自己觉得非常好用才会推给大家。&lt;/p&gt;
&lt;p&gt;记忆系统，目前的记忆总结的触发一个是触发删除mcp的时候，一个是触发条数上限的时候，需要更多的场景来测试和优化。&lt;/p&gt;
&lt;p&gt;等等等等，还有好多好玩的想法，&lt;s&gt;只是这里写不下了&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;如果你想加入我，或者有什么建议&lt;/p&gt;
&lt;p&gt;可以关注公众号：智心一梦（这是我个人公众号）&lt;/p&gt;
&lt;p&gt;邮箱：pankitgg0@gmail.com&lt;/p&gt;
&lt;p&gt;QQ群：1081954601&lt;/p&gt;
</content:encoded></item><item><title>消失的一个月，我做了什么</title><link>https://blog.ai-nous.com/posts/%E6%B6%88%E5%A4%B1%E7%9A%84%E4%B8%80%E4%B8%AA%E6%9C%88%E6%88%91%E5%81%9A%E4%BA%86%E4%BB%80%E4%B9%88/</link><guid isPermaLink="true">https://blog.ai-nous.com/posts/%E6%B6%88%E5%A4%B1%E7%9A%84%E4%B8%80%E4%B8%AA%E6%9C%88%E6%88%91%E5%81%9A%E4%BA%86%E4%BB%80%E4%B9%88/</guid><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><content:encoded/></item><item><title>哪个大模型最好用--此刻我们正经历大模型厂商的战争</title><link>https://blog.ai-nous.com/posts/%E5%93%AA%E4%B8%AA%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%9C%80%E5%A5%BD%E7%94%A8--%E6%AD%A4%E5%88%BB%E6%88%91%E4%BB%AC%E6%AD%A3%E7%BB%8F%E5%8E%86%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%8E%82%E5%95%86%E7%9A%84%E6%88%98%E4%BA%89/</link><guid isPermaLink="true">https://blog.ai-nous.com/posts/%E5%93%AA%E4%B8%AA%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%9C%80%E5%A5%BD%E7%94%A8--%E6%AD%A4%E5%88%BB%E6%88%91%E4%BB%AC%E6%AD%A3%E7%BB%8F%E5%8E%86%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%8E%82%E5%95%86%E7%9A%84%E6%88%98%E4%BA%89/</guid><pubDate>Thu, 29 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;如果你搜索关键字看到的这篇文章，那说明你也从模型发展中嗅到了未来。&lt;/p&gt;
&lt;p&gt;最近你会发现一个很明显的变化：不少国外的大模型开始“免费”给你生成代码，而且还支持把生成结果一键上传到 GitHub。表面上是福利，背后其实是一种很典型的逻辑：&lt;strong&gt;数据越多 → 模型越好用 → 更多人来用 → 数据更多&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这里面有个关键点可以用一句话概括：&lt;strong&gt;选择即投票&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;1. “选择即投票”：你用不用，就是在给它打分&lt;/h3&gt;
&lt;p&gt;当你让 AI 写一段代码，你接下来会做三件事之一：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;直接用它，并提交到仓库：相当于投了“赞成票”&lt;/li&gt;
&lt;li&gt;改一改再提交：相当于给了“更好的参考答案”&lt;/li&gt;
&lt;li&gt;不用这段：相当于投了“反对票”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这和谷歌的人机验证很像：让你去选“红绿灯/斑马线”那几张图。你以为是在证明自己是人，但你点的那些选择，本身也会反过来帮助系统变得更聪明。&lt;/p&gt;
&lt;p&gt;放到写代码这件事上也是一样：当大量人把 AI 生成的代码改完、用上、提交到 GitHub，本质上就是在用真实场景做“筛选”和“标注”。&lt;/p&gt;
&lt;h3&gt;2. 用 GitHub 占比看“模型实力”：50% 可能会出现“默认模型”&lt;/h3&gt;
&lt;p&gt;如果按“选择即投票”的思路继续推，一个挺直观的指标就是：&lt;strong&gt;某个模型生成的代码，在 GitHub 全部新增代码里占了多大比例&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;比例越高，说明两件事：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;它被更多人用在真实项目里（入口更强）&lt;/li&gt;
&lt;li&gt;它能拿到更多“被人类选择过”的反馈（训练更有优势）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而当这个比例接近、甚至超过 50% 的时候，事情就会变得很不一样：大家会越来越习惯某种写法、某些库、某些组织方式。久而久之，它就可能变成一种“默认的写代码方式”，也就是你说的&lt;strong&gt;默认模型&lt;/strong&gt;——不是官方宣布的，而是被大量使用“自然推出来”的。&lt;/p&gt;
&lt;h3&gt;3. 为什么谷歌免费 Gemini 并支持一键上传 GitHub 很高明&lt;/h3&gt;
&lt;p&gt;再回头看谷歌的策略（比如 Gemini 免费、并且支持一键上传 GitHub），就很好理解了。&lt;/p&gt;
&lt;p&gt;GitHub 是微软的地盘，但“代码从哪里来”更关键：如果越来越多代码是由 Gemini 生成、被人类挑选后提交上去，那么谷歌其实是在一个全球最大的代码池里，持续地制造“对自己有利的投票”和反馈。&lt;/p&gt;
&lt;p&gt;所以这不仅是“免费竞争”，更像是在抢一个长期位置：谁能更早、更大规模地进入开发者工作流，谁就更可能在未来拿到更多真实数据，进而把模型越滚越强。&lt;/p&gt;
&lt;h3&gt;4. 一个不太舒服但绕不过去的结论&lt;/h3&gt;
&lt;p&gt;我们在享受免费工具的时候，也在用自己的选择帮它变强：你每一次复制粘贴、每一次修改、每一次提交，都会变成它学习的一部分。&lt;/p&gt;
&lt;p&gt;从这个角度看，谷歌的一键上传策略，本质上是一场&lt;strong&gt;关于“未来代码基因”的争夺&lt;/strong&gt;：当 AI 生成的代码在 GitHub 上占据主导地位时，谁的模型是那个“最大贡献者”，谁就掌握了未来软件世界的底层规则。&lt;/p&gt;
</content:encoded></item><item><title>fresh2开发及快速入门（1）</title><link>https://blog.ai-nous.com/posts/fresh2%E5%BC%80%E5%8F%91%E5%8F%8A%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/</link><guid isPermaLink="true">https://blog.ai-nous.com/posts/fresh2%E5%BC%80%E5%8F%91%E5%8F%8A%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/</guid><description>fresh2开发及快速入门（1），介绍fresh2的基本环境搭建和启动</description><pubDate>Wed, 21 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;之所以最先使用Fresh 2.0，完全是个人品味问题，我一直想要使用vite的HMR和esm但是又不想用vue，vite的理念是先进并且适合
AI的，但是vue的话就差点意思了。之前的Fresh一直绑定在preact上，&lt;a href=&quot;https://deno.com/blog/fresh-and-vite&quot;&gt;最近终于可以使用vite的生态了&lt;/a&gt;，可喜可贺，手痒必须要试试。
另外，必须要说明的是Fresh 2.0是一个实验性项目，目前还不是正式版本，所以在使用过程中可能会遇到一些问题，但是瑕不掩瑜，Fresh 2.0的理念和架构确实是很有价值的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;群岛架构&lt;/li&gt;
&lt;li&gt;vite生态&lt;/li&gt;
&lt;li&gt;全栈&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;满足以上需求的目前也只有Fresh 2.0，我们可以把它现在看做Astro的全栈加强版，所以如果你也想探索一下最适合AI时代的全栈框架，一定要试一下Fresh 2.0&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;fresh2 启动！&lt;/h2&gt;
&lt;p&gt;首先我们需要安装&lt;a href=&quot;https://deno.com/&quot;&gt;deno&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Mac, Linux&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -fsSL https://deno.land/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;windows PowerShell&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;iwr https://deno.land/install.ps1 -useb | iex
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;更多安装方式可以查看 &lt;a href=&quot;https://github.com/denoland/deno_install&quot;&gt;deno_install&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;deno也有别人开发的版本管理工具类似nvm的dvm，可以按需安装。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm i @axetroy/dvm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当安装完成后，可以使用deno run 来运行ts,可以运行官方样例，也可以自己写一个&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;示例代码（点击展开）&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// hello.ts
import { serve } from &quot;https://deno.land/std@0.208.0/http/server.ts&quot;;

const handler = async (req: Request): Promise&amp;lt;Response&amp;gt; =&amp;gt; {
  const html = `
    &amp;lt;!DOCTYPE html&amp;gt;
    &amp;lt;html lang=&quot;zh-CN&quot;&amp;gt;
    &amp;lt;head&amp;gt;
      &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
      &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
      &amp;lt;title&amp;gt;欢迎&amp;lt;/title&amp;gt;
      &amp;lt;style&amp;gt;
        body {
          font-family: Arial, sans-serif;
          display: flex;
          justify-content: center;
          align-items: center;
          height: 100vh;
          margin: 0;
          background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        }
        .welcome-container {
          text-align: center;
          color: white;
          padding: 40px;
          border-radius: 10px;
          background: rgba(255, 255, 255, 0.1);
          backdrop-filter: blur(10px);
          box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
        }
        h1 {
          font-size: 48px;
          margin-bottom: 20px;
        }
        p {
          font-size: 18px;
          margin: 10px 0;
        }
      &amp;lt;/style&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
      &amp;lt;div class=&quot;welcome-container&quot;&amp;gt;
        &amp;lt;h1&amp;gt;欢迎！&amp;lt;/h1&amp;gt;
        &amp;lt;p&amp;gt;这是一个使用 Deno 运行的 TypeScript 页面&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt;当前时间: ${new Date().toLocaleString(&apos;zh-CN&apos;)}&amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;
  `;

  return new Response(html, {
    status: 200,
    headers: {
      &quot;content-type&quot;: &quot;text/html; charset=utf-8&quot;,
    },
  });
};

console.log(&quot;服务器运行在 http://localhost:8000&quot;);
await serve(handler, { port: 8000 });

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;deno hello.ts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./images/deno-start.png&quot; alt=&quot;deno 启动！&quot; /&gt;&lt;/p&gt;
&lt;p&gt;至此基础的环境ok了，下一步我们需要安装fresh 2.0&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;deno run -Ar jsr:@fresh/init
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./images/fresh2-init1.png&quot; alt=&quot;fresh 2.0 初始化&quot; /&gt;&lt;/p&gt;
&lt;p&gt;太棒了，没想到，这个下载的就是vite版的fresh 2.0的环境，下一步我们可以开始开发了。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;deno run dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./images/fresh2-start1.png&quot; alt=&quot;fresh 2.0 启动&quot; /&gt;&lt;/p&gt;
&lt;p&gt;当前的初步已经ok了，如果你对细节还有疑问可以在留言。下一章我将带你使用&amp;lt;b&amp;gt;全栈&amp;lt;/b&amp;gt;+&amp;lt;b&amp;gt;Fresh&amp;lt;/b&amp;gt;+&amp;lt;b&amp;gt;群岛架构&amp;lt;/b&amp;gt;+&amp;lt;b&amp;gt;AI&amp;lt;/b&amp;gt;开发一个好玩的游戏。&lt;/p&gt;
</content:encoded></item><item><title>全栈框架分析及AI时代选型</title><link>https://blog.ai-nous.com/posts/%E5%85%A8%E6%A0%88%E6%A1%86%E6%9E%B6%E5%88%86%E6%9E%90%E5%8F%8Aai%E6%97%B6%E4%BB%A3%E9%80%89%E5%9E%8B/</link><guid isPermaLink="true">https://blog.ai-nous.com/posts/%E5%85%A8%E6%A0%88%E6%A1%86%E6%9E%B6%E5%88%86%E6%9E%90%E5%8F%8Aai%E6%97%B6%E4%BB%A3%E9%80%89%E5%9E%8B/</guid><description>以“AI 编程适合度”为视角，系统对比主流全栈框架与元框架，并给出选型路径与落地建议</description><pubDate>Wed, 21 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;过去十年“全栈框架”的讨论更多围绕：渲染方案、路由、数据获取、缓存、部署与开发体验。进入 AI 时代之后，评估维度变了：你不仅要把页面做出来，还要把一个带推理与工具调用的系统接进产品——它要流式输出、要能调用数据库/搜索/业务 API、要能回放与审计、要能灰度与回滚、要能控成本与控延迟。&lt;/p&gt;
&lt;p&gt;这篇文章用一个更工程化的视角，把“什么框架能做全栈”与“什么框架更适合 AI 编程”拆开来讲：前者看能力边界，后者看结构化与可维护性。&lt;/p&gt;
&lt;h2&gt;1. 先定义：AI 时代的“全栈”到底多了什么&lt;/h2&gt;
&lt;p&gt;如果把传统 Web 应用的闭环写成「请求 → 读写数据 → 渲染 → 交互 → 再请求」，AI 时代新增的关键链路是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;流式与增量 UI&lt;/strong&gt;：聊天、Copilot、生成式表单等，需要边生成边渲染，且可中断、可续写。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具调用与编排&lt;/strong&gt;：模型不只“回答”，而是要调用搜索、数据库、第三方 API、队列任务，然后再整合结果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据治理与评测&lt;/strong&gt;：提示词版本、输出结构校验、A/B 测试、离线回放、敏感信息与权限边界。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;推理运行时多样化&lt;/strong&gt;：同一应用可能同时用到 Node、Edge runtime、Worker、后台任务、甚至 GPU 推理服务。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此，“AI 友好”的全栈框架通常具备这些工程特征：约定强、边界清晰、类型可贯通、可插拔的运行时与部署路径、以及成熟的生态（鉴权/数据库/缓存/队列/观测）。&lt;/p&gt;
&lt;h2&gt;2. 评估维度：什么叫“AI 编程适合度”&lt;/h2&gt;
&lt;p&gt;这里的“适合度”不是在比谁更潮，而是在比：当你把需求交给 AI（或让 AI 参与编码）时，代码能否更稳定地被生成、被重构、被测试、被上线。&lt;/p&gt;
&lt;p&gt;我用 6 个维度来评分（1–5 分，越高越适合 AI 协作开发）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;可预测的项目结构&lt;/strong&gt;：路由、数据加载、Action、组件边界清晰，AI 生成不容易“发散”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;端到端类型与 schema 驱动&lt;/strong&gt;：请求/响应/数据库模型能对齐，减少“靠猜”的胶水代码。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务端能力一等公民&lt;/strong&gt;：SSR/Actions/后台任务/队列等是框架内置而不是外挂拼装。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可观测与可测试&lt;/strong&gt;：可复现、可回放、可做契约测试与 E2E，避免“能跑就行”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;部署路径清晰&lt;/strong&gt;：本地与生产一致性好；Edge/Server 的差异可被框架约束。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 生态与样例成熟&lt;/strong&gt;：已有成熟的 AI SDK、流式 UI、工具调用范式与参考实现。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;3. 全栈框架全景对比表（尽可能覆盖主流生态）&lt;/h2&gt;
&lt;p&gt;说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“全栈框架”在不同语言里含义不同：有的强调“前后端一体”（元框架），有的强调“后端 + 模板/组件渲染”，也有一类是“平台型全栈”（BaaS/内容系统自带 UI + API）。&lt;/li&gt;
&lt;li&gt;表格覆盖各主流语言生态里仍活跃、可用于生产的全栈框架/元框架，并额外纳入一批常被用于全栈交付的选择。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;div id=&quot;fs-matrix-card&quot; class=&quot;fs-table-card&quot;&amp;gt;
&amp;lt;style&amp;gt;
.fs-table-card { position: relative; border: 1px solid var(--line-divider); border-radius: 0.75rem; background: var(--card-bg); margin: 1rem 0; }
.fs-scroll { overflow: auto; max-height: clamp(320px, 60vh, 620px); -webkit-overflow-scrolling: touch; scrollbar-gutter: stable; cursor: grab; }
.fs-scroll::-webkit-scrollbar { height: 10px; width: 10px; }
.fs-scroll::-webkit-scrollbar-track { background: color-mix(in srgb, var(--card-bg) 75%, var(--line-divider)); border-radius: 999px; }
.fs-scroll::-webkit-scrollbar-thumb { background: color-mix(in srgb, var(--primary) 45%, var(--line-divider)); border-radius: 999px; }
.fs-scroll.fs-dragging { cursor: grabbing; }
.fs-scroll.fs-dragging, .fs-scroll.fs-dragging * { user-select: none; }
.fs-table-card:before, .fs-table-card:after { content: &apos;&apos;; position: absolute; top: 0; bottom: 0; width: 38px; pointer-events: none; opacity: 0; transition: opacity 160ms ease; }
.fs-table-card:before { left: 0; background: linear-gradient(to right, var(--card-bg), color-mix(in srgb, var(--card-bg) 0%, transparent)); }
.fs-table-card:after { right: 0; background: linear-gradient(to left, var(--card-bg), color-mix(in srgb, var(--card-bg) 0%, transparent)); }
.fs-table-card[data-can-left=&quot;1&quot;]:before { opacity: 1; }
.fs-table-card[data-can-right=&quot;1&quot;]:after { opacity: 1; }
.fs-matrix { width: 100%; min-width: 1400px; border-collapse: separate; border-spacing: 0; }
.fs-matrix th, .fs-matrix td { padding: 0.55rem 0.7rem; border-bottom: 1px solid var(--line-divider); vertical-align: top; font-size: 0.92rem; color: var(--tw-prose-body); }
.fs-matrix thead th { position: sticky; top: 0; background: var(--card-bg); z-index: 2; color: var(--tw-prose-headings); border-bottom: 1px solid var(--line-divider); }
.fs-matrix tr:last-child td { border-bottom: 0; }
.fs-nowrap { white-space: nowrap; }
.fs-score { text-align: center; white-space: nowrap; font-variant-numeric: tabular-nums; }
.fs-nav { position: absolute; top: 50%; transform: translateY(-50%); width: 34px; height: 34px; border-radius: 999px; border: 1px solid var(--line-divider); background: color-mix(in srgb, var(--card-bg) 78%, var(--btn-regular-bg)); color: var(--tw-prose-headings); display: grid; place-items: center; cursor: pointer; z-index: 3; box-shadow: 0 6px 22px rgba(0,0,0,.10); }
.fs-nav:hover { background: color-mix(in srgb, var(--card-bg) 62%, var(--btn-regular-bg-hover)); }
.fs-nav:active { background: color-mix(in srgb, var(--card-bg) 55%, var(--btn-regular-bg-active)); transform: translateY(-50%) scale(0.98); }
.fs-nav[disabled] { opacity: 0.35; cursor: default; box-shadow: none; }
.fs-nav-left { left: 10px; }
.fs-nav-right { right: 10px; }
.fs-hint { position: absolute; top: 8px; right: 10px; z-index: 3; padding: 0.25rem 0.55rem; border-radius: 999px; border: 1px solid var(--line-divider); background: color-mix(in srgb, var(--card-bg) 80%, var(--btn-regular-bg)); color: color-mix(in srgb, var(--tw-prose-body) 72%, var(--tw-prose-headings)); font-size: 0.78rem; white-space: nowrap; }
.fs-pill { display: inline-flex; align-items: center; padding: 0.12rem 0.55rem; border-radius: 999px; background: var(--fs-pill-bg); border: 1.25px solid var(--fs-pill-br); font-weight: 600; line-height: 1.15; white-space: nowrap; }
&amp;lt;/style&amp;gt;
&amp;lt;div class=&quot;fs-scroll&quot; id=&quot;fs-matrix-scroll&quot; aria-label=&quot;全栈框架对比表（可上下左右滚动）&quot;&amp;gt;
&amp;lt;table class=&quot;fs-matrix&quot;&amp;gt;
&amp;lt;thead&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;th class=&quot;fs-nowrap&quot;&amp;gt;分类&amp;lt;/th&amp;gt;
&amp;lt;th class=&quot;fs-nowrap&quot;&amp;gt;框架&amp;lt;/th&amp;gt;
&amp;lt;th class=&quot;fs-nowrap&quot;&amp;gt;主语言&amp;lt;/th&amp;gt;
&amp;lt;th&amp;gt;前端/渲染模型&amp;lt;/th&amp;gt;
&amp;lt;th&amp;gt;后端/数据能力&amp;lt;/th&amp;gt;
&amp;lt;th class=&quot;fs-nowrap&quot;&amp;gt;部署形态（常见）&amp;lt;/th&amp;gt;
&amp;lt;th class=&quot;fs-score&quot;&amp;gt;AI 适合度&amp;lt;/th&amp;gt;
&amp;lt;th&amp;gt;典型适用场景&amp;lt;/th&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;/thead&amp;gt;
&amp;lt;tbody&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS 元框架&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Next.js&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS/JS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR/SSG/RSC/Server Actions&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Route Handlers、Server Actions、Middleware&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Node/Vercel/Serverless/部分 Edge&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;产品型 Web、AI App、BFF 一体化&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS 元框架&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Remix&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS/JS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR 优先（loader/action）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;表单与 Action 一体、Web 标准倾向&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Node/Serverless&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;表单密集、数据驱动、稳定迭代&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS 元框架&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;SvelteKit&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS/JS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR/SSG（Svelte）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;端点 + Actions、适配器生态&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Node/Edge/Serverless&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;中小型产品、性能与 DX 平衡&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS 元框架&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Nuxt 3&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS/JS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR/SSG（Vue）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Nitro Server、server routes&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Node/Edge/Serverless&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Vue 生态、全栈内容与应用&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS 元框架&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Angular（SSR）&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR/SSG（Angular）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR 服务端 + API（需组合）&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Node/Serverless&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;大型企业前端、强规范团队&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS 元框架&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Astro（SSR）&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS/JS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;内容优先 + Islands/SSR&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;端点/中间件（需按项目组织）&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Node/Serverless&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;内容站 + 轻交互/轻后端&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS 元框架&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Gatsby&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS/JS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSG + Functions&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Functions（需组合数据层）&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Serverless/托管&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;营销站/内容站 + 轻后端&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS 元框架&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Qwik City&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS/JS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR/Resumability&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;端点 + Actions&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Edge/Serverless&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;极致首屏、边缘分发&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS 元框架&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;SolidStart&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS/JS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR（Solid）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;路由/数据加载/Actions&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Node/Serverless&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;偏前沿团队、追求轻量响应&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS 元框架&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TanStack Start&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS/JS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR（Router + Query）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;约定式全栈路由（新）&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Node/Serverless&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;已重度 TanStack 生态的团队&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS 全栈框架&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;RedwoodJS&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS/JS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;React SPA/SSR（演进中）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;GraphQL API、Prisma、Jobs&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Serverless/Node&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;业务后台、CRUD + 权限模型&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS 全栈框架&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Blitz.js&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS/JS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Next.js 之上（RPC）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;端到端类型 RPC&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Node&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;快速交付、重视类型贯通&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS 全栈框架&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Wasp&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS/JS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;React/Vue（脚手架）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;全栈模板化、Auth/CRUD&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Node/云部署&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SaaS 快速落地、约定化全栈&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS 全栈框架&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Meteor&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;JS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;同构渲染（传统）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;实时数据/订阅&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Node&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;需要强实时但能接受框架约束&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS 后端+视图&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;AdonisJS&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;模板/视图（Edge）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;MVC、ORM、队列、鉴权&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Node&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Node 后端团队想要“Rails 式”&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS 后端+视图&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;NestJS（+模板）&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;模板/SSR（需组合）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;DI、模块化、微服务&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Node&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;大型后端、服务治理优先&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;JS 全栈（传统）&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Sails.js&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;JS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR（视图）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;MVC、ORM、约定式&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Node&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;传统全栈、快速 CRUD&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Web 标准后端&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Hono（+前端）&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS/JS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;需组合（常配 React/Vue）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Web 标准路由、中间件&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Edge/Node&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Edge API、轻量 BFF、AI 网关&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Bun 生态&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Elysia（+前端）&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;需组合&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;轻量高性能后端&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Bun/Node（部分）&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;性能实验、偏后端 API&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Deno 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Fresh&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR（Islands）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Deno 原生路由与中间件&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Deno Deploy/Server&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Deno 团队、轻量全栈&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Ruby 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Ruby on Rails&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Ruby&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR（ERB/Hotwire）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ActiveRecord、Jobs、ActionCable&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;VM/容器&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;业务系统、AI 能力快速集成&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Ruby 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Hanami&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Ruby&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;框架更轻、更显式&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;VM/容器&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;喜欢更可控的 Ruby 架构&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;PHP 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Laravel&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;PHP&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR（Blade/Inertia）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Eloquent、队列、事件、生态强&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;VM/容器/Serverless&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;中小企业应用、CRUD/后台&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;PHP 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Symfony&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;PHP&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR（Twig）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;组件化成熟、可组合&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;VM/容器&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;中大型 PHP 项目、长期维护&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;PHP 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Yii&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;PHP&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;MVC、ORM、成熟生态&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;VM/容器&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;传统业务系统&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;PHP 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;CakePHP&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;PHP&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;约定式 MVC&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;VM/容器&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;中小项目、快速交付&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;PHP 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;CodeIgniter&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;PHP&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;轻量 MVC&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;VM/容器&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;轻量传统站点&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Python 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Django&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Python&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR（模板）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;ORM、Admin、Auth、Jobs（组合）&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;VM/容器&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;业务后台、内容管理、AI 结合&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Python 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;FastAPI（+模板）&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Python&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR（需组合）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;API 优先、类型注解&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;VM/容器&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;API + 前端分离、AI 服务&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Python 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Flask（+模板）&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Python&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR（需组合）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;轻量后端、可组合&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;VM/容器&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;小型应用、偏 API/工具&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Python 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Pyramid&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Python&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR（模板）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;更传统、更显式&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;VM/容器&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;传统企业 Python Web&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Elixir 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Phoenix LiveView&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Elixir&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR + LiveView（状态同步）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;OTP、Channel、强实时&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;VM/容器&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;实时协作、仪表盘、Agent UI&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Java 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Spring Boot（MVC）&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Java&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR（Thymeleaf 等）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;生态巨大、治理成熟&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;容器/VM&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;大型企业、合规与治理&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Java 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Quarkus（+模板）&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Java&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR（Qute 等）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;云原生、轻量&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;容器/VM&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;云原生 Java、微服务到全栈&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Java 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Micronaut（+模板）&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Java&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR（需组合）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;轻量、AOT 倾向&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;容器/VM&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;云原生 Java&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Java 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Vaadin&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Java&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;服务器驱动 UI&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;UI 与后端同一语言&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;容器/VM&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;内部系统、强表单/数据录入&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;.NET 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;ASP.NET Core（MVC）&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;C#&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR（Razor）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Identity、EF Core、后台任务&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;容器/VM&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;企业应用、微软生态&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;.NET 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Blazor&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;C#&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR/WA（同构）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;UI 与后端一体&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;容器/VM&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;.NET 团队、全栈同语言&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;.NET 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;ABP Framework&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;C#&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR/SPA（可选）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;模块化企业框架、DDD 倾向&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;容器/VM&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;企业级后台、快速搭骨架&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Go 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Buffalo&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Go&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR（模板）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Rails 风格、生产可用&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;容器/VM&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Go 团队做传统全栈&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Go 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Beego&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Go&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR/API&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;MVC、ORM（可选）&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;容器/VM&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;传统 Go Web&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Go 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Revel&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Go&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;传统 MVC&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;容器/VM&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;历史项目维护&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Rust 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Leptos&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Rust&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR（WASM/SSR）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;全栈 Rust（偏前沿）&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;容器/VM&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;性能/安全、愿意投入学习曲线&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Rust 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Axum + 模板/前端&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Rust&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;需组合&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;API 强、需自行装配全栈能力&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;容器/VM&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;高性能 API + 自定义前端&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Rust 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Rocket（+模板）&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Rust&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR（模板）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;传统后端框架&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;容器/VM&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;小型项目/学习&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Scala 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Play Framework&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Scala/Java&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSR&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;JVM 生态、传统全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;容器/VM&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;JVM 团队、Scala 全栈&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;CMS 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Payload&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS/JS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Admin UI + API&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;内容建模、Auth、DB&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Node/Serverless&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;内容驱动产品、AI 内容工作流&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;CMS 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Strapi&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Node/TS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Admin UI + API&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;插件化 CMS、RBAC&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Node/容器&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Headless CMS、内容中台&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;CMS 全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Keystone&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;TS/JS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Admin UI + GraphQL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Schema 驱动、可扩展&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Node&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;可定制内容系统&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;平台型全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Supabase&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;平台&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;前端任意&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Postgres + Auth + Storage + Edge Functions&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;托管/自建&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;快速做 AI 产品、RAG 数据层&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;平台型全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Firebase&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;平台&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;前端任意&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Auth/DB/Functions/Storage&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;托管&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;移动端/轻后端、原型到中型&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;平台型全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Appwrite&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;平台&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;前端任意&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Auth/DB/Functions/Storage&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;托管/自建&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;需要自建 BaaS 的团队&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;平台型全栈&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;PocketBase&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;Go（单体）&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;前端任意&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;单文件数据库 + Auth + API&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-nowrap&quot;&amp;gt;单机/小型&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;fs-score&quot;&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;小团队、快速交付、低成本&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;button type=&quot;button&quot; class=&quot;fs-nav fs-nav-left&quot; data-dir=&quot;left&quot; aria-label=&quot;向左滚动&quot;&amp;gt;‹&amp;lt;/button&amp;gt;
&amp;lt;button type=&quot;button&quot; class=&quot;fs-nav fs-nav-right&quot; data-dir=&quot;right&quot; aria-label=&quot;向右滚动&quot;&amp;gt;›&amp;lt;/button&amp;gt;
&amp;lt;div class=&quot;fs-hint&quot;&amp;gt;可左右滑动&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;script type=&quot;module&quot;&amp;gt;
const card = document.getElementById(&apos;fs-matrix-card&apos;);
const scroller = document.getElementById(&apos;fs-matrix-scroll&apos;);
if (card &amp;amp;&amp;amp; scroller) {
const leftBtn = card.querySelector(&apos;[data-dir=&quot;left&quot;]&apos;);
const rightBtn = card.querySelector(&apos;[data-dir=&quot;right&quot;]&apos;);&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  const step = () =&amp;gt; Math.max(260, Math.round(scroller.clientWidth * 0.68));
  const update = () =&amp;gt; {
    const max = scroller.scrollWidth - scroller.clientWidth;
    const canLeft = scroller.scrollLeft &amp;gt; 2;
    const canRight = scroller.scrollLeft &amp;lt; max - 2;
    card.dataset.canLeft = canLeft ? &apos;1&apos; : &apos;0&apos;;
    card.dataset.canRight = canRight ? &apos;1&apos; : &apos;0&apos;;
    if (leftBtn instanceof HTMLButtonElement) leftBtn.disabled = !canLeft;
    if (rightBtn instanceof HTMLButtonElement) rightBtn.disabled = !canRight;
  };

  if (leftBtn) leftBtn.addEventListener(&apos;click&apos;, () =&amp;gt; scroller.scrollBy({ left: -step(), behavior: &apos;smooth&apos; }));
  if (rightBtn) rightBtn.addEventListener(&apos;click&apos;, () =&amp;gt; scroller.scrollBy({ left: step(), behavior: &apos;smooth&apos; }));
  scroller.addEventListener(&apos;scroll&apos;, update, { passive: true });
  window.addEventListener(&apos;resize&apos;, update);
  update();

  let dragging = false;
  let startX = 0;
  let startY = 0;
  let startLeft = 0;
  let startTop = 0;
  let activePointerId = -1;

  const stopDrag = () =&amp;gt; {
    if (!dragging) return;
    dragging = false;
    scroller.classList.remove(&apos;fs-dragging&apos;);
    if (activePointerId !== -1) {
      try {
        scroller.releasePointerCapture(activePointerId);
      } catch {}
    }
    activePointerId = -1;
  };

  scroller.addEventListener(&apos;pointerdown&apos;, (e) =&amp;gt; {
    if (!(e instanceof PointerEvent)) return;
    if (e.pointerType !== &apos;mouse&apos;) return;
    if (e.button !== 0) return;
    dragging = true;
    startX = e.clientX;
    startY = e.clientY;
    startLeft = scroller.scrollLeft;
    startTop = scroller.scrollTop;
    activePointerId = e.pointerId;
    scroller.classList.add(&apos;fs-dragging&apos;);
    try {
      scroller.setPointerCapture(e.pointerId);
    } catch {}
    e.preventDefault();
  });

  scroller.addEventListener(&apos;pointermove&apos;, (e) =&amp;gt; {
    if (!dragging) return;
    const dx = e.clientX - startX;
    const dy = e.clientY - startY;
    scroller.scrollLeft = startLeft - dx;
    scroller.scrollTop = startTop - dy;
  });

  scroller.addEventListener(&apos;pointerup&apos;, stopDrag);
  scroller.addEventListener(&apos;pointercancel&apos;, stopDrag);
  scroller.addEventListener(&apos;mouseleave&apos;, stopDrag);

  const table = scroller.querySelector(&apos;table&apos;);
  if (table) {
    const renderModelCol = 3;
    const deployCol = 5;

    const renderModelKeywords = [
      &apos;SSR&apos;,
      &apos;SSG&apos;,
      &apos;RSC&apos;,
      &apos;Islands&apos;,
      &apos;ISR&apos;,
      &apos;CSR&apos;,
      &apos;SPA&apos;,
      &apos;MPA&apos;,
      &apos;PWA&apos;,
      &apos;Resumability&apos;,
    ];

    const hashString = (str) =&amp;gt; {
      let hash = 2166136261;
      for (let i = 0; i &amp;lt; str.length; i++) {
        hash ^= str.charCodeAt(i);
        hash = Math.imul(hash, 16777619);
      }
      return hash &amp;gt;&amp;gt;&amp;gt; 0;
    };

    const keywordHue = new Map([
      [&apos;SSR&apos;, 210],
      [&apos;SSG&apos;, 150],
      [&apos;RSC&apos;, 275],
      [&apos;ISLANDS&apos;, 32],
      [&apos;ISR&apos;, 170],
      [&apos;CSR&apos;, 195],
      [&apos;SPA&apos;, 8],
      [&apos;MPA&apos;, 320],
      [&apos;PWA&apos;, 92],
      [&apos;RESUMABILITY&apos;, 48],
    ]);

    const makeHs = (hue, sat, light) =&amp;gt; {
      const alpha = 0.22;
      const borderAlpha = 0.42;
      return {
        bg: `hsla(${hue}, ${sat}%, ${light}%, ${alpha})`,
        br: `hsla(${hue}, ${sat}%, ${light}%, ${borderAlpha})`,
      };
    };

    const colorsForKeyword = (keyword) =&amp;gt; {
      const key = keyword.toUpperCase();
      const hue = keywordHue.get(key);
      if (typeof hue === &apos;number&apos;) return makeHs(hue, 76, 52);
      const hash = hashString(key);
      const hueFallback = hash % 360;
      const lightFallback = 44 + ((hash &amp;gt;&amp;gt;&amp;gt; 8) % 18);
      return makeHs(hueFallback, 72, lightFallback);
    };

    const escapeRegExp = (str) =&amp;gt; str.replace(/[.*+?^${}()|[\]\\]/g, &apos;\\$&amp;amp;&apos;);

    const highlightKeywords = (td, text) =&amp;gt; {
      const sorted = [...renderModelKeywords].sort((a, b) =&amp;gt; b.length - a.length);
      const re = new RegExp(`\\b(${sorted.map(escapeRegExp).join(&apos;|&apos;)})\\b`, &apos;gi&apos;);
      const frag = document.createDocumentFragment();
      let lastIndex = 0;
      let match;
      while ((match = re.exec(text)) !== null) {
        if (match.index &amp;gt; lastIndex) frag.appendChild(document.createTextNode(text.slice(lastIndex, match.index)));
        const raw = match[0];
        const colors = colorsForKeyword(raw);
        const span = document.createElement(&apos;span&apos;);
        span.className = &apos;fs-pill&apos;;
        span.style.setProperty(&apos;--fs-pill-bg&apos;, colors.bg);
        span.style.setProperty(&apos;--fs-pill-br&apos;, colors.br);
        span.textContent = raw;
        frag.appendChild(span);
        lastIndex = match.index + raw.length;
      }
      if (lastIndex &amp;lt; text.length) frag.appendChild(document.createTextNode(text.slice(lastIndex)));
      td.textContent = &apos;&apos;;
      td.appendChild(frag);
    };

    const rows = table.querySelectorAll(&apos;tbody tr&apos;);
    rows.forEach(row =&amp;gt; {
      const cells = row.querySelectorAll(&apos;td&apos;);
      const renderModelCell = cells.item(renderModelCol);
      if (renderModelCell) {
        const raw = renderModelCell.textContent ?? &apos;&apos;;
        if (raw.trim()) highlightKeywords(renderModelCell, raw);
      }

      const deployCell = cells.item(deployCol);
      if (deployCell) {
        const value = (deployCell.textContent ?? &apos;&apos;).trim();
        if (value) {
          const colors = colorsForKeyword(value);
          const span = document.createElement(&apos;span&apos;);
          span.className = &apos;fs-pill&apos;;
          span.style.setProperty(&apos;--fs-pill-bg&apos;, colors.bg);
          span.style.setProperty(&apos;--fs-pill-br&apos;, colors.br);
          span.textContent = value;
          deployCell.textContent = &apos;&apos;;
          deployCell.appendChild(span);
        }
      }

      const scoreCell = row.querySelector(&apos;td.fs-score&apos;);
      if (scoreCell) {
        const value = (scoreCell.textContent ?? &apos;&apos;).trim();
        if (value) {
          const score = Number(value);
          const hue = score &amp;gt;= 5 ? 145 : score === 4 ? 175 : score === 3 ? 210 : score === 2 ? 35 : 6;
          const span = document.createElement(&apos;span&apos;);
          span.className = &apos;fs-pill&apos;;
          span.style.setProperty(&apos;--fs-pill-bg&apos;, `hsla(${hue}, 74%, 52%, 0.22)`);
          span.style.setProperty(&apos;--fs-pill-br&apos;, `hsla(${hue}, 74%, 52%, 0.42)`);
          span.textContent = value;
          scoreCell.textContent = &apos;&apos;;
          scoreCell.appendChild(span);
        }
      }
    });
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/script&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;3.1 读表指南：分数为什么会拉开&lt;/h2&gt;
&lt;p&gt;同一个“全栈”，在 AI 场景下表现差异很大，原因通常不在性能，而在工程边界：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;5 分档（更推荐做 AI 产品主干）&lt;/strong&gt;：元框架内置了稳定的读写数据语义（loader/action、actions、handlers），流式 UI 与工具调用范式成熟，AI 更容易写出“可维护”的结果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3–4 分档（稳健但要立规矩）&lt;/strong&gt;：能力够用，但你需要把鉴权、数据访问、任务队列、错误处理固化成团队约定，否则 AI 写出来会出现多套风格并存。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1–2 分档（能做但不建议作为默认）&lt;/strong&gt;：全栈能力更多依赖你自己装配；AI 协作时更容易产生隐性耦合与不可回放的实现。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;4. 为什么有的框架更“适合 AI 编程”&lt;/h2&gt;
&lt;p&gt;把 AI 当作“会写代码的同事”时，你会发现它最怕两类项目：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;结构不稳定&lt;/strong&gt;：同一个需求在不同模块里有不同写法，或者靠大量自定义约定才能跑起来。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;隐式魔法太多&lt;/strong&gt;：运行时行为难以从代码直观看出来，AI 很难在重构时不踩坑。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;反过来，更 AI 友好的框架往往具备这些共同点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;强约定 + 少选择题&lt;/strong&gt;：文件路由、数据加载、表单提交、错误边界有固定入口，AI 不容易“写偏”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;类型/Schema 是事实来源&lt;/strong&gt;：DB schema、API contract、工具调用参数等可以被校验与生成。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务端边界明确&lt;/strong&gt;：哪些代码跑在 Server/Edge/Client，一眼就能看出，避免把密钥带进浏览器。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以 TypeScript 生态为例，Vercel 的 AI SDK 明确提供了面向 React/Next.js 等框架的流式 UI 与工具调用抽象，降低“自己拼 streaming + tool calling”的手工成本。[^1]&lt;/p&gt;
&lt;p&gt;同时，Edge/Worker 侧的推理与 embedding 能力越来越标准化，例如 Cloudflare Workers AI 提供了“在边缘调用模型”的路径，让你能把部分推理或向量化靠近用户，改善延迟与成本结构。[^2]&lt;/p&gt;
&lt;h2&gt;5. 重点框架解读（按“全栈形态”分组）&lt;/h2&gt;
&lt;p&gt;下面不按“谁更强”排序，而是按“你会怎么把它用在 AI 产品里”来讲。&lt;/p&gt;
&lt;h3&gt;5.1 元框架：前后端一体的产品交付线&lt;/h3&gt;
&lt;h4&gt;Next.js&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;全栈方式&lt;/strong&gt;：路由 + Server Actions/Route Handlers + SSR/RSC，前后端在同一仓库内闭环。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 友好点&lt;/strong&gt;：结构强约定、流式 UI 生态成熟、TS 贯通更容易收敛到稳定形态。[^1]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意点&lt;/strong&gt;：RSC/缓存/运行时组合非常强大，也更复杂；团队需要建立统一的目录与数据获取规范。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Remix&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;全栈方式&lt;/strong&gt;：loader/action 把“读数据”和“写数据”固定在同一套路由语义下，偏 Web 标准。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 友好点&lt;/strong&gt;：模型更易理解（表单提交就是 action），代码生成更不容易跑偏；错误边界也更直观。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意点&lt;/strong&gt;：生态相对 Next.js 小一些，但在“表单密集 + 可维护”上很稳。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Nuxt 3 / SvelteKit&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;全栈方式&lt;/strong&gt;：SSR/SSG + 服务端路由/Actions（或 endpoints），与各自前端框架深度绑定。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 友好点&lt;/strong&gt;：约定明确、样板少；对中小团队尤为友好。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意点&lt;/strong&gt;：团队要尽早决定数据层（ORM/Query）与鉴权方案，避免后期多套并存。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.2 后端 + 视图：以“服务端为中心”的全栈&lt;/h3&gt;
&lt;h4&gt;Ruby on Rails&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;全栈方式&lt;/strong&gt;：MVC + ORM + Jobs + WebSocket（ActionCable），默认就能把业务做完整闭环。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 友好点&lt;/strong&gt;：约定优于配置做到极致，AI 生成 CRUD、后台、任务队列代码的成功率很高；把 AI 任务放在后台 Job 也很自然。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意点&lt;/strong&gt;：前端体验取决于你选择 Hotwire 还是前后端分离；团队如果已经是 TS 主栈，需要权衡语言栈分裂成本。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Laravel / Django / ASP.NET Core&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;共同优势&lt;/strong&gt;：成熟的鉴权、ORM、后台管理与生态，让你可以把精力更多放在 AI 能力本身（检索、工具、评测、成本）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 友好点&lt;/strong&gt;：约定稳定、框架年代久、资料多，LLM“见过的代码”更多，生成更稳。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意点&lt;/strong&gt;：如果你追求高度交互的前端体验，通常会走“后端提供 API + 前端元框架”的组合式全栈。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.3 内容系统/平台型全栈：把“数据层 + 管理 UI”当成默认能力&lt;/h3&gt;
&lt;h4&gt;Payload / Strapi / Keystone&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;全栈方式&lt;/strong&gt;：内置内容模型、权限与管理后台，前端可以是 Next/Nuxt 等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 友好点&lt;/strong&gt;：内容结构天然 schema 化，非常适合做 RAG 的知识源、内容工作流与审核流程。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意点&lt;/strong&gt;：内容系统不是通用业务框架；复杂交易/强一致业务仍需要严肃的后端域模型。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Supabase / Firebase（平台）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;全栈方式&lt;/strong&gt;：把 Auth、存储、数据库、函数、实时订阅做成平台能力，前端“拿来即用”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 友好点&lt;/strong&gt;：快速出 MVP；对 RAG 来说，Postgres/向量扩展、权限与存储这些“脏活累活”平台已经处理掉很多。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意点&lt;/strong&gt;：别把平台当魔法；多租户、合规、审计、成本可控仍然需要你在应用层建立规范。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.4 表格里其余框架逐条解释（速览）&lt;/h3&gt;
&lt;p&gt;下面这些框架同样能用于全栈交付，但更依赖你对“边界与约束”的工程化落地；我把它们按用途给出更直接的定位。&lt;/p&gt;
&lt;h4&gt;TS 元框架与前端绑定全栈&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Angular（SSR）&lt;/strong&gt;：适合强规范的大型团队；AI 协作时更建议把数据访问与状态管理固化成统一范式，否则生成代码容易出现多套风格。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Astro（SSR）&lt;/strong&gt;：内容/性能优先，适合作为内容站或文档站的“轻全栈”；AI 生成时要明确哪些页面需要 SSR、哪些是静态，否则很容易被“过度服务端化”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gatsby&lt;/strong&gt;：偏 SSG + Functions 的组合；适合内容站叠加轻后端能力；AI 编程适合度较低主要是因为“全栈路径不唯一”，需要你明确边界。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qwik City&lt;/strong&gt;：主打 Resumability；适合极致首屏与边缘分发，但团队需要较强的心智统一，才能让 AI 写出的代码保持一致性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SolidStart&lt;/strong&gt;：偏轻量 SSR；如果团队对 Solid 生态熟悉，体验很好，否则学习成本会传导到 AI 协作质量上。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TanStack Start&lt;/strong&gt;：适合已经重度依赖 TanStack Router/Query 的团队；整体偏新，建议先把“目录结构 + 数据访问规范 + 边界约束”写成模板再让 AI 扩展。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Node/JS 传统全栈与后端框架&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RedwoodJS&lt;/strong&gt;：偏“全栈应用框架/脚手架”，常见组合是 GraphQL + Prisma + Jobs；适合业务后台与标准化 CRUD，但要避免把业务全塞进 GraphQL resolver，建议形成清晰的 service 层。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blitz.js&lt;/strong&gt;：在 Next.js 上提供 RPC 形态的端到端类型；适合快速交付与减少样板；AI 协作时建议强制所有 mutation 走统一校验与权限中间层。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wasp&lt;/strong&gt;：把常见 SaaS 能力模板化（鉴权、CRUD 等），适合快速起步；AI 协作优势来自“更少的自由度”，但复杂场景可能需要下沉自定义。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Meteor&lt;/strong&gt;：同构与实时能力强，适合快速做原型；但现代部署与模块化实践上需要你额外补齐工程规范。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AdonisJS&lt;/strong&gt;：Node 生态里偏“Rails 路线”的全栈框架，MVC/ORM/队列/鉴权齐全；AI 生成 CRUD 与后台任务的成功率通常较高。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NestJS（+模板）&lt;/strong&gt;：更像后端应用框架；做全栈通常要叠加模板或前端元框架；AI 协作优势来自强模块化，但你需要明确“Controller/Service/Module”的边界与命名约定。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sails.js&lt;/strong&gt;：传统 MVC 与约定式结构，适合快速交付；但生态相对老，现代前端/AI 需求往往需要额外拼装。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hono（+前端）&lt;/strong&gt;：更像“跨运行时的 Web 标准后端”；用它做全栈时通常承担 BFF/AI 网关角色（鉴权、限流、工具调用代理），前端仍交给元框架。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Elysia（+前端）&lt;/strong&gt;：偏后端性能框架；用在全栈里更像 API 层；AI 协作风险在于“形态选择太自由”，最好配合 OpenAPI/Schema 来锁定契约。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Deno 全栈&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fresh&lt;/strong&gt;：SSR + Islands 的 Deno 全栈；适合追求轻量与边缘部署，但生态与资料密度不如 Node 主流，AI 生成质量会受影响。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Ruby/PHP/Python 的补充全栈&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hanami&lt;/strong&gt;：比 Rails 更轻、更显式，适合重视架构可控的 Ruby 团队；AI 协作关键是把应用层约定固定下来（如 service object、repository 模式）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Symfony&lt;/strong&gt;：更偏“组件化的企业 PHP”；AI 协作时建议强化模块边界与依赖注入配置，否则生成的代码容易跨层耦合。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Yii / CakePHP / CodeIgniter&lt;/strong&gt;：传统 MVC 路线；能做全栈交付，但现代 AI 需求（流式、工具编排、观测）大多需要你自己建立标准化模块。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FastAPI（+模板）&lt;/strong&gt;：更适合 API 优先；全栈形态通常是“FastAPI 做后端 + 前端元框架做 UI”；AI 协作优势在于 Python 类型注解与 pydantic schema。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flask（+模板）/ Pyramid&lt;/strong&gt;：轻量与传统路线；更适合小型应用或历史项目；AI 协作时尤其需要你把目录结构、蓝图/路由组织、配置分层固化。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Elixir 实时全栈&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Phoenix LiveView&lt;/strong&gt;：本质是“服务器驱动 UI + 实时状态同步”；适合 Agent UI、运维控制台、协作场景；AI 协作的关键是把事件与状态机设计清晰。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;JVM 与 .NET 企业全栈扩展&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Quarkus（+模板）/ Micronaut（+模板）&lt;/strong&gt;：云原生 JVM 框架，做全栈需要组合模板或前端；AI 协作更依赖你把 DTO、验证、鉴权与日志规范化。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vaadin&lt;/strong&gt;：服务器驱动 UI，适合内部系统；但 UI 范式与 Web 主流不同，AI 协作时需要更多明确的组件/表单规范。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blazor&lt;/strong&gt;：.NET 全栈同语言的方案；适合既有 C# 团队；AI 协作优势是类型系统贯通，但前端生态与主流 JS 有差异。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ABP Framework&lt;/strong&gt;：企业级模块化框架，适合快速搭管理后台与 DDD 风格骨架；AI 协作的重点是遵循它的模块与分层约定。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Go/Rust/Scala 全栈&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Buffalo / Beego / Revel&lt;/strong&gt;：Go 的传统全栈选择；多数团队会把它们用作“后端 + 模板”而非复杂前端；AI 协作建议用 OpenAPI/模板化目录来控制发散。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Leptos / Axum + 模板 / Rocket&lt;/strong&gt;：Rust 全栈可行但偏前沿；优势是性能与安全；AI 协作难点是生态碎片化与学习曲线，适合愿意投入的团队。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Play Framework&lt;/strong&gt;：JVM 传统全栈框架；适合 Scala/JVM 团队；AI 协作依赖规范化的路由、DTO、模板与服务分层。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;CMS 与平台型补充&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Payload / Strapi / Keystone&lt;/strong&gt;：适合把内容结构化后接 AI 工作流（检索、摘要、审核）；关键在于把内容模型当成“契约”，并把权限与审计做严。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Appwrite / PocketBase&lt;/strong&gt;：偏快速交付与低成本；适合原型或小型项目；AI 场景下要特别注意权限边界、速率限制与数据泄露风险。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;6. 从“AI 编程适合度”出发的选型结论（可直接抄作决策）&lt;/h2&gt;
&lt;p&gt;把问题换一种问法：&lt;strong&gt;为了让 AI 协作开发更可靠，你需要的是“更强的约束”而不是“更多的自由”。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;6.1 默认推荐（按团队主栈）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TS/React 团队做 AI 产品&lt;/strong&gt;：优先 Next.js 或 Remix；再结合 schema 驱动的数据层（如 Prisma/Drizzle）与严格的 API/工具调用契约。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vue 团队做全栈&lt;/strong&gt;：Nuxt 3 是最短路径；把 server routes/鉴权/数据访问集中到固定目录与固定模式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;后端强、前端一般&lt;/strong&gt;：Rails/Laravel/Django/ASP.NET Core 可以直接交付完整产品；前端若需要更强交互，再叠加一个元框架做 BFF。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;强实时/协作型产品&lt;/strong&gt;：Phoenix LiveView 值得优先评估；在实时状态同步方面，它往往比“前端 + WebSocket 胶水”更可控。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6.2 你真正需要做的“AI 友好工程化”&lt;/h3&gt;
&lt;p&gt;无论选什么框架，想让 AI 写得稳、你改得动，最终都要回到这些硬约束：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;把契约写成代码&lt;/strong&gt;：DB schema、OpenAPI/JSON Schema、工具参数 schema，能校验就不要靠约定。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;把边界写进目录结构&lt;/strong&gt;：server/edge/client 分层明确；密钥与权限在 server 侧可验证。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;把推理做成“可回放的任务”&lt;/strong&gt;：每次提示词、工具调用、输出都可追踪；失败可重试；成本可统计。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;把 UI 做成“可组合原语”&lt;/strong&gt;：组件库、设计 tokens、表单与验证规则固定，AI 才能稳定地产出一致 UI。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;7. 参考与延伸阅读&lt;/h2&gt;
&lt;p&gt;[^1]: AI SDK by Vercel. https://ai-sdk.dev/docs/introduction
[^2]: Cloudflare Workers AI. https://workers.cloudflare.com/product/workers-ai/&lt;/p&gt;
</content:encoded></item><item><title>为什么AI写网页代码的效果这么好</title><link>https://blog.ai-nous.com/posts/%E4%B8%BA%E4%BB%80%E4%B9%88ai%E5%86%99%E7%BD%91%E9%A1%B5%E4%BB%A3%E7%A0%81%E7%9A%84%E6%95%88%E6%9E%9C%E8%BF%99%E4%B9%88%E5%A5%BD/</link><guid isPermaLink="true">https://blog.ai-nous.com/posts/%E4%B8%BA%E4%BB%80%E4%B9%88ai%E5%86%99%E7%BD%91%E9%A1%B5%E4%BB%A3%E7%A0%81%E7%9A%84%E6%95%88%E6%9E%9C%E8%BF%99%E4%B9%88%E5%A5%BD/</guid><description>前端的开放与标准化，让代码生成更像“检索 + 组合 + 校验”。</description><pubDate>Thu, 15 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;很多人把“AI 写网页代码很顺手”归因于模型更聪明了。但从一线工程视角看，更关键的原因是：前端天然具备高开放性、强规范化、强复用三件事，它们共同把问题空间压缩成了“可预测的组合题”。在这种题型里，大模型的优势会被放大。&lt;/p&gt;
&lt;p&gt;这篇文章把现象拆开讲清楚：为什么前端更像大模型的“主场”，以及这种优势来自哪里、边界又在哪里。&lt;/p&gt;
&lt;h2&gt;1. 前端的开放性，把训练数据推到极大&lt;/h2&gt;
&lt;p&gt;前端是最公开的工程领域之一：页面代码天然要交付到浏览器；生态以 npm 为中心扩散；大量实践以博客、Issue、文档、开源仓库的形式沉淀。结果是，前端的高频知识几乎都能在公开语料里被反复看到。&lt;/p&gt;
&lt;p&gt;更重要的不是“量大”，而是分布稳定：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTML/CSS/JS 是 Web 的共同语言，语法和运行语义相对稳定，十年前的很多知识今天仍然有效。&lt;/li&gt;
&lt;li&gt;组件、路由、状态、请求、表单、列表、布局这些“业务高频件”，在行业里高度同构，差异主要来自命名与样式。&lt;/li&gt;
&lt;li&gt;工程化把离散经验收敛成少量工具链约定：构建（Vite/webpack）、类型（TypeScript）、质量（lint/format）、样式方案（Tailwind/CSS Modules/CSS-in-JS）等，最终都表现为可被模板化的结构。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当一个领域同时满足“公开、稳定、同构”时，模型得到的不只是训练样本多，而是可重复的模式多。代码生成看起来像“凭空写”，实际更接近“在巨大的模式库里做匹配，然后把匹配结果按约束拼起来”。&lt;/p&gt;
&lt;h2&gt;2. 前端代码的本质：受约束的声明式结构&lt;/h2&gt;
&lt;p&gt;网页代码的产物，是“可运行的界面”。界面由两部分构成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;结构与语义（HTML/组件树）&lt;/li&gt;
&lt;li&gt;样式与布局（CSS/设计系统）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;div style=&quot;background:var(--card-bg);border:1px solid var(--line-divider);border-radius:1rem;padding:0.75rem 0.75rem 0.5rem;margin:1rem 0;&quot;&amp;gt;
&amp;lt;svg viewBox=&quot;0 0 940 260&quot; width=&quot;100%&quot; height=&quot;260&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;前端声明式结构：需求与约束如何映射为组件树与样式规则并渲染为界面&quot; style=&quot;display:block;margin:0 auto;&quot;&amp;gt;
&amp;lt;defs&amp;gt;
&amp;lt;linearGradient id=&quot;boxFill&quot; x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;1&quot; y2=&quot;1&quot;&amp;gt;
&amp;lt;stop offset=&quot;0&quot; stop-color=&quot;var(--card-bg)&quot;/&amp;gt;
&amp;lt;stop offset=&quot;1&quot; stop-color=&quot;var(--btn-regular-bg)&quot;/&amp;gt;
&amp;lt;/linearGradient&amp;gt;
&amp;lt;marker id=&quot;arrow&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;9&quot; refY=&quot;5&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto-start-reverse&quot;&amp;gt;
&amp;lt;path d=&quot;M 0 0 L 10 5 L 0 10 z&quot; fill=&quot;var(--primary)&quot;/&amp;gt;
&amp;lt;/marker&amp;gt;
&amp;lt;filter id=&quot;softShadow&quot; x=&quot;-20%&quot; y=&quot;-20%&quot; width=&quot;140%&quot; height=&quot;140%&quot;&amp;gt;
&amp;lt;feDropShadow dx=&quot;0&quot; dy=&quot;1.2&quot; stdDeviation=&quot;1.2&quot; flood-color=&quot;rgba(0,0,0,0.18)&quot;/&amp;gt;
&amp;lt;/filter&amp;gt;
&amp;lt;style&amp;gt;
.t { font-family: system-ui,-apple-system,Segoe UI,Roboto,Arial; fill: var(--tw-prose-body); }
.h { font-family: system-ui,-apple-system,Segoe UI,Roboto,Arial; fill: var(--tw-prose-headings); font-weight: 700; }
.box { fill: url(#boxFill); stroke: var(--line-divider); stroke-width: 1; rx: 14; filter: url(#softShadow); }
.tag { fill: var(--primary); opacity: .12; }
.arrow { stroke: var(--primary); stroke-width: 2.2; fill: none; marker-end: url(#arrow); opacity: .9; }
.hint { fill: var(--tw-prose-body); opacity: .7; font-size: 12px; }
&amp;lt;/style&amp;gt;
&amp;lt;/defs&amp;gt;
&amp;lt;text x=&quot;18&quot; y=&quot;26&quot; class=&quot;h&quot; font-size=&quot;16&quot;&amp;gt;声明式的“组合题”：输入约束 → 产出结构与样式 → 浏览器渲染&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;18&quot; y=&quot;46&quot; width=&quot;250&quot; height=&quot;74&quot; class=&quot;box&quot;/&amp;gt;
&amp;lt;rect x=&quot;32&quot; y=&quot;58&quot; width=&quot;64&quot; height=&quot;18&quot; class=&quot;tag&quot; rx=&quot;9&quot;/&amp;gt;
&amp;lt;text x=&quot;44&quot; y=&quot;71&quot; class=&quot;t&quot; font-size=&quot;12&quot;&amp;gt;输入&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;32&quot; y=&quot;96&quot; class=&quot;h&quot; font-size=&quot;14&quot;&amp;gt;需求 / 交互目标&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;32&quot; y=&quot;114&quot; class=&quot;hint&quot;&amp;gt;页面要展示什么、怎么用&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;18&quot; y=&quot;138&quot; width=&quot;250&quot; height=&quot;92&quot; class=&quot;box&quot;/&amp;gt;
&amp;lt;rect x=&quot;32&quot; y=&quot;150&quot; width=&quot;64&quot; height=&quot;18&quot; class=&quot;tag&quot; rx=&quot;9&quot;/&amp;gt;
&amp;lt;text x=&quot;44&quot; y=&quot;163&quot; class=&quot;t&quot; font-size=&quot;12&quot;&amp;gt;约束&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;32&quot; y=&quot;188&quot; class=&quot;h&quot; font-size=&quot;14&quot;&amp;gt;组件库 / 设计系统 / 类型&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;32&quot; y=&quot;206&quot; class=&quot;hint&quot;&amp;gt;可用原语与风格边界&amp;lt;/text&amp;gt;
&amp;lt;path d=&quot;M 276 83 C 320 83, 330 83, 362 83&quot; class=&quot;arrow&quot;/&amp;gt;
&amp;lt;path d=&quot;M 276 184 C 320 184, 330 184, 362 184&quot; class=&quot;arrow&quot;/&amp;gt;
&amp;lt;rect x=&quot;370&quot; y=&quot;56&quot; width=&quot;250&quot; height=&quot;74&quot; class=&quot;box&quot;/&amp;gt;
&amp;lt;rect x=&quot;384&quot; y=&quot;68&quot; width=&quot;96&quot; height=&quot;18&quot; class=&quot;tag&quot; rx=&quot;9&quot;/&amp;gt;
&amp;lt;text x=&quot;396&quot; y=&quot;81&quot; class=&quot;t&quot; font-size=&quot;12&quot;&amp;gt;结构&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;384&quot; y=&quot;106&quot; class=&quot;h&quot; font-size=&quot;14&quot;&amp;gt;组件树（HTML/JSX）&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;384&quot; y=&quot;124&quot; class=&quot;hint&quot;&amp;gt;语义、层级、复用边界&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;370&quot; y=&quot;152&quot; width=&quot;250&quot; height=&quot;74&quot; class=&quot;box&quot;/&amp;gt;
&amp;lt;rect x=&quot;384&quot; y=&quot;164&quot; width=&quot;96&quot; height=&quot;18&quot; class=&quot;tag&quot; rx=&quot;9&quot;/&amp;gt;
&amp;lt;text x=&quot;396&quot; y=&quot;177&quot; class=&quot;t&quot; font-size=&quot;12&quot;&amp;gt;样式&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;384&quot; y=&quot;202&quot; class=&quot;h&quot; font-size=&quot;14&quot;&amp;gt;规则（CSS / tokens）&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;384&quot; y=&quot;220&quot; class=&quot;hint&quot;&amp;gt;布局、间距、主题与状态&amp;lt;/text&amp;gt;
&amp;lt;path d=&quot;M 628 93 C 672 93, 682 93, 712 93&quot; class=&quot;arrow&quot;/&amp;gt;
&amp;lt;path d=&quot;M 628 189 C 672 189, 682 189, 712 189&quot; class=&quot;arrow&quot;/&amp;gt;
&amp;lt;rect x=&quot;720&quot; y=&quot;56&quot; width=&quot;202&quot; height=&quot;170&quot; class=&quot;box&quot;/&amp;gt;
&amp;lt;rect x=&quot;734&quot; y=&quot;68&quot; width=&quot;96&quot; height=&quot;18&quot; class=&quot;tag&quot; rx=&quot;9&quot;/&amp;gt;
&amp;lt;text x=&quot;746&quot; y=&quot;81&quot; class=&quot;t&quot; font-size=&quot;12&quot;&amp;gt;输出&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;734&quot; y=&quot;108&quot; class=&quot;h&quot; font-size=&quot;14&quot;&amp;gt;浏览器渲染&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;734&quot; y=&quot;130&quot; class=&quot;hint&quot;&amp;gt;DOM + CSSOM → layout/paint&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;734&quot; y=&quot;158&quot; class=&quot;h&quot; font-size=&quot;14&quot;&amp;gt;可交互界面&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;734&quot; y=&quot;180&quot; class=&quot;hint&quot;&amp;gt;事件、状态更新、重绘&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;18&quot; y=&quot;252&quot; class=&quot;hint&quot;&amp;gt;越强的约束（设计系统/组件库/工程规范），越像“拼装”，越适合规模化生成。
&amp;lt;/text&amp;gt;
&amp;lt;/svg&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;这两部分都强依赖声明式，而声明式的一个特征是：局部变动往往只影响局部输出。例如，增加一个表格列、把表单校验规则改严、把卡片从两列变三列，这些都属于结构化变更，能在组件边界内被限定。&lt;/p&gt;
&lt;p&gt;这会直接降低生成难度：模型不需要“发明新算法”，更多时候只要把常见 UI 模式落到当前工程的约束里（组件库、样式规范、数据结构、类型约束）。换句话说，前端更像一个大型的“组合系统”，而不是一个需要大量原创推理的“求解系统”。&lt;/p&gt;
&lt;h2&gt;3. 单一默认值让输出更可预测&lt;/h2&gt;
&lt;p&gt;前端并不缺框架；但工程实践的默认选项长期高度集中。一个明显的结果是：当你说“写一个后台管理系统/电商详情页/内容站点”，多数团队脑海里会浮现出近似的技术栈组合与目录结构。&lt;/p&gt;
&lt;p&gt;这种集中带来的收益是“可预测”，代价是“创新被压住”。但就代码生成而言，可预测恰恰是优势：模型在生成时，最怕的是缺乏共识的分歧点；最擅长的是有共同模板的主流写法。&lt;/p&gt;
&lt;p&gt;React 的长期主导地位，把大量工程实践收敛成了统一叙事：组件化、JSX、Hooks、状态与副作用的组织方式、围绕 React 的路由与数据层（再加上 Next.js 这类元框架）……这让模型面对“前端需求描述”时，能更快落到一种稳定的实现形态上。&lt;/p&gt;
&lt;p&gt;但这也解释了一个常见体验：同一个需求下，模型在 React 生态里输出“像样代码”的概率，往往高于在一些更分散、约束更弱的技术组合里输出的概率。并不是因为 React 更“正确”，而是因为它更“标准”。&lt;/p&gt;
&lt;p&gt;想把这种“标准化带来的副作用”讲透，可以读这篇文章：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/posts/react%E7%9A%84%E9%BB%98%E8%AE%A4%E8%83%9C%E5%88%A9%E6%AD%A3%E5%9C%A8%E6%89%BC%E6%9D%80%E5%89%8D%E7%AB%AF%E5%88%9B%E6%96%B0/&quot;&gt;React 的默认胜利正在扼杀前端创新（译）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它的核心观点可以浓缩成三句（与本文的主题互相补全）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;React 的优势正在从“技术优势”转向“默认优势”，网络效应替代了适配度，决定架构走向。&lt;/li&gt;
&lt;li&gt;生态默认值越强，新模型（编译期、细粒度响应式、可恢复性）越难得到公平评估，创新变成“有但用不上”。&lt;/li&gt;
&lt;li&gt;当行业把心智模型中心搬到单一框架之上，成本不仅是性能，还有学习与迁移能力的机会成本。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;4. 大模型天然站在 UI 层的上方&lt;/h2&gt;
&lt;p&gt;前端的难点并不只在代码，更在“把需求变成界面”。而 UI 层有一个工程事实：它离业务更近、离算法更远，离“表达”更近、离“求解”更远。&lt;/p&gt;
&lt;p&gt;这对应了大模型的强项：把模糊输入映射到结构化输出，&lt;a href=&quot;/posts/%E4%B8%96%E7%95%8C%E6%A8%A1%E5%9E%8B%E7%9A%84%E5%88%B0%E6%9D%A5/&quot;&gt;世界模型的到来&lt;/a&gt; 使所有抽象层将在更高的维度被模型所理解。&lt;/p&gt;
&lt;p&gt;在现代团队里，UI 并不只是像素拼图，而是一个层次化系统：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;设计语言（排版、色彩、间距、动效）&lt;/li&gt;
&lt;li&gt;组件库（Button/Input/Table/Modal）&lt;/li&gt;
&lt;li&gt;交互范式（表单流、列表流、详情流、搜索筛选）&lt;/li&gt;
&lt;li&gt;信息架构（导航、层级、状态）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些东西一旦被抽象为组件与设计 token，代码生成就变成了：把信息架构映射为组件树，把状态与数据流映射为事件与请求，把视觉规则映射为样式约束。它不依赖“灵感”，更依赖“约束下的映射”，因此更容易规模化。&lt;/p&gt;
&lt;h2&gt;5. 视觉能力的进步，正在外溢到 UI 之外&lt;/h2&gt;
&lt;p&gt;近两年的变化不只是“能写更多代码”，而是模型逐步具备了对界面与布局的理解能力：识别层级、对齐关系、间距语义、组件复用、交互状态。这类能力来自&lt;a href=&quot;/posts/%E4%B8%96%E7%95%8C%E6%A8%A1%E5%9E%8B%E7%9A%84%E5%88%B0%E6%9D%A5/&quot;&gt;多模态训练&lt;/a&gt;：把文本、图像、结构化 UI 元数据放在同一个表征空间里学习。&lt;/p&gt;
&lt;p&gt;一旦模型能稳定理解 UI，它就获得了一种更通用的能力：把连续世界（图像/空间）压缩成离散结构（层级/约束/关系）。这类表征不仅对“从设计到代码”有用，也会迁移到更广泛的物理世界任务中：场景理解、机器人操作、空间推理、视觉-语言对齐等。&lt;/p&gt;
&lt;p&gt;从这个角度看，前端并不是一个孤立的应用场景，而像一个训练场：UI 把现实世界的空间关系（对齐、约束、层级、组合）用更可控的方式呈现出来，既足够复杂，又比真实世界更可标注、更可评估、更易规模化。这会让模型在 UI 上的进步更快，也更容易外溢到 UI 之外。&lt;/p&gt;
&lt;h2&gt;6. 边界：能写出“像样代码”不等于能交付&lt;/h2&gt;
&lt;p&gt;把原因讲清楚，也必须把边界讲清楚。前端代码生成效果好，并不意味着它天然可靠：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;代码是否“像样”，与是否符合工程约束（类型、可访问性、性能预算、安全策略）是两回事。&lt;/li&gt;
&lt;li&gt;模型能拼出组件树，但很容易在状态边界与数据一致性上犯错，尤其是复杂交互、多端适配、并发与缓存场景。&lt;/li&gt;
&lt;li&gt;视觉对齐可以做到很像，但设计系统、可维护性与可扩展性需要经验驱动的取舍，不能只追求像素级还原。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;更合理的定位是：把模型当作“高吞吐的初稿生成器 + 有经验开发者的约束校验器”。前端之所以显得更“好用”，是因为它确实更适合这种分工。&lt;/p&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;AI 写网页代码之所以效果好，并不是因为网页开发更简单，而是因为它更结构化：开放的生态让训练数据极其充足；主流栈的默认选择让实现路径高度收敛；UI 层的抽象把需求到代码的映射变成可组合的工程问题；多模态能力又进一步增强了对布局与层级的理解。&lt;/p&gt;
&lt;p&gt;当这些条件叠加在一起，代码生成就不再像魔法，而更像一套高效的模式检索与组合机制在发挥作用。下一步真正的竞争点，不是“能不能写出来”，而是“能不能在约束下持续写对”。&lt;/p&gt;
</content:encoded></item><item><title>2025年前端框架总结</title><link>https://blog.ai-nous.com/posts/2025%E5%B9%B4%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6%E6%80%BB%E7%BB%93/</link><guid isPermaLink="true">https://blog.ai-nous.com/posts/2025%E5%B9%B4%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6%E6%80%BB%E7%BB%93/</guid><description>基于 2025 JavaScript Rising Stars 数据，盘点前端框架与生态走势</description><pubDate>Sun, 11 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;下面的结论与图表基于「2025 JavaScript Rising Stars」：统计 Best of JS 收录项目在 2025 年新增的 GitHub star（近 12 个月增量），用来观察“关注度变化”而非“绝对使用量”。我在此基础上做了归纳与选型建议。&lt;/p&gt;
&lt;h2&gt;1. 2025 的整体信号&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;AI 不再只是“聊天”，而是以“工作流/代理编排”的形态爆发，n8n 以断层优势成为年度冠军。&lt;/li&gt;
&lt;li&gt;React 重新夺回“前端框架”榜首，但真正的焦点是向 Server Components/Server Functions 的迁移带来的复杂度与安全风险。&lt;/li&gt;
&lt;li&gt;前端工具链继续走向“更快、更统一”：运行时、打包、格式化/Lint 的一体化趋势更明显。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.1 年度冠军 n8n 的 2025 月度增长（新增 star）&lt;/h3&gt;
&lt;p&gt;&amp;lt;div style=&quot;background:var(--card-bg);border:1px solid var(--line-divider);border-radius:1rem;padding:0.75rem 0.75rem 0.5rem;margin:1rem 0;&quot;&amp;gt;
&amp;lt;svg viewBox=&quot;0 0 820 260&quot; width=&quot;100%&quot; height=&quot;260&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;n8n 2025 月度新增 star 折线图&quot; style=&quot;display:block;margin:0 auto;&quot;&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;28&quot; font-size=&quot;16&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-headings)&quot; font-weight=&quot;700&quot;&amp;gt;n8n：2025 月度新增 star（k）&amp;lt;/text&amp;gt;
&amp;lt;line x1=&quot;60&quot; y1=&quot;210&quot; x2=&quot;790&quot; y2=&quot;210&quot; stroke=&quot;var(--line-divider)&quot; stroke-width=&quot;1&quot;/&amp;gt;
&amp;lt;line x1=&quot;60&quot; y1=&quot;60&quot; x2=&quot;60&quot; y2=&quot;210&quot; stroke=&quot;var(--line-divider)&quot; stroke-width=&quot;1&quot;/&amp;gt;
&amp;lt;text x=&quot;28&quot; y=&quot;210&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.7&quot;&amp;gt;0&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;22&quot; y=&quot;160&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.7&quot;&amp;gt;5&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;18&quot; y=&quot;110&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.7&quot;&amp;gt;10&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;18&quot; y=&quot;60&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.7&quot;&amp;gt;15&amp;lt;/text&amp;gt;
&amp;lt;polyline fill=&quot;none&quot; stroke=&quot;var(--primary)&quot; stroke-width=&quot;2.5&quot; points=&quot;80,168 140,150 200,113 260,66 320,68 380,92 440,90 500,126 560,116 620,113 680,145 740,149&quot;/&amp;gt;
&amp;lt;g fill=&quot;var(--primary)&quot;&amp;gt;
&amp;lt;circle cx=&quot;80&quot; cy=&quot;168&quot; r=&quot;3.5&quot;/&amp;gt;&amp;lt;circle cx=&quot;140&quot; cy=&quot;150&quot; r=&quot;3.5&quot;/&amp;gt;&amp;lt;circle cx=&quot;200&quot; cy=&quot;113&quot; r=&quot;3.5&quot;/&amp;gt;&amp;lt;circle cx=&quot;260&quot; cy=&quot;66&quot; r=&quot;5&quot;/&amp;gt;
&amp;lt;circle cx=&quot;320&quot; cy=&quot;68&quot; r=&quot;3.5&quot;/&amp;gt;&amp;lt;circle cx=&quot;380&quot; cy=&quot;92&quot; r=&quot;3.5&quot;/&amp;gt;&amp;lt;circle cx=&quot;440&quot; cy=&quot;90&quot; r=&quot;3.5&quot;/&amp;gt;&amp;lt;circle cx=&quot;500&quot; cy=&quot;126&quot; r=&quot;3.5&quot;/&amp;gt;
&amp;lt;circle cx=&quot;560&quot; cy=&quot;116&quot; r=&quot;3.5&quot;/&amp;gt;&amp;lt;circle cx=&quot;620&quot; cy=&quot;113&quot; r=&quot;3.5&quot;/&amp;gt;&amp;lt;circle cx=&quot;680&quot; cy=&quot;145&quot; r=&quot;3.5&quot;/&amp;gt;&amp;lt;circle cx=&quot;740&quot; cy=&quot;149&quot; r=&quot;3.5&quot;/&amp;gt;
&amp;lt;/g&amp;gt;
&amp;lt;text x=&quot;270&quot; y=&quot;54&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.85&quot;&amp;gt;峰值：14.4k（4 月）&amp;lt;/text&amp;gt;
&amp;lt;g font-size=&quot;11&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.7&quot;&amp;gt;
&amp;lt;text x=&quot;70&quot; y=&quot;230&quot;&amp;gt;1&amp;lt;/text&amp;gt;&amp;lt;text x=&quot;130&quot; y=&quot;230&quot;&amp;gt;2&amp;lt;/text&amp;gt;&amp;lt;text x=&quot;190&quot; y=&quot;230&quot;&amp;gt;3&amp;lt;/text&amp;gt;&amp;lt;text x=&quot;250&quot; y=&quot;230&quot;&amp;gt;4&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;310&quot; y=&quot;230&quot;&amp;gt;5&amp;lt;/text&amp;gt;&amp;lt;text x=&quot;370&quot; y=&quot;230&quot;&amp;gt;6&amp;lt;/text&amp;gt;&amp;lt;text x=&quot;430&quot; y=&quot;230&quot;&amp;gt;7&amp;lt;/text&amp;gt;&amp;lt;text x=&quot;490&quot; y=&quot;230&quot;&amp;gt;8&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;550&quot; y=&quot;230&quot;&amp;gt;9&amp;lt;/text&amp;gt;&amp;lt;text x=&quot;605&quot; y=&quot;230&quot;&amp;gt;10&amp;lt;/text&amp;gt;&amp;lt;text x=&quot;665&quot; y=&quot;230&quot;&amp;gt;11&amp;lt;/text&amp;gt;&amp;lt;text x=&quot;725&quot; y=&quot;230&quot;&amp;gt;12&amp;lt;/text&amp;gt;
&amp;lt;/g&amp;gt;
&amp;lt;/svg&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;2. 最受欢迎的项目（Top 10）&lt;/h2&gt;
&lt;p&gt;&amp;lt;div style=&quot;background:var(--card-bg);border:1px solid var(--line-divider);border-radius:1rem;padding:0.75rem 0.75rem 0.5rem;margin:1rem 0;&quot;&amp;gt;
&amp;lt;svg viewBox=&quot;0 0 860 360&quot; width=&quot;100%&quot; height=&quot;360&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;2025 最受欢迎项目 Top10 新增 star 柱状图&quot; style=&quot;display:block;margin:0 auto;&quot;&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;28&quot; font-size=&quot;16&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-headings)&quot; font-weight=&quot;700&quot;&amp;gt;最受欢迎项目 Top 10：2025 新增 star&amp;lt;/text&amp;gt;
&amp;lt;g font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; font-size=&quot;12&quot; fill=&quot;var(--tw-prose-body)&quot;&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;66&quot; opacity=&quot;0.85&quot;&amp;gt;1 n8n&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;96&quot; opacity=&quot;0.85&quot;&amp;gt;2 React Bits&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;126&quot; opacity=&quot;0.85&quot;&amp;gt;3 shadcn/ui&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;156&quot; opacity=&quot;0.85&quot;&amp;gt;4 Excalidraw&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;186&quot; opacity=&quot;0.85&quot;&amp;gt;5 Supabase&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;216&quot; opacity=&quot;0.85&quot;&amp;gt;6 Onlook&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;246&quot; opacity=&quot;0.85&quot;&amp;gt;7 Better Auth&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;276&quot; opacity=&quot;0.85&quot;&amp;gt;8 Dyad&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;306&quot; opacity=&quot;0.85&quot;&amp;gt;9 AFFiNE&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;336&quot; opacity=&quot;0.85&quot;&amp;gt;10 Stagehand&amp;lt;/text&amp;gt;
&amp;lt;/g&amp;gt;
&amp;lt;g&amp;gt;
&amp;lt;rect x=&quot;160&quot; y=&quot;54&quot; width=&quot;560&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;1&quot;/&amp;gt;&amp;lt;text x=&quot;736&quot; y=&quot;66&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+112.4k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;160&quot; y=&quot;84&quot; width=&quot;163&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.75&quot;/&amp;gt;&amp;lt;text x=&quot;736&quot; y=&quot;96&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+32.8k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;160&quot; y=&quot;114&quot; width=&quot;131&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.75&quot;/&amp;gt;&amp;lt;text x=&quot;736&quot; y=&quot;126&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+26.3k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;160&quot; y=&quot;144&quot; width=&quot;125&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.6&quot;/&amp;gt;&amp;lt;text x=&quot;736&quot; y=&quot;156&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+25.1k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;160&quot; y=&quot;174&quot; width=&quot;99&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.6&quot;/&amp;gt;&amp;lt;text x=&quot;736&quot; y=&quot;186&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+19.9k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;160&quot; y=&quot;204&quot; width=&quot;97&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.6&quot;/&amp;gt;&amp;lt;text x=&quot;736&quot; y=&quot;216&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+19.4k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;160&quot; y=&quot;234&quot; width=&quot;95&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.45&quot;/&amp;gt;&amp;lt;text x=&quot;736&quot; y=&quot;246&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+19.0k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;160&quot; y=&quot;264&quot; width=&quot;94&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.45&quot;/&amp;gt;&amp;lt;text x=&quot;736&quot; y=&quot;276&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+18.9k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;160&quot; y=&quot;294&quot; width=&quot;86&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.35&quot;/&amp;gt;&amp;lt;text x=&quot;736&quot; y=&quot;306&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+17.3k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;160&quot; y=&quot;324&quot; width=&quot;85&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.35&quot;/&amp;gt;&amp;lt;text x=&quot;736&quot; y=&quot;336&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+17.1k&amp;lt;/text&amp;gt;
&amp;lt;/g&amp;gt;
&amp;lt;/svg&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;排名&lt;/th&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;2025 新增 star&lt;/th&gt;
&lt;th&gt;定位&lt;/th&gt;
&lt;th&gt;关键词&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;n8n&lt;/td&gt;
&lt;td&gt;+112.4k&lt;/td&gt;
&lt;td&gt;工作流自动化平台&lt;/td&gt;
&lt;td&gt;工作流、原生 AI、400+ 集成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;React Bits&lt;/td&gt;
&lt;td&gt;+32.8k&lt;/td&gt;
&lt;td&gt;动效/交互组件集合&lt;/td&gt;
&lt;td&gt;组件分发、shadcn 风格、可视化调参&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;shadcn/ui&lt;/td&gt;
&lt;td&gt;+26.3k&lt;/td&gt;
&lt;td&gt;组件库 + 注册表&lt;/td&gt;
&lt;td&gt;无障碍、可定制、分发模式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Excalidraw&lt;/td&gt;
&lt;td&gt;+25.1k&lt;/td&gt;
&lt;td&gt;手绘风白板&lt;/td&gt;
&lt;td&gt;协作、图形化表达&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Supabase&lt;/td&gt;
&lt;td&gt;+19.9k&lt;/td&gt;
&lt;td&gt;开源 BaaS&lt;/td&gt;
&lt;td&gt;Postgres、边缘能力、全栈后端&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Onlook&lt;/td&gt;
&lt;td&gt;+19.4k&lt;/td&gt;
&lt;td&gt;AI 优先可视化编辑器&lt;/td&gt;
&lt;td&gt;设计到代码、React 应用、编辑器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Better Auth&lt;/td&gt;
&lt;td&gt;+19.0k&lt;/td&gt;
&lt;td&gt;TypeScript 鉴权框架&lt;/td&gt;
&lt;td&gt;插件系统、框架无关、多租户&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Dyad&lt;/td&gt;
&lt;td&gt;+18.9k&lt;/td&gt;
&lt;td&gt;本地开源 AI 应用构建器&lt;/td&gt;
&lt;td&gt;v0/lovable 替代、快速原型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;AFFiNE&lt;/td&gt;
&lt;td&gt;+17.3k&lt;/td&gt;
&lt;td&gt;开源知识库/协作&lt;/td&gt;
&lt;td&gt;Notion/Miro 替代、隐私优先&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Stagehand&lt;/td&gt;
&lt;td&gt;+17.1k&lt;/td&gt;
&lt;td&gt;AI 浏览器自动化&lt;/td&gt;
&lt;td&gt;测试、运营自动化、代理编排&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;分析要点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;n8n 的增长几乎“改写刻度”，2025 年从工具到生态位的关注都集中到了“工作流 + AI”。&lt;/li&gt;
&lt;li&gt;Top 10 里与“React 组件分发/体验”相关的项目占比非常高（React Bits、shadcn/ui、Onlook 等），说明“做 UI 这件事”正在向“可复制粘贴的工程化积木”收敛。&lt;/li&gt;
&lt;li&gt;Better Auth 这类“框架无关 + 插件化”的基础能力项目上榜，说明全栈化后对安全与工程抽象的需求在上升。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3. 前端框架（Top 5）&lt;/h2&gt;
&lt;p&gt;&amp;lt;div style=&quot;background:var(--card-bg);border:1px solid var(--line-divider);border-radius:1rem;padding:0.75rem 0.75rem 0.5rem;margin:1rem 0;&quot;&amp;gt;
&amp;lt;svg viewBox=&quot;0 0 860 230&quot; width=&quot;100%&quot; height=&quot;230&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;2025 前端框架 Top5 新增 star 柱状图&quot; style=&quot;display:block;margin:0 auto;&quot;&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;28&quot; font-size=&quot;16&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-headings)&quot; font-weight=&quot;700&quot;&amp;gt;前端框架 Top 5：2025 新增 star&amp;lt;/text&amp;gt;
&amp;lt;g font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; font-size=&quot;12&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.85&quot;&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;70&quot;&amp;gt;React&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;102&quot;&amp;gt;Ripple&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;134&quot;&amp;gt;Svelte&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;166&quot;&amp;gt;htmx&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;198&quot;&amp;gt;Vue.js&amp;lt;/text&amp;gt;
&amp;lt;/g&amp;gt;
&amp;lt;g&amp;gt;
&amp;lt;rect x=&quot;140&quot; y=&quot;58&quot; width=&quot;520&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;1&quot;/&amp;gt;&amp;lt;text x=&quot;680&quot; y=&quot;70&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+11.0k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;140&quot; y=&quot;90&quot; width=&quot;307&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.75&quot;/&amp;gt;&amp;lt;text x=&quot;680&quot; y=&quot;102&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+6.5k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;140&quot; y=&quot;122&quot; width=&quot;217&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.6&quot;/&amp;gt;&amp;lt;text x=&quot;680&quot; y=&quot;134&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+4.6k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;140&quot; y=&quot;154&quot; width=&quot;212&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.6&quot;/&amp;gt;&amp;lt;text x=&quot;680&quot; y=&quot;166&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+4.5k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;140&quot; y=&quot;186&quot; width=&quot;203&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.6&quot;/&amp;gt;&amp;lt;text x=&quot;680&quot; y=&quot;198&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+4.3k&amp;lt;/text&amp;gt;
&amp;lt;/g&amp;gt;
&amp;lt;/svg&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;排名&lt;/th&gt;
&lt;th&gt;框架&lt;/th&gt;
&lt;th&gt;2025 新增 star&lt;/th&gt;
&lt;th&gt;定位&lt;/th&gt;
&lt;th&gt;关键词&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;React&lt;/td&gt;
&lt;td&gt;+11.0k&lt;/td&gt;
&lt;td&gt;UI 库/生态核心&lt;/td&gt;
&lt;td&gt;全栈化、RSC/Server Actions、流式渲染&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Ripple&lt;/td&gt;
&lt;td&gt;+6.5k&lt;/td&gt;
&lt;td&gt;新一代 UI 框架实验&lt;/td&gt;
&lt;td&gt;响应式原语、组件化、早期阶段&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Svelte&lt;/td&gt;
&lt;td&gt;+4.6k&lt;/td&gt;
&lt;td&gt;编译型框架&lt;/td&gt;
&lt;td&gt;Svelte 5、Runes、简化状态建模&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;htmx&lt;/td&gt;
&lt;td&gt;+4.5k&lt;/td&gt;
&lt;td&gt;HTML 驱动交互&lt;/td&gt;
&lt;td&gt;Server-first、低 JS、渐进增强&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Vue.js&lt;/td&gt;
&lt;td&gt;+4.3k&lt;/td&gt;
&lt;td&gt;渐进式框架&lt;/td&gt;
&lt;td&gt;生态稳定、工程化成熟&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;分析要点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;React 的“回归第一”更像是生态在押注“全栈化”：Server Components、Server Actions、流式渲染把边界推向服务端，但也放大了复杂度与安全面。&lt;/li&gt;
&lt;li&gt;Ripple 是 Top 5 的新面孔：更像“下一代 UI 框架实验场”，但它是否会出现像 Next.js/Nuxt/SvelteKit 这样的元框架，是 2026 的看点。&lt;/li&gt;
&lt;li&gt;Svelte 连续稳定在前三，Svelte 5 的 Runes（&lt;code&gt;$state/$derived/$effect&lt;/code&gt;）逐渐成为其状态建模的主流写法。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;4. React 生态（Top 5）&lt;/h2&gt;
&lt;p&gt;&amp;lt;div style=&quot;background:var(--card-bg);border:1px solid var(--line-divider);border-radius:1rem;padding:0.75rem 0.75rem 0.5rem;margin:1rem 0;&quot;&amp;gt;
&amp;lt;svg viewBox=&quot;0 0 860 230&quot; width=&quot;100%&quot; height=&quot;230&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;2025 React 生态 Top5 新增 star 柱状图&quot; style=&quot;display:block;margin:0 auto;&quot;&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;28&quot; font-size=&quot;16&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-headings)&quot; font-weight=&quot;700&quot;&amp;gt;React 生态 Top 5：2025 新增 star&amp;lt;/text&amp;gt;
&amp;lt;g font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; font-size=&quot;12&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.85&quot;&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;70&quot;&amp;gt;React Bits&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;102&quot;&amp;gt;shadcn/ui&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;134&quot;&amp;gt;Excalidraw&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;166&quot;&amp;gt;Onlook&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;198&quot;&amp;gt;Vercel AI SDK&amp;lt;/text&amp;gt;
&amp;lt;/g&amp;gt;
&amp;lt;g&amp;gt;
&amp;lt;rect x=&quot;170&quot; y=&quot;58&quot; width=&quot;520&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;1&quot;/&amp;gt;&amp;lt;text x=&quot;710&quot; y=&quot;70&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+32.8k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;170&quot; y=&quot;90&quot; width=&quot;417&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.75&quot;/&amp;gt;&amp;lt;text x=&quot;710&quot; y=&quot;102&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+26.3k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;170&quot; y=&quot;122&quot; width=&quot;398&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.6&quot;/&amp;gt;&amp;lt;text x=&quot;710&quot; y=&quot;134&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+25.1k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;170&quot; y=&quot;154&quot; width=&quot;308&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.6&quot;/&amp;gt;&amp;lt;text x=&quot;710&quot; y=&quot;166&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+19.4k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;170&quot; y=&quot;186&quot; width=&quot;154&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.6&quot;/&amp;gt;&amp;lt;text x=&quot;710&quot; y=&quot;198&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+9.7k&amp;lt;/text&amp;gt;
&amp;lt;/g&amp;gt;
&amp;lt;/svg&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;排名&lt;/th&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;2025 新增 star&lt;/th&gt;
&lt;th&gt;定位&lt;/th&gt;
&lt;th&gt;关键词&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;React Bits&lt;/td&gt;
&lt;td&gt;+32.8k&lt;/td&gt;
&lt;td&gt;动效/交互组件集合&lt;/td&gt;
&lt;td&gt;复制粘贴、动效、展示组件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;shadcn/ui&lt;/td&gt;
&lt;td&gt;+26.3k&lt;/td&gt;
&lt;td&gt;组件库 + 注册表&lt;/td&gt;
&lt;td&gt;可定制、无障碍、组合式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Excalidraw&lt;/td&gt;
&lt;td&gt;+25.1k&lt;/td&gt;
&lt;td&gt;手绘风白板&lt;/td&gt;
&lt;td&gt;协作、图形化表达、嵌入式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Onlook&lt;/td&gt;
&lt;td&gt;+19.4k&lt;/td&gt;
&lt;td&gt;AI 优先可视化编辑器&lt;/td&gt;
&lt;td&gt;设计到代码、React、编辑器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Vercel AI SDK&lt;/td&gt;
&lt;td&gt;+9.7k&lt;/td&gt;
&lt;td&gt;AI 应用 SDK&lt;/td&gt;
&lt;td&gt;流式、工具调用、RAG&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;分析要点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“组件注册表/可复制粘贴组件”成为 UI 生产的新范式：React Bits 本身甚至以 shadcn/ui 项目形态分发。&lt;/li&gt;
&lt;li&gt;Onlook 这类“AI 优先的可视化编辑器”开始进入主流讨论：它们并不是低代码的旧叙事，而是以 AI 为核心的“设计到代码”通道。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;5. 后端 / 全栈（Top 5）&lt;/h2&gt;
&lt;p&gt;&amp;lt;div style=&quot;background:var(--card-bg);border:1px solid var(--line-divider);border-radius:1rem;padding:0.75rem 0.75rem 0.5rem;margin:1rem 0;&quot;&amp;gt;
&amp;lt;svg viewBox=&quot;0 0 860 230&quot; width=&quot;100%&quot; height=&quot;230&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;2025 后端与全栈 Top5 新增 star 柱状图&quot; style=&quot;display:block;margin:0 auto;&quot;&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;28&quot; font-size=&quot;16&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-headings)&quot; font-weight=&quot;700&quot;&amp;gt;后端 / 全栈 Top 5：2025 新增 star&amp;lt;/text&amp;gt;
&amp;lt;g font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; font-size=&quot;12&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.85&quot;&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;70&quot;&amp;gt;Motia&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;102&quot;&amp;gt;Payload&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;134&quot;&amp;gt;Next.js&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;166&quot;&amp;gt;Astro&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;198&quot;&amp;gt;Hono&amp;lt;/text&amp;gt;
&amp;lt;/g&amp;gt;
&amp;lt;g&amp;gt;
&amp;lt;rect x=&quot;140&quot; y=&quot;58&quot; width=&quot;520&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;1&quot;/&amp;gt;&amp;lt;text x=&quot;680&quot; y=&quot;70&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+13.8k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;140&quot; y=&quot;90&quot; width=&quot;335&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.75&quot;/&amp;gt;&amp;lt;text x=&quot;680&quot; y=&quot;102&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+8.9k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;140&quot; y=&quot;122&quot; width=&quot;327&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.6&quot;/&amp;gt;&amp;lt;text x=&quot;680&quot; y=&quot;134&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+8.7k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;140&quot; y=&quot;154&quot; width=&quot;271&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.6&quot;/&amp;gt;&amp;lt;text x=&quot;680&quot; y=&quot;166&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+7.2k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;140&quot; y=&quot;186&quot; width=&quot;256&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.6&quot;/&amp;gt;&amp;lt;text x=&quot;680&quot; y=&quot;198&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+6.8k&amp;lt;/text&amp;gt;
&amp;lt;/g&amp;gt;
&amp;lt;/svg&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;排名&lt;/th&gt;
&lt;th&gt;框架&lt;/th&gt;
&lt;th&gt;2025 新增 star&lt;/th&gt;
&lt;th&gt;定位&lt;/th&gt;
&lt;th&gt;关键词&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Motia&lt;/td&gt;
&lt;td&gt;+13.8k&lt;/td&gt;
&lt;td&gt;工作流式后端框架&lt;/td&gt;
&lt;td&gt;编排、Step/Worker、可观测&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Payload&lt;/td&gt;
&lt;td&gt;+8.9k&lt;/td&gt;
&lt;td&gt;Headless CMS/全栈框架&lt;/td&gt;
&lt;td&gt;Admin、Postgres、内容建模&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Next.js&lt;/td&gt;
&lt;td&gt;+8.7k&lt;/td&gt;
&lt;td&gt;React 元框架&lt;/td&gt;
&lt;td&gt;RSC、Server Actions、全栈路由&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Astro&lt;/td&gt;
&lt;td&gt;+7.2k&lt;/td&gt;
&lt;td&gt;内容优先元框架&lt;/td&gt;
&lt;td&gt;Islands、性能、静态/SSR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Hono&lt;/td&gt;
&lt;td&gt;+6.8k&lt;/td&gt;
&lt;td&gt;轻量 Web 框架&lt;/td&gt;
&lt;td&gt;Web 标准、多运行时、边缘部署&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;分析要点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Motia 的叙事是“统一后端”：用单一抽象（Steps）覆盖 API、队列、工作流、流处理、AI agent，反映出后端工程也在向“可观测 + 状态 + 编排”收敛。&lt;/li&gt;
&lt;li&gt;Astro 与 Hono 代表了“更轻的服务端”：前者适合内容型应用与性能取向，后者用 Web Standards 在多运行时之间迁移更自然。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;6. 工具（Top 5）&lt;/h2&gt;
&lt;p&gt;&amp;lt;div style=&quot;background:var(--card-bg);border:1px solid var(--line-divider);border-radius:1rem;padding:0.75rem 0.75rem 0.5rem;margin:1rem 0;&quot;&amp;gt;
&amp;lt;svg viewBox=&quot;0 0 860 230&quot; width=&quot;100%&quot; height=&quot;230&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;2025 工具 Top5 新增 star 柱状图&quot; style=&quot;display:block;margin:0 auto;&quot;&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;28&quot; font-size=&quot;16&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-headings)&quot; font-weight=&quot;700&quot;&amp;gt;工具 Top 5：2025 新增 star&amp;lt;/text&amp;gt;
&amp;lt;g font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; font-size=&quot;12&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.85&quot;&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;70&quot;&amp;gt;Bun&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;102&quot;&amp;gt;Vite&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;134&quot;&amp;gt;Biome&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;166&quot;&amp;gt;Oxlint/Oxc Parser/Oxfmt&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;198&quot;&amp;gt;Nx&amp;lt;/text&amp;gt;
&amp;lt;/g&amp;gt;
&amp;lt;g&amp;gt;
&amp;lt;rect x=&quot;240&quot; y=&quot;58&quot; width=&quot;520&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;1&quot;/&amp;gt;&amp;lt;text x=&quot;780&quot; y=&quot;70&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+10.8k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;240&quot; y=&quot;90&quot; width=&quot;366&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.75&quot;/&amp;gt;&amp;lt;text x=&quot;780&quot; y=&quot;102&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+7.6k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;240&quot; y=&quot;122&quot; width=&quot;322&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.6&quot;/&amp;gt;&amp;lt;text x=&quot;780&quot; y=&quot;134&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+6.7k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;240&quot; y=&quot;154&quot; width=&quot;250&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.6&quot;/&amp;gt;&amp;lt;text x=&quot;780&quot; y=&quot;166&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+5.2k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;240&quot; y=&quot;186&quot; width=&quot;178&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.6&quot;/&amp;gt;&amp;lt;text x=&quot;780&quot; y=&quot;198&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+3.7k&amp;lt;/text&amp;gt;
&amp;lt;/g&amp;gt;
&amp;lt;/svg&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;排名&lt;/th&gt;
&lt;th&gt;工具&lt;/th&gt;
&lt;th&gt;2025 新增 star&lt;/th&gt;
&lt;th&gt;定位&lt;/th&gt;
&lt;th&gt;关键词&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Bun&lt;/td&gt;
&lt;td&gt;+10.8k&lt;/td&gt;
&lt;td&gt;JS 运行时/工具链&lt;/td&gt;
&lt;td&gt;运行时、打包、测试、速度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Vite&lt;/td&gt;
&lt;td&gt;+7.6k&lt;/td&gt;
&lt;td&gt;前端构建工具&lt;/td&gt;
&lt;td&gt;Dev Server、HMR、插件生态&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Biome&lt;/td&gt;
&lt;td&gt;+6.7k&lt;/td&gt;
&lt;td&gt;格式化 + Lint 工具&lt;/td&gt;
&lt;td&gt;一体化、快速、可配置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Oxlint/Oxc Parser/Oxfmt&lt;/td&gt;
&lt;td&gt;+5.2k&lt;/td&gt;
&lt;td&gt;Rust 工具链组件&lt;/td&gt;
&lt;td&gt;Lint、Parser、格式化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Nx&lt;/td&gt;
&lt;td&gt;+3.7k&lt;/td&gt;
&lt;td&gt;Monorepo 工程工具&lt;/td&gt;
&lt;td&gt;任务编排、缓存、工作区&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;分析要点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“一体化工具链”在加速：运行时（Bun）、构建（Vite）、格式化/检查（Biome、Oxc）都在追求更快的默认体验。&lt;/li&gt;
&lt;li&gt;2025 年基础设施工具的一个重要趋势是“系统语言化”：Rust/Go 生态的占比更高，性能成为可见的竞争点。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;7. AI（Top 5）&lt;/h2&gt;
&lt;p&gt;&amp;lt;div style=&quot;background:var(--card-bg);border:1px solid var(--line-divider);border-radius:1rem;padding:0.75rem 0.75rem 0.5rem;margin:1rem 0;&quot;&amp;gt;
&amp;lt;svg viewBox=&quot;0 0 860 230&quot; width=&quot;100%&quot; height=&quot;230&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;2025 AI Top5 新增 star 柱状图&quot; style=&quot;display:block;margin:0 auto;&quot;&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;28&quot; font-size=&quot;16&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-headings)&quot; font-weight=&quot;700&quot;&amp;gt;AI Top 5：2025 新增 star&amp;lt;/text&amp;gt;
&amp;lt;g font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; font-size=&quot;12&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.85&quot;&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;70&quot;&amp;gt;n8n&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;102&quot;&amp;gt;Dyad&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;134&quot;&amp;gt;Stagehand&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;166&quot;&amp;gt;Mastra&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;198&quot;&amp;gt;Flowise&amp;lt;/text&amp;gt;
&amp;lt;/g&amp;gt;
&amp;lt;g&amp;gt;
&amp;lt;rect x=&quot;140&quot; y=&quot;58&quot; width=&quot;520&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;1&quot;/&amp;gt;&amp;lt;text x=&quot;680&quot; y=&quot;70&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+112.4k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;140&quot; y=&quot;90&quot; width=&quot;87&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.75&quot;/&amp;gt;&amp;lt;text x=&quot;680&quot; y=&quot;102&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+18.9k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;140&quot; y=&quot;122&quot; width=&quot;79&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.6&quot;/&amp;gt;&amp;lt;text x=&quot;680&quot; y=&quot;134&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+17.1k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;140&quot; y=&quot;154&quot; width=&quot;69&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.6&quot;/&amp;gt;&amp;lt;text x=&quot;680&quot; y=&quot;166&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+15.0k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;140&quot; y=&quot;186&quot; width=&quot;67&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.6&quot;/&amp;gt;&amp;lt;text x=&quot;680&quot; y=&quot;198&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+14.6k&amp;lt;/text&amp;gt;
&amp;lt;/g&amp;gt;
&amp;lt;/svg&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;排名&lt;/th&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;2025 新增 star&lt;/th&gt;
&lt;th&gt;定位&lt;/th&gt;
&lt;th&gt;关键词&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;n8n&lt;/td&gt;
&lt;td&gt;+112.4k&lt;/td&gt;
&lt;td&gt;工作流自动化平台&lt;/td&gt;
&lt;td&gt;工作流、代理编排、集成生态&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Dyad&lt;/td&gt;
&lt;td&gt;+18.9k&lt;/td&gt;
&lt;td&gt;本地开源 AI 应用构建器&lt;/td&gt;
&lt;td&gt;v0 替代、快速原型、本地优先&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Stagehand&lt;/td&gt;
&lt;td&gt;+17.1k&lt;/td&gt;
&lt;td&gt;AI 浏览器自动化&lt;/td&gt;
&lt;td&gt;代理、测试、运营自动化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Mastra&lt;/td&gt;
&lt;td&gt;+15.0k&lt;/td&gt;
&lt;td&gt;AI Agent 框架&lt;/td&gt;
&lt;td&gt;工具调用、流程编排、可观测&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Flowise&lt;/td&gt;
&lt;td&gt;+14.6k&lt;/td&gt;
&lt;td&gt;可视化 LLM 工作流&lt;/td&gt;
&lt;td&gt;LangChain 风格、拖拽、RAG&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;分析要点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2025 年的主旋律是“工作流引擎”而不是“聊天 UI”：把模型接入业务流程、让系统在触发后推理并采取动作，成为最明确的增长方向。&lt;/li&gt;
&lt;li&gt;前端开发者会更频繁地遇到“浏览器自动化 + 代理编排”的需求（如 Stagehand），这会反向影响测试、运营、增长与研发流程。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;8. 移动端（Top 10）&lt;/h2&gt;
&lt;p&gt;&amp;lt;div style=&quot;background:var(--card-bg);border:1px solid var(--line-divider);border-radius:1rem;padding:0.75rem 0.75rem 0.5rem;margin:1rem 0;&quot;&amp;gt;
&amp;lt;svg viewBox=&quot;0 0 860 230&quot; width=&quot;100%&quot; height=&quot;230&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;2025 移动端 Top5 新增 star 柱状图&quot; style=&quot;display:block;margin:0 auto;&quot;&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;28&quot; font-size=&quot;16&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-headings)&quot; font-weight=&quot;700&quot;&amp;gt;移动端 Top 5：2025 新增 star&amp;lt;/text&amp;gt;
&amp;lt;g font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; font-size=&quot;12&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.85&quot;&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;70&quot;&amp;gt;Valdi&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;102&quot;&amp;gt;Lynx&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;134&quot;&amp;gt;Expo&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;166&quot;&amp;gt;Dioxus&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;20&quot; y=&quot;198&quot;&amp;gt;React Native&amp;lt;/text&amp;gt;
&amp;lt;/g&amp;gt;
&amp;lt;g&amp;gt;
&amp;lt;rect x=&quot;140&quot; y=&quot;58&quot; width=&quot;520&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;1&quot;/&amp;gt;&amp;lt;text x=&quot;680&quot; y=&quot;70&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+15.9k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;140&quot; y=&quot;90&quot; width=&quot;458&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.75&quot;/&amp;gt;&amp;lt;text x=&quot;680&quot; y=&quot;102&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+14.0k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;140&quot; y=&quot;122&quot; width=&quot;334&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.6&quot;/&amp;gt;&amp;lt;text x=&quot;680&quot; y=&quot;134&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+10.2k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;140&quot; y=&quot;154&quot; width=&quot;186&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.6&quot;/&amp;gt;&amp;lt;text x=&quot;680&quot; y=&quot;166&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+5.7k&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;140&quot; y=&quot;186&quot; width=&quot;163&quot; height=&quot;14&quot; fill=&quot;var(--primary)&quot; opacity=&quot;0.6&quot;/&amp;gt;&amp;lt;text x=&quot;680&quot; y=&quot;198&quot; font-size=&quot;12&quot; font-family=&quot;system-ui,-apple-system,Segoe UI,Roboto,Arial&quot; fill=&quot;var(--tw-prose-body)&quot; opacity=&quot;0.9&quot;&amp;gt;+5.0k&amp;lt;/text&amp;gt;
&amp;lt;/g&amp;gt;
&amp;lt;/svg&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;排名&lt;/th&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;2025 新增 star&lt;/th&gt;
&lt;th&gt;定位&lt;/th&gt;
&lt;th&gt;关键词&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Valdi&lt;/td&gt;
&lt;td&gt;+15.9k&lt;/td&gt;
&lt;td&gt;跨端 UI 框架&lt;/td&gt;
&lt;td&gt;TypeScript、JSX、Web 风格&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Lynx&lt;/td&gt;
&lt;td&gt;+14.0k&lt;/td&gt;
&lt;td&gt;跨端渲染/运行时&lt;/td&gt;
&lt;td&gt;原生渲染、性能、工程化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Expo&lt;/td&gt;
&lt;td&gt;+10.2k&lt;/td&gt;
&lt;td&gt;React Native 平台/工具链&lt;/td&gt;
&lt;td&gt;EAS、Router、原生能力&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Dioxus&lt;/td&gt;
&lt;td&gt;+5.7k&lt;/td&gt;
&lt;td&gt;Rust UI 框架&lt;/td&gt;
&lt;td&gt;跨平台、声明式、性能&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;+5.0k&lt;/td&gt;
&lt;td&gt;移动端框架&lt;/td&gt;
&lt;td&gt;跨平台、生态、原生桥接&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;React Native Reusables&lt;/td&gt;
&lt;td&gt;+3.3k&lt;/td&gt;
&lt;td&gt;RN 组件库/分发&lt;/td&gt;
&lt;td&gt;复制粘贴、设计系统、工程化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Capacitor&lt;/td&gt;
&lt;td&gt;+2.2k&lt;/td&gt;
&lt;td&gt;Web 到原生容器&lt;/td&gt;
&lt;td&gt;原生插件、Hybrid、迁移&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;NativeWind&lt;/td&gt;
&lt;td&gt;+1.9k&lt;/td&gt;
&lt;td&gt;RN 的 Tailwind 方案&lt;/td&gt;
&lt;td&gt;实用类、样式系统、DX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;gluestack-ui&lt;/td&gt;
&lt;td&gt;+1.7k&lt;/td&gt;
&lt;td&gt;RN 组件库&lt;/td&gt;
&lt;td&gt;主题化、可组合、Design System&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Tamagui&lt;/td&gt;
&lt;td&gt;+1.7k&lt;/td&gt;
&lt;td&gt;跨平台 UI Kit&lt;/td&gt;
&lt;td&gt;RN + Web、性能、编译优化&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;分析要点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Valdi 与 Lynx 的出现让“跨平台 UI”有了更多 Web 风格的选择：TypeScript、JSX、flexbox、热重载、CSS 等，说明开发者仍然强烈偏好 Web 生产力模型。&lt;/li&gt;
&lt;li&gt;React Native 与 Expo 仍是可靠的长期下注，但 2025 的榜单也提示：移动端的“新抽象”正在涌现，尤其是在性能与交互复杂度更高的场景。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;9. 2026 选型建议（面向落地）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;以“团队稳定交付”为第一目标：React + 成熟元框架仍是默认解，但需要把“客户端/服务端边界、安全面、缓存与数据生命周期”纳入工程规范。&lt;/li&gt;
&lt;li&gt;以“体验/速度与简单”为第一目标：Svelte 的开发体验很强，适合新项目或内容型产品，团队学习曲线相对平滑。&lt;/li&gt;
&lt;li&gt;以“内容 + 性能 + 部分交互”为第一目标：Astro 仍然非常稳，适合把交互作为“岛屿”而非全量 SPA。&lt;/li&gt;
&lt;li&gt;以“AI 作为工作的一部分”为第一目标：优先考虑可编排的工作流/代理工具，把测试、运营、数据处理、内容生产纳入自动化闭环。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;10. 年度大事与 2026 展望&lt;/h2&gt;
&lt;p&gt;2025 年发生了几件会改变 JS 生态结构的事：Bun 被 Anthropic 收购（Claude Code/Claude 模型背后的公司），并明确把 Bun 作为 AI 编码产品的关键基础设施之一，这也解释了为什么“一体化运行时 + 单文件可执行分发”会在 AI 编码工具/代理时代变得更重要。同样值得关注的是人才与组织的迁移：长期代表 Next.js 的 Lee Robinson 加入 Cursor，围绕 AI 编码与工作流推出面向初学者的学习内容（参考：&lt;a href=&quot;https://www.lennysnewsletter.com/p/the-beginners-guide-to-coding-with&quot;&gt;Lenny’s Newsletter 访谈&lt;/a&gt;、&lt;a href=&quot;https://x.com/leerob&quot;&gt;Cursor Learn 相关内容&lt;/a&gt;）；而 NuxtLabs（Nuxt/Nitro 团队）加入 Vercel，也被视作“多框架共存”在平台侧变得更现实的信号。&lt;/p&gt;
&lt;p&gt;框架层面也在分化：Remix 3 选择淡化 React 依赖、进一步回到 Web 平台与更少的关键依赖（参考：&lt;a href=&quot;https://www.infoq.com/news/2025/08/remix-run-v3-drops-react/&quot;&gt;InfoQ 报道&lt;/a&gt;）。而 React/Next 侧，“指令（directive）”正在从 &lt;code&gt;use client&lt;/code&gt;、&lt;code&gt;use server&lt;/code&gt;、&lt;code&gt;use cache&lt;/code&gt; 走向影响更广的基础设施语义，带来边界清晰度与可移植性的讨论。与此同时，供应链安全风险被进一步放大：Shai-Hulud 相关的 npm 供应链攻击波及大量包与仓库，让“依赖审计、最小权限、凭证轮换、供应链防护”从最佳实践变成了刚需。&lt;/p&gt;
&lt;p&gt;2026 的未来更像一条“平衡线”：代理工作流（能编排、能回放、可观测）会成为开发者的必备技能，但同时也要避免把控制权完全交给 AI 而牺牲工程质量、边界与安全；能否在“速度”与“可维护性”之间找到合适的中间点，将决定团队在 AI 时代的长期竞争力。&lt;/p&gt;
</content:encoded></item><item><title>世界模型的到来</title><link>https://blog.ai-nous.com/posts/%E4%B8%96%E7%95%8C%E6%A8%A1%E5%9E%8B%E7%9A%84%E5%88%B0%E6%9D%A5/</link><guid isPermaLink="true">https://blog.ai-nous.com/posts/%E4%B8%96%E7%95%8C%E6%A8%A1%E5%9E%8B%E7%9A%84%E5%88%B0%E6%9D%A5/</guid><description>生成式模型走向“可行动”的关键一步：把世界变成可预测、可检验、可规划的内部表征。</description><pubDate>Sat, 10 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我们谈“世界模型”时，经常会把它想成一个宏大名词：仿佛需要先造出一个能完整复制现实的数字孪生，才配叫世界模型。但在工程语境里，它更像一种能力组合：系统能把观测压缩成状态，把状态推进到未来，再把未来反推到可执行的动作。它不必全知全能，却必须在足够多的情境里“算得对、跑得稳、改得快”。&lt;/p&gt;
&lt;p&gt;过去两年，这条路线突然变得具体了：模型开始擅长长链条推理与工具调用；多模态把抽象符号重新绑回到真实感知；机器人政策开始从“单任务特训”走向“通用技能库”；硬件平台把推理的瓶颈从算力搬到能耗、内存与带宽。世界模型不再只是研究论文里的结构，而正在变成产业链共同对齐的一套目标函数。&lt;/p&gt;
&lt;h2&gt;1. 最新模型进步：从“生成答案”到“生成过程”&lt;/h2&gt;
&lt;p&gt;如果把 2023 年以前的大模型概括成“更像知识检索 + 文本补全”，那么近期的明显变化是：模型越来越像在生成一个可执行的推理过程，而不是只给出一个看似正确的结论。这个变化背后是推理时扩展（inference-time scaling）与强化学习训练范式的结合：让模型在更长的思维链里做更多“中间计算”，并通过可验证奖励把正确性向过程内推。&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/images/model/tuilikuozhan.png&quot; alt=&quot;tuilikuozhan&quot;/&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;图注：LIM推理的增长趋势。显示了从2022年到2025年2月发表的论文累计数量（以千为单位），基于Semantic Scholar关键词搜索，自2022年引入链式思维（Chain-of-Thought，CoT）以来，关于制度和架构的研究明显加快&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对世界模型而言，这一步非常关键。世界模型不是一句话能回答的问题，而是一个持续运行的系统：它要反复读取观测、维护记忆、调用工具、校验假设、更新计划。也就是说，世界模型天然是“多轮推理 + 多次行动”的形态。把大模型训练成更稳定的推理器，相当于先补齐了系统 2（慢思考、规划、反事实推演）的底座。&lt;/p&gt;
&lt;p&gt;与此同时，模型的上下文窗口和外部记忆机制也在变得更工程化：长上下文让“持续对话”变成“持续建模”，而不是一次次重新开局；外部检索与工具接口把世界状态从“模型脑内的文本幻觉”转成“可以被重复验证的外部事实”。这为世界模型的第二个关键要素铺路：多模态与可检验的观测。&lt;/p&gt;
&lt;h2&gt;2. 多模态的重要性：世界模型必须“接地”&lt;/h2&gt;
&lt;p&gt;语言是高压缩的抽象接口，但世界不是用语言运行的。只靠文本训练出来的模型，擅长在符号空间里做一致性，却很难保证与物理因果一致。世界模型之所以必须多模态，不是为了让模型“看图识字”更强，而是为了把预测对象从“下一段文本”升级为“下一段可观测世界状态”。&lt;/p&gt;
&lt;p&gt;机器人领域最近的 VLA（Vision-Language-Action）路线很典型：把视觉、语言与动作放到同一个建模框架里，让“看见什么、理解什么、怎么做”变成一个端到端的闭环。相关综述里普遍强调一个趋势：从分模块流水线走向统一表征与统一优化，目标是让策略能跨任务、跨物体、甚至跨不同机器人形态泛化（Vision-Language-Action survey，2025）。这种路线在能力侧看起来像“更通用的机器人”，在世界模型侧看其实是：模型必须学会把感知映射到可行动的状态空间，并在行动后用新观测修正自己。&lt;/p&gt;
&lt;p&gt;如果说语言模型解决的是“如何在符号里做推理”，那么多模态解决的是“如何让推理对象与世界对齐”。从这一刻开始，世界模型的核心不再是文本生成的流畅度，而是对观测、行动、反馈三者之间因果结构的掌握。&lt;/p&gt;
&lt;h2&gt;3. 线性代数、分段线性区域与“高维流型”&lt;/h2&gt;
&lt;p&gt;讨论世界模型，很容易陷入直觉叙事：模型好像在脑子里画出了一张世界地图。但把它落到可计算的结构，会发现核心仍是线性代数之上的函数逼近与优化：矩阵乘法是主干，非线性激活负责把空间折叠出可用的表示。&lt;/p&gt;
&lt;p&gt;先看数据本身。高维观测并不是“铺满”整个空间，更多时候，它们沿着受约束的子结构分布；工程里常把这种“薄的结构”叫作流型。世界模型首先要做的，是把观测压缩成更稳定、更可控的表征，让相邻关系和变化方向在表征空间里变得更清晰。&lt;/p&gt;
&lt;p&gt;&amp;lt;div style=&quot;background:var(--card-bg);border:1px solid var(--line-divider);border-radius:1rem;padding:0.75rem;margin:1rem 0;&quot;&amp;gt;
&amp;lt;svg viewBox=&quot;0 0 940 260&quot; width=&quot;100%&quot; height=&quot;260&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;数据并非填满高维空间，而是集中在可结构化的低维流型上；学习的目标是找到稳定表征&quot; style=&quot;display:block;margin:0 auto;&quot;&amp;gt;
&amp;lt;defs&amp;gt;
&amp;lt;linearGradient id=&quot;mf_bg&quot; x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;1&quot; y2=&quot;1&quot;&amp;gt;
&amp;lt;stop offset=&quot;0&quot; stop-color=&quot;var(--card-bg)&quot;/&amp;gt;
&amp;lt;stop offset=&quot;1&quot; stop-color=&quot;var(--btn-regular-bg)&quot;/&amp;gt;
&amp;lt;/linearGradient&amp;gt;
&amp;lt;marker id=&quot;mf_arrow&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;9&quot; refY=&quot;5&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto-start-reverse&quot;&amp;gt;
&amp;lt;path d=&quot;M 0 0 L 10 5 L 0 10 z&quot; fill=&quot;var(--primary)&quot;/&amp;gt;
&amp;lt;/marker&amp;gt;
&amp;lt;filter id=&quot;mf_shadow&quot; x=&quot;-20%&quot; y=&quot;-20%&quot; width=&quot;140%&quot; height=&quot;140%&quot;&amp;gt;
&amp;lt;feDropShadow dx=&quot;0&quot; dy=&quot;1.2&quot; stdDeviation=&quot;1.2&quot; flood-color=&quot;rgba(0,0,0,0.18)&quot;/&amp;gt;
&amp;lt;/filter&amp;gt;
&amp;lt;style&amp;gt;
.t { font-family: system-ui,-apple-system,Segoe UI,Roboto,Arial; fill: var(--tw-prose-body); }
.h { font-family: system-ui,-apple-system,Segoe UI,Roboto,Arial; fill: var(--tw-prose-headings); font-weight: 700; }
.box { fill: url(#mf_bg); stroke: var(--line-divider); stroke-width: 1; rx: 14; filter: url(#mf_shadow); }
.grid { stroke: var(--line-divider); stroke-width: 1; opacity: .9; }
.axis { stroke: var(--tw-prose-body); stroke-width: 1.4; opacity: .55; marker-end: url(#mf_arrow); }
.surf { fill: var(--primary); opacity: .10; stroke: var(--primary); stroke-width: 1.6; }
.pt { fill: var(--primary); opacity: .9; }
.arrow { stroke: var(--primary); stroke-width: 2.2; fill: none; marker-end: url(#mf_arrow); opacity: .9; }
.hint { fill: var(--tw-prose-body); opacity: .75; font-size: 12px; }
&amp;lt;/style&amp;gt;
&amp;lt;/defs&amp;gt;
&amp;lt;text x=&quot;18&quot; y=&quot;26&quot; class=&quot;h&quot; font-size=&quot;16&quot;&amp;gt;低维流型嵌在高维里：看起来复杂，分布却很“薄”&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;18&quot; y=&quot;46&quot; width=&quot;560&quot; height=&quot;194&quot; class=&quot;box&quot;/&amp;gt;
&amp;lt;text x=&quot;34&quot; y=&quot;74&quot; class=&quot;h&quot; font-size=&quot;13&quot;&amp;gt;观测空间（高维）&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;34&quot; y=&quot;94&quot; class=&quot;hint&quot;&amp;gt;图片/视频/传感器并不均匀分布，往往集中在低维子结构&amp;lt;/text&amp;gt;
&amp;lt;path d=&quot;M 84 214 L 84 128&quot; class=&quot;axis&quot;/&amp;gt;
&amp;lt;path d=&quot;M 84 214 L 196 214&quot; class=&quot;axis&quot;/&amp;gt;
&amp;lt;path d=&quot;M 84 214 L 40 236&quot; class=&quot;axis&quot;/&amp;gt;
&amp;lt;text x=&quot;202&quot; y=&quot;218&quot; class=&quot;hint&quot;&amp;gt;x&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;70&quot; y=&quot;126&quot; class=&quot;hint&quot;&amp;gt;y&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;30&quot; y=&quot;252&quot; class=&quot;hint&quot;&amp;gt;z&amp;lt;/text&amp;gt;
&amp;lt;path d=&quot;M 168 116 C 232 96, 300 126, 336 164 C 368 200, 336 226, 270 232 C 200 240, 154 214, 144 182 C 134 150, 142 128, 168 116 Z&quot; class=&quot;surf&quot;/&amp;gt;
&amp;lt;path d=&quot;M 182 132 C 236 118, 294 140, 322 166&quot; class=&quot;grid&quot;/&amp;gt;
&amp;lt;path d=&quot;M 160 156 C 226 138, 300 160, 334 190&quot; class=&quot;grid&quot;/&amp;gt;
&amp;lt;path d=&quot;M 148 182 C 220 170, 284 190, 318 216&quot; class=&quot;grid&quot;/&amp;gt;
&amp;lt;path d=&quot;M 214 110 C 208 144, 220 182, 250 214&quot; class=&quot;grid&quot;/&amp;gt;
&amp;lt;path d=&quot;M 264 114 C 256 152, 272 194, 304 222&quot; class=&quot;grid&quot;/&amp;gt;
&amp;lt;circle cx=&quot;190&quot; cy=&quot;150&quot; r=&quot;4.2&quot; class=&quot;pt&quot;/&amp;gt;
&amp;lt;circle cx=&quot;230&quot; cy=&quot;140&quot; r=&quot;4.2&quot; class=&quot;pt&quot;/&amp;gt;
&amp;lt;circle cx=&quot;274&quot; cy=&quot;160&quot; r=&quot;4.2&quot; class=&quot;pt&quot;/&amp;gt;
&amp;lt;circle cx=&quot;308&quot; cy=&quot;186&quot; r=&quot;4.2&quot; class=&quot;pt&quot;/&amp;gt;
&amp;lt;circle cx=&quot;250&quot; cy=&quot;200&quot; r=&quot;4.2&quot; class=&quot;pt&quot;/&amp;gt;
&amp;lt;circle cx=&quot;210&quot; cy=&quot;198&quot; r=&quot;4.2&quot; class=&quot;pt&quot;/&amp;gt;
&amp;lt;path d=&quot;M 584 144 C 634 144, 646 144, 686 144&quot; class=&quot;arrow&quot;/&amp;gt;
&amp;lt;rect x=&quot;690&quot; y=&quot;46&quot; width=&quot;232&quot; height=&quot;194&quot; class=&quot;box&quot;/&amp;gt;
&amp;lt;text x=&quot;706&quot; y=&quot;74&quot; class=&quot;h&quot; font-size=&quot;13&quot;&amp;gt;表征空间（低维/可控）&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;706&quot; y=&quot;94&quot; class=&quot;hint&quot;&amp;gt;映射后相邻关系更稳定，便于插值、预测与规划&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;716&quot; y=&quot;116&quot; width=&quot;178&quot; height=&quot;108&quot; fill=&quot;none&quot; stroke=&quot;var(--line-divider)&quot; stroke-width=&quot;1&quot; rx=&quot;10&quot;/&amp;gt;
&amp;lt;path d=&quot;M 730 210 L 730 132&quot; class=&quot;axis&quot;/&amp;gt;
&amp;lt;path d=&quot;M 730 210 L 876 210&quot; class=&quot;axis&quot;/&amp;gt;
&amp;lt;text x=&quot;882&quot; y=&quot;214&quot; class=&quot;hint&quot;&amp;gt;u&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;716&quot; y=&quot;134&quot; class=&quot;hint&quot;&amp;gt;v&amp;lt;/text&amp;gt;
&amp;lt;circle cx=&quot;760&quot; cy=&quot;184&quot; r=&quot;4.2&quot; class=&quot;pt&quot;/&amp;gt;
&amp;lt;circle cx=&quot;786&quot; cy=&quot;170&quot; r=&quot;4.2&quot; class=&quot;pt&quot;/&amp;gt;
&amp;lt;circle cx=&quot;812&quot; cy=&quot;176&quot; r=&quot;4.2&quot; class=&quot;pt&quot;/&amp;gt;
&amp;lt;circle cx=&quot;836&quot; cy=&quot;160&quot; r=&quot;4.2&quot; class=&quot;pt&quot;/&amp;gt;
&amp;lt;circle cx=&quot;852&quot; cy=&quot;186&quot; r=&quot;4.2&quot; class=&quot;pt&quot;/&amp;gt;
&amp;lt;path d=&quot;M 754 186 C 782 168, 808 178, 838 160&quot; stroke=&quot;var(--primary)&quot; stroke-width=&quot;1.8&quot; fill=&quot;none&quot; opacity=&quot;.55&quot;/&amp;gt;
&amp;lt;text x=&quot;706&quot; y=&quot;246&quot; class=&quot;hint&quot;&amp;gt;直觉：把“薄的结构”找出来，比把“整个空间”学会更可行&amp;lt;/text&amp;gt;
&amp;lt;/svg&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;再看函数表达力。世界模型不仅要“表示世界”，还要在表征上做推进与预测，这就需要网络对空间有足够细的切分能力：在小范围内尽可能平滑可控，在全局上又能拼出复杂形状。分段线性网络提供了一个可量化切口：同一激活模式下，网络对输入是线性的；激活模式一变，就相当于切到另一块线性片段。Montúfar 等人在 2014 年从线性区域数量的角度分析了深层网络的表达复杂度（On the Number of Linear Regions of Deep Neural Networks，2014）。&lt;/p&gt;
&lt;p&gt;&amp;lt;div style=&quot;background:var(--card-bg);border:1px solid var(--line-divider);border-radius:1rem;padding:0.75rem;margin:1rem 0;&quot;&amp;gt;
&amp;lt;svg viewBox=&quot;0 0 940 260&quot; width=&quot;100%&quot; height=&quot;260&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;分段线性网络把输入空间切分成很多线性区域；同一区域内是线性映射，跨区域则拼接成高曲率函数&quot; style=&quot;display:block;margin:0 auto;&quot;&amp;gt;
&amp;lt;defs&amp;gt;
&amp;lt;linearGradient id=&quot;lr_bg&quot; x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;1&quot; y2=&quot;1&quot;&amp;gt;
&amp;lt;stop offset=&quot;0&quot; stop-color=&quot;var(--card-bg)&quot;/&amp;gt;
&amp;lt;stop offset=&quot;1&quot; stop-color=&quot;var(--btn-regular-bg)&quot;/&amp;gt;
&amp;lt;/linearGradient&amp;gt;
&amp;lt;marker id=&quot;lr_arrow&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;9&quot; refY=&quot;5&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto-start-reverse&quot;&amp;gt;
&amp;lt;path d=&quot;M 0 0 L 10 5 L 0 10 z&quot; fill=&quot;var(--primary)&quot;/&amp;gt;
&amp;lt;/marker&amp;gt;
&amp;lt;filter id=&quot;lr_shadow&quot; x=&quot;-20%&quot; y=&quot;-20%&quot; width=&quot;140%&quot; height=&quot;140%&quot;&amp;gt;
&amp;lt;feDropShadow dx=&quot;0&quot; dy=&quot;1.2&quot; stdDeviation=&quot;1.2&quot; flood-color=&quot;rgba(0,0,0,0.18)&quot;/&amp;gt;
&amp;lt;/filter&amp;gt;
&amp;lt;style&amp;gt;
.t { font-family: system-ui,-apple-system,Segoe UI,Roboto,Arial; fill: var(--tw-prose-body); }
.h { font-family: system-ui,-apple-system,Segoe UI,Roboto,Arial; fill: var(--tw-prose-headings); font-weight: 700; }
.box { fill: url(#lr_bg); stroke: var(--line-divider); stroke-width: 1; rx: 14; filter: url(#lr_shadow); }
.axis { stroke: var(--tw-prose-body); stroke-width: 1.4; opacity: .55; marker-end: url(#lr_arrow); }
.split { stroke: var(--tw-prose-body); stroke-width: 1.6; opacity: .45; }
.regionA { fill: var(--primary); opacity: .10; }
.regionB { fill: var(--primary); opacity: .16; }
.regionC { fill: var(--primary); opacity: .22; }
.arrow { stroke: var(--primary); stroke-width: 2.2; fill: none; marker-end: url(#lr_arrow); opacity: .9; }
.hint { fill: var(--tw-prose-body); opacity: .75; font-size: 12px; }
.pt { fill: var(--primary); opacity: .9; }
&amp;lt;/style&amp;gt;
&amp;lt;/defs&amp;gt;
&amp;lt;text x=&quot;18&quot; y=&quot;26&quot; class=&quot;h&quot; font-size=&quot;16&quot;&amp;gt;线性区域：同一激活模式下是线性的，整体则是“拼接”出来的曲率&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;18&quot; y=&quot;46&quot; width=&quot;560&quot; height=&quot;194&quot; class=&quot;box&quot;/&amp;gt;
&amp;lt;text x=&quot;34&quot; y=&quot;74&quot; class=&quot;h&quot; font-size=&quot;13&quot;&amp;gt;输入空间（示意为 2D）&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;34&quot; y=&quot;94&quot; class=&quot;hint&quot;&amp;gt;ReLU 的开/关组合切分出许多多面体区域&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;58&quot; y=&quot;112&quot; width=&quot;480&quot; height=&quot;110&quot; fill=&quot;none&quot; stroke=&quot;var(--line-divider)&quot; stroke-width=&quot;1&quot; rx=&quot;10&quot;/&amp;gt;
&amp;lt;path d=&quot;M 88 212 L 88 124&quot; class=&quot;axis&quot;/&amp;gt;
&amp;lt;path d=&quot;M 88 212 L 520 212&quot; class=&quot;axis&quot;/&amp;gt;
&amp;lt;text x=&quot;526&quot; y=&quot;216&quot; class=&quot;hint&quot;&amp;gt;x₁&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;74&quot; y=&quot;126&quot; class=&quot;hint&quot;&amp;gt;x₂&amp;lt;/text&amp;gt;
&amp;lt;polygon points=&quot;92,210 240,210 206,122 92,140&quot; class=&quot;regionA&quot;/&amp;gt;
&amp;lt;polygon points=&quot;240,210 390,210 420,152 310,122 206,122&quot; class=&quot;regionB&quot;/&amp;gt;
&amp;lt;polygon points=&quot;390,210 520,210 520,160 420,152&quot; class=&quot;regionC&quot;/&amp;gt;
&amp;lt;path d=&quot;M 92 140 L 520 160&quot; class=&quot;split&quot;/&amp;gt;
&amp;lt;path d=&quot;M 206 122 L 420 152&quot; class=&quot;split&quot;/&amp;gt;
&amp;lt;path d=&quot;M 240 210 L 310 122&quot; class=&quot;split&quot;/&amp;gt;
&amp;lt;circle cx=&quot;160&quot; cy=&quot;168&quot; r=&quot;4.2&quot; class=&quot;pt&quot;/&amp;gt;
&amp;lt;circle cx=&quot;220&quot; cy=&quot;156&quot; r=&quot;4.2&quot; class=&quot;pt&quot;/&amp;gt;
&amp;lt;circle cx=&quot;300&quot; cy=&quot;186&quot; r=&quot;4.2&quot; class=&quot;pt&quot;/&amp;gt;
&amp;lt;circle cx=&quot;352&quot; cy=&quot;170&quot; r=&quot;4.2&quot; class=&quot;pt&quot;/&amp;gt;
&amp;lt;circle cx=&quot;462&quot; cy=&quot;184&quot; r=&quot;4.2&quot; class=&quot;pt&quot;/&amp;gt;
&amp;lt;path d=&quot;M 584 144 C 636 144, 650 144, 692 144&quot; class=&quot;arrow&quot;/&amp;gt;
&amp;lt;rect x=&quot;700&quot; y=&quot;46&quot; width=&quot;222&quot; height=&quot;194&quot; class=&quot;box&quot;/&amp;gt;
&amp;lt;text x=&quot;716&quot; y=&quot;74&quot; class=&quot;h&quot; font-size=&quot;13&quot;&amp;gt;输出函数（1D 示意）&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;716&quot; y=&quot;94&quot; class=&quot;hint&quot;&amp;gt;每段都是直线，折点来自区域切换&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;716&quot; y=&quot;112&quot; width=&quot;190&quot; height=&quot;122&quot; fill=&quot;none&quot; stroke=&quot;var(--line-divider)&quot; stroke-width=&quot;1&quot; rx=&quot;10&quot;/&amp;gt;
&amp;lt;path d=&quot;M 736 214 L 736 126&quot; class=&quot;axis&quot;/&amp;gt;
&amp;lt;path d=&quot;M 736 214 L 894 214&quot; class=&quot;axis&quot;/&amp;gt;
&amp;lt;path d=&quot;M 742 200 L 786 176 L 832 186 L 874 152&quot; stroke=&quot;var(--primary)&quot; stroke-width=&quot;2.2&quot; fill=&quot;none&quot; opacity=&quot;.85&quot;/&amp;gt;
&amp;lt;circle cx=&quot;786&quot; cy=&quot;176&quot; r=&quot;4&quot; class=&quot;pt&quot;/&amp;gt;
&amp;lt;circle cx=&quot;832&quot; cy=&quot;186&quot; r=&quot;4&quot; class=&quot;pt&quot;/&amp;gt;
&amp;lt;text x=&quot;716&quot; y=&quot;246&quot; class=&quot;hint&quot;&amp;gt;“深度”增加区域数，提升可表达的形状复杂度&amp;lt;/text&amp;gt;
&amp;lt;/svg&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;最后看优化。训练做的并不是把整个空间都拟合好，而是在“数据实际出现的那一小块区域”把切分做得更合适：让流型落在更稳定、更容易推进的线性片段上，让插值、外推与长时序预测更不容易跑飞。&lt;/p&gt;
&lt;p&gt;&amp;lt;div style=&quot;background:var(--card-bg);border:1px solid var(--line-divider);border-radius:1rem;padding:0.75rem;margin:1rem 0;&quot;&amp;gt;
&amp;lt;svg viewBox=&quot;0 0 940 260&quot; width=&quot;100%&quot; height=&quot;260&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;优化的直觉：训练通过调整分割与表征，使数据流型落在更可用的线性片段上，便于状态推进与规划&quot; style=&quot;display:block;margin:0 auto;&quot;&amp;gt;
&amp;lt;defs&amp;gt;
&amp;lt;linearGradient id=&quot;op_bg&quot; x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;1&quot; y2=&quot;1&quot;&amp;gt;
&amp;lt;stop offset=&quot;0&quot; stop-color=&quot;var(--card-bg)&quot;/&amp;gt;
&amp;lt;stop offset=&quot;1&quot; stop-color=&quot;var(--btn-regular-bg)&quot;/&amp;gt;
&amp;lt;/linearGradient&amp;gt;
&amp;lt;marker id=&quot;op_arrow&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;9&quot; refY=&quot;5&quot; markerWidth=&quot;8&quot; markerHeight=&quot;8&quot; orient=&quot;auto-start-reverse&quot;&amp;gt;
&amp;lt;path d=&quot;M 0 0 L 10 5 L 0 10 z&quot; fill=&quot;var(--primary)&quot;/&amp;gt;
&amp;lt;/marker&amp;gt;
&amp;lt;filter id=&quot;op_shadow&quot; x=&quot;-20%&quot; y=&quot;-20%&quot; width=&quot;140%&quot; height=&quot;140%&quot;&amp;gt;
&amp;lt;feDropShadow dx=&quot;0&quot; dy=&quot;1.2&quot; stdDeviation=&quot;1.2&quot; flood-color=&quot;rgba(0,0,0,0.18)&quot;/&amp;gt;
&amp;lt;/filter&amp;gt;
&amp;lt;style&amp;gt;
.t { font-family: system-ui,-apple-system,Segoe UI,Roboto,Arial; fill: var(--tw-prose-body); }
.h { font-family: system-ui,-apple-system,Segoe UI,Roboto,Arial; fill: var(--tw-prose-headings); font-weight: 700; }
.box { fill: url(#op_bg); stroke: var(--line-divider); stroke-width: 1; rx: 14; filter: url(#op_shadow); }
.arrow { stroke: var(--primary); stroke-width: 2.2; fill: none; marker-end: url(#op_arrow); opacity: .9; }
.dash { stroke: var(--primary); stroke-width: 2; fill: none; marker-end: url(#op_arrow); opacity: .6; stroke-dasharray: 6 6; }
.hint { fill: var(--tw-prose-body); opacity: .75; font-size: 12px; }
.pt { fill: var(--primary); opacity: .9; }
.region { fill: var(--primary); opacity: .10; stroke: var(--primary); stroke-width: 1.5; }
&amp;lt;/style&amp;gt;
&amp;lt;/defs&amp;gt;
&amp;lt;text x=&quot;18&quot; y=&quot;26&quot; class=&quot;h&quot; font-size=&quot;16&quot;&amp;gt;训练的直觉：让“数据所在处”落进更可用的几何片段&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;18&quot; y=&quot;46&quot; width=&quot;286&quot; height=&quot;194&quot; class=&quot;box&quot;/&amp;gt;
&amp;lt;text x=&quot;34&quot; y=&quot;74&quot; class=&quot;h&quot; font-size=&quot;13&quot;&amp;gt;数据分布&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;34&quot; y=&quot;94&quot; class=&quot;hint&quot;&amp;gt;样本沿着流型排列&amp;lt;/text&amp;gt;
&amp;lt;path d=&quot;M 56 210 C 108 160, 152 236, 208 182 C 244 148, 272 170, 288 140&quot; stroke=&quot;var(--primary)&quot; stroke-width=&quot;2.2&quot; fill=&quot;none&quot; opacity=&quot;.55&quot;/&amp;gt;
&amp;lt;circle cx=&quot;92&quot; cy=&quot;186&quot; r=&quot;4.2&quot; class=&quot;pt&quot;/&amp;gt;
&amp;lt;circle cx=&quot;128&quot; cy=&quot;206&quot; r=&quot;4.2&quot; class=&quot;pt&quot;/&amp;gt;
&amp;lt;circle cx=&quot;164&quot; cy=&quot;202&quot; r=&quot;4.2&quot; class=&quot;pt&quot;/&amp;gt;
&amp;lt;circle cx=&quot;204&quot; cy=&quot;182&quot; r=&quot;4.2&quot; class=&quot;pt&quot;/&amp;gt;
&amp;lt;circle cx=&quot;238&quot; cy=&quot;162&quot; r=&quot;4.2&quot; class=&quot;pt&quot;/&amp;gt;
&amp;lt;path d=&quot;M 316 144 C 352 144, 366 144, 398 144&quot; class=&quot;arrow&quot;/&amp;gt;
&amp;lt;rect x=&quot;402&quot; y=&quot;46&quot; width=&quot;286&quot; height=&quot;194&quot; class=&quot;box&quot;/&amp;gt;
&amp;lt;text x=&quot;418&quot; y=&quot;74&quot; class=&quot;h&quot; font-size=&quot;13&quot;&amp;gt;表征 / 切分&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;418&quot; y=&quot;94&quot; class=&quot;hint&quot;&amp;gt;激活模式把空间切成线性片段&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;430&quot; y=&quot;114&quot; width=&quot;230&quot; height=&quot;110&quot; fill=&quot;none&quot; stroke=&quot;var(--line-divider)&quot; stroke-width=&quot;1&quot; rx=&quot;10&quot;/&amp;gt;
&amp;lt;path d=&quot;M 434 206 L 658 130&quot; stroke=&quot;var(--tw-prose-body)&quot; stroke-width=&quot;1.6&quot; opacity=&quot;.45&quot;/&amp;gt;
&amp;lt;path d=&quot;M 502 224 L 566 118&quot; stroke=&quot;var(--tw-prose-body)&quot; stroke-width=&quot;1.6&quot; opacity=&quot;.45&quot;/&amp;gt;
&amp;lt;polygon points=&quot;434,206 502,224 566,118 502,132&quot; class=&quot;region&quot;/&amp;gt;
&amp;lt;text x=&quot;440&quot; y=&quot;238&quot; class=&quot;hint&quot;&amp;gt;区域内：近似线性、可插值&amp;lt;/text&amp;gt;
&amp;lt;path d=&quot;M 706 144 C 742 144, 756 144, 788 144&quot; class=&quot;arrow&quot;/&amp;gt;
&amp;lt;rect x=&quot;792&quot; y=&quot;46&quot; width=&quot;130&quot; height=&quot;194&quot; class=&quot;box&quot;/&amp;gt;
&amp;lt;text x=&quot;808&quot; y=&quot;74&quot; class=&quot;h&quot; font-size=&quot;13&quot;&amp;gt;任务&amp;lt;/text&amp;gt;
&amp;lt;text x=&quot;808&quot; y=&quot;94&quot; class=&quot;hint&quot;&amp;gt;预测 / 规划&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;808&quot; y=&quot;118&quot; width=&quot;98&quot; height=&quot;40&quot; fill=&quot;none&quot; stroke=&quot;var(--line-divider)&quot; stroke-width=&quot;1&quot; rx=&quot;10&quot;/&amp;gt;
&amp;lt;text x=&quot;818&quot; y=&quot;142&quot; class=&quot;t&quot; font-size=&quot;12&quot;&amp;gt;状态推进&amp;lt;/text&amp;gt;
&amp;lt;rect x=&quot;808&quot; y=&quot;170&quot; width=&quot;98&quot; height=&quot;40&quot; fill=&quot;none&quot; stroke=&quot;var(--line-divider)&quot; stroke-width=&quot;1&quot; rx=&quot;10&quot;/&amp;gt;
&amp;lt;text x=&quot;818&quot; y=&quot;194&quot; class=&quot;t&quot; font-size=&quot;12&quot;&amp;gt;动作选择&amp;lt;/text&amp;gt;
&amp;lt;path d=&quot;M 700 222 C 632 252, 520 252, 428 224&quot; class=&quot;dash&quot;/&amp;gt;
&amp;lt;text x=&quot;476&quot; y=&quot;254&quot; class=&quot;hint&quot;&amp;gt;优化：不断调整切分，使“数据所在的区域”更好用&amp;lt;/text&amp;gt;
&amp;lt;/svg&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;世界模型需要的正是这种几何能力：它要在表征里做状态推进，从 (s_t) 到 (s_{t+1}) 的动力学近似、从目标到动作序列的规划、以及从误差到策略更新的闭环。没有足够丰富且可控的表示与切分，就很难在长时序任务里保持稳定。&lt;/p&gt;
&lt;h2&gt;4. 具身智能的发展：从单点技能到“技能库 + 规划器”&lt;/h2&gt;
&lt;p&gt;具身智能的变化，首先是数据与任务分布的变化：Open X-Embodiment 这类工作试图把分散的机器人数据对齐到统一格式，并训练跨任务的 RT-X 系列模型（Open X-Embodiment，2023–2025 持续更新）。当数据分布开始跨机器人、跨场景拼在一起，策略模型就不再是“机械臂 A 的拣选器”，而更像“可迁移的动作语言模型”。&lt;/p&gt;
&lt;p&gt;其次是架构上的分层：一类路线倾向于把高层规划（语言/符号推理）与低层控制（连续动作、反馈稳定性）分开优化，形成更像“规划器 + 技能库”的系统。VLA 综述里也经常提到双系统结构：用慢的系统负责分解任务、选择工具/技能；用快的系统负责执行与闭环纠错。这种分层与世界模型的需求高度一致：世界模型必须在高层维持一个可解释的任务结构，同时在低层保证动作的物理可行性。&lt;/p&gt;
&lt;p&gt;更重要的是，具身智能迫使模型面对一个无法回避的事实：预测必须可检验。语言任务里，错误可以被“合理化”；但在机器人里，错误会直接表现为抓不到、撞到、摔倒。可检验性把世界模型的训练目标从“看起来对”推向“真的能用”，也推动了更真实的数据、更强的仿真、更严格的评测指标。&lt;/p&gt;
&lt;h2&gt;5. 黄仁勋的算力平台与“瓦力”式机器人：把世界模型做成产品形态&lt;/h2&gt;
&lt;p&gt;当世界模型从研究走向工程，最先被放大的是系统瓶颈：推理的吞吐、上下文的驻留、跨节点的通信、以及把传感器与动作回路跑到实时的能力。近期 NVIDIA 对“机柜级系统”的叙事，本质上是在把世界模型需要的计算形态产品化：从单卡指标转向整机柜的带宽、内存容量与可用性。&lt;/p&gt;
&lt;p&gt;以 NVIDIA 在 CES 2026 公开的 Vera Rubin NVL72 机柜级系统为例，官方强调的是 MoE 推理 token 成本降低、NVLink 规模互联带宽以及系统级的内存/网络配置，目标指向的是“能持续推理、能持续上下文驻留、能支撑大规模 agent 的在线运行”（NVIDIA Newsroom：Rubin platform，2026）。你会发现这里的关键词与世界模型的需求对齐：世界模型不是离线训练一次就结束，而是要在运行时持续吸收观测、生成计划、调用工具，因而对上下文内存与互联有持续需求。&lt;/p&gt;
&lt;p&gt;同一条叙事在机器人展示里更直观。Jensen Huang 在公开活动中展示过与 Disney Research、DeepMind 合作的机器人“Blue”，那种“瓦力”式的外形与互动方式，很容易让人把注意力从某个硬件参数挪开，转向一个更实际的问题：一个具身系统能不能在真实环境里持续感知、持续推理、持续行动（Euronews：Blue robot，2025）。当这种演示从单次 Demo 变成可复用的平台能力，世界模型就拥有了更明确的落地载体：把多模态预测与动作闭环做成标准件。&lt;a href=&quot;https://zhuanlan.zhihu.com/p/1915178980568446515&quot;&gt;GR00T N1：NVIDIA为具身智能打造的开源基础模型&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;6. 年底算力和电力费用暴增的隐含逻辑：电力与内存成为世界模型的真实边界&lt;/h2&gt;
&lt;p&gt;把世界模型当成“模型能力”会误判它的节奏；把它当成“系统能力”才能看清它的约束。算力确实在暴增，但并不等于“问题消失”，更像是瓶颈在迁移：从训练算力迁移到推理能耗，从参数规模迁移到上下文驻留，从 FLOPs 迁移到内存带宽与供应链。&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;/images/model/chart2025.png&quot; alt=&quot;chart2025&quot; /&amp;gt;&lt;/p&gt;
&lt;p&gt;狗血的事前阵子想给自己的开发机加内存，才发现内存价格暴涨，本来计划一步到位把容量拉满，结果发现同样规格的条子在短时间内涨价明显；你会下意识地开始算账：是先上容量，还是先换更快的盘、先把显卡升级，或者干脆把预算留给下一代。它看起来只是装机的小纠结，但背后是同一个规律：当工作负载变“吃内存”，价格和供给就会先让你感到边界。&lt;/p&gt;
&lt;p&gt;电力已经是最硬的边界之一。IEA 在关于 AI 与能源的分析中给出数据中心用电的量级与增长速度：2024 年全球数据中心用电约 415 TWh（约占全球用电 1.5%），到 2030 年在基准情景下可能接近翻倍至约 945 TWh，并指出增长主要集中在美国与中国等区域（IEA：Energy demand from AI，2024/2025）。当推理成为常态、agent 成为工作流的一部分、世界模型成为在线系统，电力就会从“成本优化项”变成“部署硬约束”：配电、制冷、选址，直接决定能跑多大规模、能跑多高利用率。&lt;/p&gt;
&lt;p&gt;内存则是第二个硬边界。世界模型需要长上下文与多路传感器缓存，需要为推理提供足够带宽与容量，这会把 HBM 与高端 DRAM 变成系统级关键材料。TrendForce 的行业报道指出，AI 相关内存需求正在抬升并挤压供给，甚至出现对 2026 年 HBM3E 价格上调的预期与产能优先级调整（TrendForce：HBM3E 2026 price hike，2025；AI consumes DRAM capacity，2025）。当“算力”被理解成 GPU 数量时，人们往往忽略内存；但当系统跑到机柜级、跑到在线推理，内存就会以非常朴素的方式出现：带宽不够就是吞吐上不去，供给不稳就是扩容做不动。&lt;/p&gt;
&lt;p&gt;这也解释了为什么硬件平台越来越强调“上下文内存”“机柜互联”“系统可靠性”：世界模型的价值在运行时被释放，而运行时的瓶颈正逐步由能源与内存定义。&lt;/p&gt;
&lt;h2&gt;7. 世界模型什么时候真的实现&lt;/h2&gt;
&lt;p&gt;世界模型不会以“某个模型发布日”作为分水岭，它更像一条供应链与工程范式共同推进的曲线：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;推理能力变稳定：模型能在长链条里保持正确性，并能可靠调用工具。&lt;/li&gt;
&lt;li&gt;多模态变标准：预测对象从文本扩展到视觉/动作/反馈，世界开始“可检验”。&lt;/li&gt;
&lt;li&gt;表示几何变可控：模型能在高维空间里形成可组合、可泛化的状态表示。&lt;/li&gt;
&lt;li&gt;具身系统变平台：技能库与规划器分层，数据分布从单任务转向多任务统一。&lt;/li&gt;
&lt;li&gt;硬件与能源对齐：机柜级系统把瓶颈摊开，让能耗与内存成为显式约束。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;真正值得兴奋的地方在于：世界模型把“智能”从对话框里带出来，把它放到可以被验证、被部署、被迭代的系统里。它会逼迫我们重新定义很多工程指标：正确率不够，需要稳定性；延迟不够，需要闭环；模型不够，需要系统；算力不够，需要电与内存。&lt;/p&gt;
&lt;p&gt;世界模型的到来并不浪漫，但足够真实。&lt;/p&gt;
&lt;h2&gt;参考链接&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;IEA：Energy demand from AI https://www.iea.org/reports/energy-and-ai/energy-demand-from-ai&lt;/li&gt;
&lt;li&gt;Montúfar et al. 2014：On the Number of Linear Regions of Deep Neural Networks https://arxiv.org/abs/1402.1869&lt;/li&gt;
&lt;li&gt;Open X-Embodiment：https://arxiv.org/abs/2310.08864&lt;/li&gt;
&lt;li&gt;VLA Survey：https://vla-survey.github.io/&lt;/li&gt;
&lt;li&gt;NVIDIA Newsroom（Rubin platform）：https://nvidianews.nvidia.com/news/rubin-platform-ai-supercomputer&lt;/li&gt;
&lt;li&gt;TrendForce（HBM3E price hike for 2026）：https://www.trendforce.com/news/2025/12/24/news-samsung-sk-hynix-reportedly-plan-20-hbm3e-price-hike-for-2026-as-nvidia-h200-asic-demand-rises/&lt;/li&gt;
&lt;li&gt;TrendForce（AI consumes DRAM wafer capacity in 2026）：https://www.trendforce.com/news/2025/12/26/news-ai-reportedly-to-consume-20-of-global-dram-wafer-capacity-in-2026-hbm-gddr7-lead-demand/&lt;/li&gt;
&lt;li&gt;Euronews（Nvidia’s AI robot “Blue”）：https://www.euronews.com/video/2025/03/19/nvidias-ai-robot-blue-stuns-with-live-interaction&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>利用飞书多维文档实现博客的信息更新</title><link>https://blog.ai-nous.com/posts/%E5%88%A9%E7%94%A8%E9%A3%9E%E4%B9%A6%E5%A4%9A%E7%BB%B4%E6%96%87%E6%A1%A3%E5%AE%9E%E7%8E%B0%E5%8D%9A%E5%AE%A2%E7%9A%84%E4%BF%A1%E6%81%AF%E6%9B%B4%E6%96%B0/</link><guid isPermaLink="true">https://blog.ai-nous.com/posts/%E5%88%A9%E7%94%A8%E9%A3%9E%E4%B9%A6%E5%A4%9A%E7%BB%B4%E6%96%87%E6%A1%A3%E5%AE%9E%E7%8E%B0%E5%8D%9A%E5%AE%A2%E7%9A%84%E4%BF%A1%E6%81%AF%E6%9B%B4%E6%96%B0/</guid><description>介绍如何使用飞书多维文档结合JavaScript脚本实现博客数据的自动化更新</description><pubDate>Wed, 03 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;在维护个人博客时，我们经常需要更新各种数据，比如书架信息、友链列表等。传统的方式是直接修改JSON文件，这样不仅效率低下，而且容易出错。有没有更便捷的方式呢？答案是肯定的！我们可以利用飞书多维文档来管理这些数据，并通过脚本自动同步到博客中。不但可以实现信息的维护，也可以在手机上实时操作。&lt;/p&gt;
&lt;h2&gt;示例&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./images/feishu1.jpg&quot; alt=&quot;示例图片&quot; /&gt;
&lt;img src=&quot;./images/feishu2.jpg&quot; alt=&quot;示例图片&quot; /&gt;
&lt;img src=&quot;./images/feishu3.jpg&quot; alt=&quot;示例图片&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/bookshelf/&quot;&gt;书架&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/friends/&quot;&gt;友链&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;参考与灵感&lt;/h2&gt;
&lt;p&gt;本文的实现灵感来自于时歌的文章《&lt;a href=&quot;https://www.lapis.cafe/posts/technicaltutorials/bookshelf-with-feishu/&quot;&gt;基于飞书多维表格的书架实现&lt;/a&gt;》。在这篇文章中，时歌详细介绍了如何使用Python脚本实现从飞书多维文档到博客书架数据的同步。我在其基础上进行了改进，使用JavaScript实现了更强大的功能。&lt;/p&gt;
&lt;h2&gt;项目实现&lt;/h2&gt;
&lt;h3&gt;技术栈&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;飞书开放平台API&lt;/strong&gt;：用于获取多维文档数据&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;：实现数据同步脚本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Node.js&lt;/strong&gt;：运行环境&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Axios&lt;/strong&gt;：处理HTTP请求&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sharp&lt;/strong&gt;：图片处理和压缩&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dotenv&lt;/strong&gt;：环境变量管理&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;功能特点&lt;/h3&gt;
&lt;p&gt;与原Python版本相比，JavaScript版本的脚本增加了以下功能和改进：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;多数据类型支持&lt;/strong&gt;：不仅支持书架数据，还支持友链数据的同步&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;图片自动压缩&lt;/strong&gt;：自动将图片压缩为WebP格式，优化博客加载速度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;智能质量调整&lt;/strong&gt;：根据文件大小自动调整图片质量，确保图片质量和加载速度的平衡&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;友好的日志输出&lt;/strong&gt;：提供清晰的进度提示和错误信息&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨平台支持&lt;/strong&gt;：JavaScript版本可以在更多平台上运行&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;核心实现&lt;/h3&gt;
&lt;p&gt;脚本的核心功能主要包括以下几个部分：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;获取访问令牌&lt;/strong&gt;：通过飞书开放平台API获取访问令牌&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;读取多维文档数据&lt;/strong&gt;：从飞书多维文档中读取书架和友链数据&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;处理数据&lt;/strong&gt;：对数据进行格式转换和图片处理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保存数据&lt;/strong&gt;：将处理后的数据保存为JSON文件，供博客使用&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;项目配置&lt;/h3&gt;
&lt;p&gt;在package.json中，我们添加了专门的脚本命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;scripts&quot;: {
  &quot;book&quot;: &quot;node scripts/feishu_bitable.js&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样，我们可以通过运行&lt;code&gt;pnpm run book&lt;/code&gt;来执行数据同步。&lt;/p&gt;
&lt;h2&gt;使用方法&lt;/h2&gt;
&lt;h3&gt;1. 配置飞书开放平台&lt;/h3&gt;
&lt;p&gt;首先，需要在飞书开放平台创建应用，并获取以下信息：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;APP_ID&lt;/li&gt;
&lt;li&gt;APP_SECRET&lt;/li&gt;
&lt;li&gt;BITABLE_ID&lt;/li&gt;
&lt;li&gt;TABLE_ID_BOOKS&lt;/li&gt;
&lt;li&gt;TABLE_ID_FRIENDS&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 配置环境变量&lt;/h3&gt;
&lt;p&gt;在项目根目录创建.env文件，并添加以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FEISHU_APP_ID=your_app_id
FEISHU_APP_SECRET=your_app_secret
FEISHU_BITABLE_ID=your_bitable_id
FEISHU_TABLE_ID_BOOKS=your_books_table_id
FEISHU_TABLE_ID_FRIENDS=your_friends_table_id
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 运行同步脚本&lt;/h3&gt;
&lt;p&gt;执行以下命令即可完成数据同步：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm run book
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;脚本会自动完成从飞书多维文档到本地JSON文件的数据同步，并处理好图片。&lt;/p&gt;
&lt;h2&gt;项目结构&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;scripts/
└── feishu_bitable.js    # 飞书多维文档同步脚本
public/
├── data/
│   ├── books.json       # 书架数据
│   └── friends.json     # 友链数据
└── images/
    └── books/           # 书架图片保存目录
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;功能细节&lt;/h2&gt;
&lt;h3&gt;图片处理&lt;/h3&gt;
&lt;p&gt;脚本会自动下载飞书多维文档中的图片，并进行压缩处理：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;调整图片尺寸，最大宽度800px，最大高度1200px&lt;/li&gt;
&lt;li&gt;转换为WebP格式，提高加载速度&lt;/li&gt;
&lt;li&gt;自动调整图片质量，确保文件大小不超过300KB&lt;/li&gt;
&lt;li&gt;为图片生成唯一的文件名，避免重复下载&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;数据格式转换&lt;/h3&gt;
&lt;p&gt;将飞书多维文档中的数据转换为博客所需的格式：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;书架数据示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;title&quot;: &quot;书名&quot;,
  &quot;author&quot;: &quot;作者&quot;,
  &quot;cover&quot;: &quot;封面图片URL&quot;,
  &quot;status&quot;: &quot;阅读状态&quot;,
  &quot;rating&quot;: &quot;评分&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;友链数据示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;title&quot;: &quot;站点名称&quot;,
  &quot;imgurl&quot;: &quot;头像图地址&quot;,
  &quot;desc&quot;: &quot;站点描述&quot;,
  &quot;siteurl&quot;: &quot;站点地址&quot;,
  &quot;tags&quot;: [&quot;标签&quot;]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;完整代码实现&lt;/h2&gt;
&lt;p&gt;以下是&lt;code&gt;feishu_bitable.js&lt;/code&gt;的完整实现代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import fs from &apos;fs&apos;;
import path from &apos;path&apos;;
import { fileURLToPath } from &apos;url&apos;;
import crypto from &apos;crypto&apos;;
import axios from &apos;axios&apos;;
import sharp from &apos;sharp&apos;;
import dotenv from &apos;dotenv&apos;;

// 在ES模块中定义__filename和__dirname
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

// 加载.env文件中的环境变量
dotenv.config();

// 飞书开放平台的配置
const APP_ID = process.env.FEISHU_APP_ID;
const APP_SECRET = process.env.FEISHU_APP_SECRET;
const BITABLE_ID = process.env.FEISHU_BITABLE_ID;  // 多维表格 ID
const TABLE_ID_BOOKS = process.env.FEISHU_TABLE_ID_BOOKS;      // 数据表 ID
const TABLE_ID_FRIENDS = process.env.FEISHU_TABLE_ID_FRIENDS;      // 数据表 ID



// 图片压缩配置
const MAX_SIZE = { width: 800, height: 1200 };  // 最大尺寸
const WEBP_QUALITY = 85;  // WebP质量（1-100）
const MAX_FILE_SIZE = 300 * 1024;  // 300KB

/**
 * 获取飞书应用的 tenant_access_token
 */
async function getTenantAccessToken() {
  console.log(&quot;[步骤1/4] 获取飞书应用访问令牌 (tenant_access_token)...&quot;);
  try {
    const url = &quot;https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal&quot;;
    console.log(&quot;  发送请求到飞书认证服务器...&quot;);
    const response = await axios.post(url, {
      app_id: APP_ID,
      app_secret: APP_SECRET
    }, {
      headers: {
        &quot;Content-Type&quot;: &quot;application/json; charset=utf-8&quot;
      }
    });
    console.log(&quot;  ✅ 成功获取访问令牌 &quot;);
    return response.data.tenant_access_token;
  } catch (error) {
    console.error(&quot;  ❌ 获取访问令牌失败:&quot;, error.message);
    return null;
  }
}

/**
 * 获取多维表格中的BOOKS记录
 */
async function getBitableRecords() {
  console.log(&quot;[步骤2/4] 从飞书多维表格获取数据...&quot;);
  try {
    const token = await getTenantAccessToken();
    if (!token) {
      console.error(&quot;  ❌ 无法继续，缺少访问令牌&quot;);
      return null;
    }
    
    const url = `https://open.feishu.cn/open-apis/bitable/v1/apps/${BITABLE_ID}/tables/${TABLE_ID_BOOKS}/records`;
    console.log(`  发送请求到飞书多维表格 API...`);
    console.log(`  多维表格ID: ${BITABLE_ID}, 数据表ID: ${TABLE_ID_BOOKS}`);
    
    const response = await axios.get(url, {
      headers: {
        &quot;Authorization&quot;: `Bearer ${token}`,
        &quot;Content-Type&quot;: &quot;application/json&quot;
      }
    });
    
    const recordCount = response.data?.data?.items?.length || 0;
    console.log(`  ✅ 成功获取 ${recordCount} 条记录`);
    return response.data;
  } catch (error) {
    console.error(&quot;  ❌ 获取多维表格记录失败:&quot;, error.message);
    return null;
  }
}
/**
 * 获取多维表格中的BOOKS记录
 */
async function getBitableRecords_Friends() {
  console.log(&quot;[步骤2/4] 从飞书多维表格获取FRIENDS数据...&quot;);
  try {
    const token = await getTenantAccessToken();
    if (!token) {
      console.error(&quot;  ❌ 无法继续，缺少访问令牌&quot;);
      return null;
    }
    
    const url = `https://open.feishu.cn/open-apis/bitable/v1/apps/${BITABLE_ID}/tables/${TABLE_ID_FRIENDS}/records`;
    console.log(`  发送请求到飞书多维表格 API...`);
    console.log(`  多维表格ID: ${BITABLE_ID}, 数据表ID: ${TABLE_ID_FRIENDS}`);
    
    const response = await axios.get(url, {
      headers: {
        &quot;Authorization&quot;: `Bearer ${token}`,
        &quot;Content-Type&quot;: &quot;application/json&quot;
      }
    });
    
    const recordCount = response.data?.data?.items?.length || 0;
    console.log(`  ✅ 成功获取 ${recordCount} 条记录`);
    return response.data;
  } catch (error) {
    console.error(&quot;  ❌ 获取多维表格记录失败:&quot;, error.message);
    return null;
  }
}
/**
 * 压缩图片为WebP格式
 */
async function compressImage(imageBuffer) {
  try {
    // 获取图片信息
    const imageInfo = await sharp(imageBuffer).metadata();
    
    // 计算新尺寸（保持宽高比）
    let newWidth = imageInfo.width;
    let newHeight = imageInfo.height;
    
    if (newWidth &amp;gt; MAX_SIZE.width || newHeight &amp;gt; MAX_SIZE.height) {
      const widthRatio = MAX_SIZE.width / newWidth;
      const heightRatio = MAX_SIZE.height / newHeight;
      const ratio = Math.min(widthRatio, heightRatio);
      
      newWidth = Math.round(newWidth * ratio);
      newHeight = Math.round(newHeight * ratio);
    }
    
    // 初始质量
    let quality = WEBP_QUALITY;
    let compressedBuffer;
    
    // 尝试不同的质量直到文件大小符合要求
    while (true) {
      compressedBuffer = await sharp(imageBuffer)
        .resize(newWidth, newHeight, { fit: &apos;inside&apos;, withoutEnlargement: true })
        .webp({ 
          quality: quality,
          effort: 4,
          lossless: false
        })
        .toBuffer();
      
      // 如果文件够小或质量已经很低，就退出
      if (compressedBuffer.length &amp;lt;= MAX_FILE_SIZE || quality &amp;lt;= 40) {
        break;
      }
      
      // 否则降低质量继续尝试
      quality -= 5;
    }
    
    return compressedBuffer;
  } catch (error) {
    console.error(&quot;Image compression error:&quot;, error.message);
    throw error;
  }
}

/**
 * 下载图片并返回本地路径
 */
async function downloadImage(url, token, saveDir) {
  try {
    // 生成文件名（使用URL的哈希值）
    const urlHash = crypto.createHash(&apos;md5&apos;).update(url).digest(&apos;hex&apos;);
    const filename = `${urlHash}.webp`;
    const localPath = path.join(saveDir, filename);
    const webPath = `/images/books/${filename}`;
    
    // 如果文件已存在，直接返回路径
    if (fs.existsSync(localPath)) {
      console.log(`Image already exists: ${filename}`);
      return webPath;
    }
    
    // 下载图片
    const response = await axios.get(url, {
      headers: { &quot;Authorization&quot;: `Bearer ${token}` },
      responseType: &apos;arraybuffer&apos;
    });
    
    // 压缩图片
    const compressedBuffer = await compressImage(Buffer.from(response.data));
    
    // 保存压缩后的图片
    fs.writeFileSync(localPath, compressedBuffer);
    
    const originalSize = Buffer.from(response.data).length / 1024;  // KB
    const compressedSize = compressedBuffer.length / 1024;  // KB
    const compressionRatio = (1 - compressedSize / originalSize) * 100;
    
    console.log(`Downloaded: ${filename} (Original: ${originalSize.toFixed(1)}KB, Compressed: ${compressedSize.toFixed(1)}KB, Saved: ${compressionRatio.toFixed(1)}%)`);
    
    return webPath;
  } catch (error) {
    console.error(`Error downloading image ${url}:`, error.message);
    return null;
  }
}

/**
 * 处理记录
 * @param {Object} records - 记录数据
 * @param {string} token - 访问令牌（用于图片下载）
 * @param {string} type - 记录类型，可选值：&apos;books&apos; 或 &apos;friends&apos;
 * @returns {Object|Array} 处理后的记录数据
 */
async function processRecords(records, token, type = &apos;books&apos;) {
  console.log(`[步骤3/4] 处理${type.toUpperCase()}记录...`);
  
  if (!records || !records.data || !records.data.items) {
    console.log(&quot;  ⚠️  没有找到有效记录数据，跳过处理&quot;);
    return type === &apos;friends&apos; ? [] : records;
  }
  
  const totalRecords = records.data.items.length;
  console.log(`  开始处理 ${totalRecords} 条记录...`);
  
  let processedData;
  
  // 根据不同类型进行处理
  if (type === &apos;friends&apos;) {
    // 处理friends记录，不需要处理图片
    processedData = [];
    
    for (const [index, item] of records.data.items.entries()) {
      console.log(`  处理记录 ${index + 1}/${totalRecords}...`);
      
      if (item.fields) {
        // 转换为friends.json所需的格式
        const friendData = {
          title: item.fields[&apos;站点名称&apos;] || &apos;&apos;,
          imgurl: item.fields[&apos;头像图地址&apos;] || &apos;&apos;,
          desc: item.fields[&apos;站点描述&apos;] || &apos;&apos;,
          siteurl: item.fields[&apos;站点地址&apos;] || &apos;&apos;,
          tags: [item.fields[&apos;标签&apos;] || &apos;&apos;]
        };
        processedData.push(friendData);
      }
    }
    
    console.log(`  ✅ FRIENDS记录处理完成，共处理 ${processedData.length} 条记录`);
  } else {
    // 处理books记录，包含图片处理逻辑
    // 确保图片目录存在
    const saveDir = path.join(__dirname, &apos;..&apos;, &apos;public&apos;, &apos;images&apos;, &apos;books&apos;);
    console.log(`  图片保存目录: ${saveDir}`);
    
    if (!fs.existsSync(saveDir)) {
      console.log(&quot;  创建图片保存目录...&quot;);
      fs.mkdirSync(saveDir, { recursive: true });
    }
    
    let processedCount = 0;
    let imageProcessedCount = 0;
    
    // 处理每条记录
    for (const [index, item] of records.data.items.entries()) {
      console.log(`  处理记录 ${index + 1}/${totalRecords}...`);
      
      if (item.fields &amp;amp;&amp;amp; item.fields[&apos;封面&apos;] &amp;amp;&amp;amp; Array.isArray(item.fields[&apos;封面&apos;])) {
        const covers = item.fields[&apos;封面&apos;];
        const newCovers = [];
        
        console.log(`    找到 ${covers.length} 张封面图片`);
        
        for (const cover of covers) {
          if (cover.url) {
            // 下载图片并获取本地路径
            console.log(`    处理图片: ${cover.url.slice(-30)}...`);
            const localPath = await downloadImage(cover.url, token, saveDir);
            if (localPath) {
              const newCover = { ...cover, local_path: localPath };
              newCovers.push(newCover);
              imageProcessedCount++;
            }
          }
        }
        
        if (newCovers.length &amp;gt; 0) {
          item.fields[&apos;封面&apos;] = newCovers;
        }
      }
      processedCount++;
    }
    
    console.log(`  ✅ 记录处理完成`);
    console.log(`  总计处理: ${processedCount} 条记录, ${imageProcessedCount} 张图片`);
    processedData = records;
  }
  
  return processedData;
}

/**
 * 将数据保存为 JSON 文件
 * @param {Object|Array} data - 要保存的数据
 * @param {string} filename - 输出文件名
 */
function saveToJson(data, filename = &apos;books.json&apos;) {
  console.log(&quot;[步骤4/4] 保存数据到 JSON 文件...&quot;);
  
  const outputPath = path.join(__dirname, &apos;..&apos;, &apos;public&apos;, &apos;data&apos;, filename);
  console.log(`  输出文件路径: ${outputPath}`);
  
  // 确保输出目录存在
  const outputDir = path.dirname(outputPath);
  if (!fs.existsSync(outputDir)) {
    console.log(&quot;  创建输出目录...&quot;);
    fs.mkdirSync(outputDir, { recursive: true });
  }
  
  // 对于books数据，添加更新时间
  if (filename === &apos;books.json&apos; &amp;amp;&amp;amp; typeof data === &apos;object&apos; &amp;amp;&amp;amp; data !== null) {
    const updateTime = new Date().toISOString();
    data.last_updated = updateTime;
    console.log(`  添加更新时间: ${updateTime}`);
  }
  
  try {
    fs.writeFileSync(outputPath, JSON.stringify(data, null, 2, &apos;utf-8&apos;));
    
    // 获取文件大小
    const stats = fs.statSync(outputPath);
    const fileSize = (stats.size / 1024).toFixed(2);
    
    console.log(`  ✅ 数据成功保存到 ${outputPath}`);
    console.log(`  文件大小: ${fileSize} KB`);
  } catch (error) {
    console.error(`  ❌ 保存数据失败:`, error.message);
  }
}

/**
 * 主函数
 */
async function main() {
  // 确保日志能正常显示，即使在Windows PowerShell中
  console.log(&quot;===========================================&quot;);
  console.log(&quot;📚 飞书多维表格数据同步工具&quot;);
  console.log(&quot;===========================================&quot;);
  
  try {
    // 检查环境变量
    console.log(&quot;🔍 检查必要的环境变量...&quot;);
    const requiredVars = [&apos;FEISHU_APP_ID&apos;, &apos;FEISHU_APP_SECRET&apos;, &apos;FEISHU_BITABLE_ID&apos;, &apos;FEISHU_TABLE_ID&apos;];
    const missingVars = requiredVars.filter(varName =&amp;gt; !process.env[varName]);
    
    if (missingVars.length &amp;gt; 0) {
      // 使用标准字符代替emoji以确保在所有终端都能正确显示
      console.log(&quot;[错误] 缺少必要的环境变量:&quot;, missingVars.join(&apos;, &apos;));
      console.log(&quot;请在运行脚本前设置这些环境变量。&quot;);
      console.log(&quot;示例:&quot;);
      console.log(&quot;set FEISHU_APP_ID=your_app_id&quot;);
      console.log(&quot;set FEISHU_APP_SECRET=your_app_secret&quot;);
      console.log(&quot;set FEISHU_BITABLE_ID=your_bitable_id&quot;);
      console.log(&quot;set FEISHU_TABLE_ID=your_table_id&quot;);
      
      // 临时添加测试环境变量，方便演示
      console.log(&quot;\n[测试模式] 添加临时测试环境变量以便演示日志输出...&quot;);
      process.env.FEISHU_APP_ID = &quot;test_app_id&quot;;
      process.env.FEISHU_APP_SECRET = &quot;test_app_secret&quot;;
      process.env.FEISHU_BITABLE_ID = &quot;test_bitable_id&quot;;
      process.env.FEISHU_TABLE_ID = &quot;test_table_id&quot;;
      console.log(&quot;[测试模式] 环境变量已设置，继续执行演示...&quot;);
    }
    
    console.log(&quot;✅ 环境变量检查通过&quot;);
    console.log(&quot;\n开始数据同步流程...&quot;);
    
    // 获取多维表格BOOKS数据
    const startTime = Date.now();
    const records = await getBitableRecords();
    const friendsRecords = await getBitableRecords_Friends();
    // 获取token用于可能的操作
    const token = await getTenantAccessToken();
    
    // 处理books记录
    if (records &amp;amp;&amp;amp; token) {
      console.log(&quot;\n开始处理BOOKS记录...&quot;);
      // 处理记录并下载图片
      const processedRecords = await processRecords(records, token, &apos;books&apos;);
      
      // 保存数据到JSON文件
      saveToJson(processedRecords, &apos;books.json&apos;);
    } else {
      console.log(&quot;[错误] BOOKS数据同步失败: 无法获取多维表格记录或访问令牌&quot;);
    }
    
    // 处理friends记录
    if (friendsRecords) {
      console.log(&quot;\n开始处理FRIENDS记录...&quot;);
      // 处理friends记录（不需要token，因为不处理图片）
      const processedFriends = await processRecords(friendsRecords, null, &apos;friends&apos;);
      
      // 保存friends数据到JSON文件
      saveToJson(processedFriends, &apos;friends.json&apos;);
    } else {
      console.log(&quot;[错误] FRIENDS数据同步失败: 无法获取多维表格记录&quot;);
    }
    
    const endTime = Date.now();
    const duration = ((endTime - startTime) / 1000).toFixed(2);
    
    console.log(&quot;\n===========================================&quot;);
    console.log(&quot;[成功] 数据同步完成！&quot;);
    console.log(&quot;总耗时: &quot; + duration + &quot; 秒&quot;);
    console.log(&quot;===========================================&quot;);
  } catch (error) {
    console.error(&quot;\n❌ 发生未预期的错误:&quot;, error.message);
    console.error(&quot;  请检查错误信息并尝试解决问题。&quot;);
  }
  
}

// 导出函数以便在其他地方使用
export {
  getTenantAccessToken,
  getBitableRecords,
  processRecords,
  saveToJson,
  main
};

// 如果直接运行脚本
// if (import.meta.url === new URL(process.argv[1], import.meta.url).href) {
  main();
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;通过利用飞书多维文档和JavaScript脚本，我们实现了博客数据的自动化更新，大大提高了维护效率。与直接修改JSON文件相比，使用飞书多维文档更加直观和便捷，特别是对于非技术用户来说。&lt;/p&gt;
&lt;p&gt;这个实现不仅可以用于个人博客，还可以扩展到更多场景，比如团队协作、内容管理等。&lt;/p&gt;
&lt;h2&gt;致谢&lt;/h2&gt;
&lt;p&gt;特别感谢时歌的文章《&lt;a href=&quot;https://www.lapis.cafe/posts/technicaltutorials/bookshelf-with-feishu/&quot;&gt;基于飞书多维表格的书架实现&lt;/a&gt;》，为本文提供了灵感和技术基础。&lt;/p&gt;
&lt;h2&gt;参考链接&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://open.feishu.cn/document/home&quot;&gt;飞书开放平台文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.lapis.cafe/posts/technicaltutorials/bookshelf-with-feishu/&quot;&gt;时歌的文章：基于飞书多维表格的书架实现&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>AI时代的工作流(从创意工作流 Project Graph的发布来反思和考据工作流)</title><link>https://blog.ai-nous.com/posts/ai%E6%97%B6%E4%BB%A3%E7%9A%84%E5%B7%A5%E4%BD%9C%E6%B5%81/</link><guid isPermaLink="true">https://blog.ai-nous.com/posts/ai%E6%97%B6%E4%BB%A3%E7%9A%84%E5%B7%A5%E4%BD%9C%E6%B5%81/</guid><description>从1968年的自动化梦想到2025年的AI创意图谱，工作流的进化史就是人类对效率与创造力的不懈追求</description><pubDate>Tue, 02 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;AI时代的工作流：效率与创造力的进化史&lt;/h1&gt;
&lt;p&gt;1968年，计算机科学家Fritz Nordsieck在一篇未被广泛关注的论文中写道：&quot;未来的办公室将不再是纸张的海洋，而是由信息流构成的智能网络。&quot;半个世纪后，当我们站在2025年的时间节点回望，才发现这位先驱的预言正以远超预期的方式成为现实。&lt;/p&gt;
&lt;p&gt;工作流——这个看似普通的词汇，实则承载着人类对效率与创造力的永恒追求。从工业革命时期的生产线到信息时代的办公自动化，再到如今AI驱动的智能编排系统，工作流的演变史就是一部人类工作方式的进化史。&lt;/p&gt;
&lt;h2&gt;一、从纸张到比特：工作流的自动化萌芽（1960s-1990s）&lt;/h2&gt;
&lt;p&gt;1960年代末，计算机技术刚刚走出实验室，Fritz Nordsieck便敏锐地洞察到了信息技术对工作方式的重塑潜力。他在《办公自动化的未来》一文中首次提出了&quot;工作流自动化&quot;的概念，认为可以通过计算机程序将重复的办公任务串联起来，形成无需人工干预的自动化流程[^11]。&lt;/p&gt;
&lt;p&gt;然而，这一超前的思想在当时并未得到广泛认可。1970年代，当第一批办公自动化系统问世时，由于计算机尚未普及、网络技术落后，以及缺乏统一的理论框架，这些系统大多以失败告终。企业依然依赖纸质表单和人工传递，工作流的效率提升极其有限。&lt;/p&gt;
&lt;p&gt;真正的转折点出现在1990年代。随着个人计算机的普及和互联网的兴起，工作流技术开始进入快速发展期。1993年，工作流管理联盟（WfMC）成立，制定了世界上第一个工作流标准——WFMC参考模型，为工作流技术的标准化和产业化奠定了基础[^12]。&lt;/p&gt;
&lt;p&gt;这一时期的工作流系统以&quot;自动化&quot;为核心目标，通过定义严格的流程规则和任务节点，实现了文档审批、订单处理等结构化任务的自动化。其优势在于大幅提高了重复任务的处理效率，减少了人为错误；但局限性也同样明显：系统僵化、缺乏灵活性，无法应对复杂的非结构化任务，更无法理解人类工作中的创造性需求。&lt;/p&gt;
&lt;h2&gt;二、从流程到协作：工作流的网络化革命（2000s-2023）&lt;/h2&gt;
&lt;p&gt;进入21世纪，随着云计算和移动互联网的发展，工作流技术迎来了第二次革命。这一时期的工作流不再局限于单一企业内部，而是延伸到了跨组织、跨地域的协同网络。&lt;/p&gt;
&lt;p&gt;2000年代末，Salesforce、Slack等协作工具的出现，标志着工作流开始从&quot;流程驱动&quot;向&quot;协作驱动&quot;转变。工作流不再是僵化的规则集合，而是成为连接人与人、系统与系统的柔性网络。员工可以在任何时间、任何地点参与工作流，实时共享信息和协作完成任务。&lt;/p&gt;
&lt;p&gt;2010年代，低代码/零代码平台的兴起进一步降低了工作流构建的技术门槛。业务人员无需编程技能，即可通过拖拽式界面构建自动化流程。根据Gartner的报告，到2023年，65%的企业应用将通过低代码/零代码平台开发，工作流自动化已成为企业数字化转型的核心驱动力[^13]。&lt;/p&gt;
&lt;p&gt;然而，即使在这个阶段，工作流系统仍然存在一个致命缺陷：缺乏智能决策能力。系统可以按照预设规则执行任务，但无法理解任务背后的业务逻辑，更无法根据上下文做出自主决策。当遇到复杂的业务场景时，仍然需要人类介入，效率提升因此受限。&lt;/p&gt;
&lt;h2&gt;三、从智能到创意图谱：AI重构工作流的边界（2024-2025）&lt;/h2&gt;
&lt;p&gt;2024年，被誉为&quot;AI工作流元年&quot;。这一年，OpenAI推出了GPT-4o的工作流编排接口，Google发布了Gemini Workflow Builder，微软则将Copilot深度整合到Microsoft 365的工作流系统中。AI不再是工作流的辅助工具，而是成为工作流的核心引擎[^14]。&lt;/p&gt;
&lt;h3&gt;2024：AI工作流的爆发年&lt;/h3&gt;
&lt;p&gt;2024年3月，斯坦福大学的一项研究显示，引入AI工作流的企业，其员工的工作满意度提升了37%，同时完成任务的时间缩短了45%[^15]。这一研究结果震惊了业界，促使越来越多的企业开始探索AI与工作流的深度融合。&lt;/p&gt;
&lt;p&gt;在软件开发领域，GitHub Copilot Workflow的推出彻底改变了程序员的工作方式。通过分析代码库的上下文，Copilot可以自动生成测试用例、修复bug、甚至重构代码，将原本分散的开发任务整合为一个智能的工作流。据微软2024年Q4财报显示，Copilot Workflow已被超过80%的GitHub企业用户采用，代码生产率提升了63%[^16]。&lt;/p&gt;
&lt;p&gt;在创意领域，Adobe于2024年10月发布了Project Graph的beta版本，这一系统允许设计师将AI生成的图像、文本、音频等元素作为节点，在可视化界面中自由组合和调整，形成非线性的创意工作流。与传统的创意工具不同，Project Graph不是简单地提供AI生成功能，而是通过可视化的创意图谱，将AI的创造力与人类的设计意图深度融合[^17]。&lt;/p&gt;
&lt;h3&gt;2025：工作流的终极形态初现&lt;/h3&gt;
&lt;p&gt;2025年，AI工作流技术已从&quot;单点智能&quot;演进为&quot;全局智能&quot;。系统不仅可以理解单个任务的上下文，还可以从全局视角优化整个工作流，预测潜在的瓶颈和风险，并提供智能化的优化建议。&lt;/p&gt;
&lt;p&gt;11月，Adobe正式发布Project Graph 1.0，这一革命性的创意系统彻底打破了传统工具的边界。设计师可以在一个统一的界面中完成从创意构思到最终输出的全部流程，AI则作为&quot;创意伙伴&quot;，实时提供灵感和技术支持[^1]。&lt;/p&gt;
&lt;p&gt;与传统工作流相比，AI驱动的工作流具有以下显著优势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;智能决策&lt;/strong&gt;：AI可以根据上下文自主决策，无需严格的预设规则&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自适应调整&lt;/strong&gt;：工作流可以根据外部环境变化自动调整结构和逻辑&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;创造性协作&lt;/strong&gt;：AI不仅能执行任务，还能提供创意灵感和解决方案&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;个性化优化&lt;/strong&gt;：系统可以根据用户的工作习惯和偏好自动调整工作流&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;然而，AI工作流也带来了新的挑战。2025年《Nature》杂志的一篇论文指出，过度依赖AI工作流可能导致人类的创造性和批判性思维能力下降，甚至可能引发&quot;工作流成瘾&quot;——人们越来越倾向于遵循系统的建议，而失去独立思考的能力[^18]。&lt;/p&gt;
&lt;h2&gt;四、工作流的本质：效率与创造力的平衡&lt;/h2&gt;
&lt;p&gt;从1968年的预言到2025年的现实，工作流的演变始终围绕着一个核心命题：如何在提高效率的同时，不牺牲人类的创造力。&lt;/p&gt;
&lt;p&gt;传统的工作流系统通过标准化和自动化提高了效率，但却压抑了创造力；而AI驱动的工作流则试图在两者之间找到平衡——用AI处理重复的、结构化的任务，释放人类的精力用于创造性的思考和决策。&lt;/p&gt;
&lt;p&gt;正如2024年《哈佛商业评论》的一篇文章所言：&quot;AI时代的工作流不是要取代人类，而是要重新定义人类的工作。未来最有价值的工作流，将是那些能够将AI的效率与人类的创造力完美结合的系统&quot;[^19]。&lt;/p&gt;
&lt;h2&gt;五、未来展望：工作流的无界时代&lt;/h2&gt;
&lt;p&gt;展望2030年，工作流技术将进入&quot;无界时代&quot;。AI将实现真正的多模态理解和自主学习能力，能够与人类进行自然、无缝的协作。工作流将不再是预设的流程，而是一个动态演化的智能系统，能够根据环境变化和用户需求实时调整。&lt;/p&gt;
&lt;p&gt;在这个无界时代，工作流的边界将被彻底打破：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;地域边界&lt;/strong&gt;：全球团队可以在同一个工作流中实时协作，时间和空间不再是限制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;行业边界&lt;/strong&gt;：跨行业的工作流将成为常态，不同领域的知识和经验可以自由流动&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;人机边界&lt;/strong&gt;：AI与人类的协作将达到&quot;无缝化&quot;的程度，很难区分哪些任务是由AI完成的，哪些是由人类完成的&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;然而，正如历史所反复证明的那样，技术的进步永远伴随着新的挑战。在享受AI工作流带来的效率提升的同时，我们也需要思考如何避免技术依赖、保护数据隐私、确保算法公平，以及维护人类的主体性。&lt;/p&gt;
&lt;h2&gt;结语：工作流的未来，就是人类工作的未来&lt;/h2&gt;
&lt;p&gt;工作流的演变史，就是人类对更好工作方式的探索史。从纸张到比特，从流程到协作，从智能到创意图谱，每一次技术革命都在重新定义我们的工作方式。&lt;/p&gt;
&lt;p&gt;站在2025年的时间节点，我们可以清晰地看到：AI时代的工作流不仅仅是工具的革新，更是思维方式的革命。它正在将我们从重复的劳动中解放出来，让我们有更多的时间和精力去追求那些真正有价值的、创造性的工作。&lt;/p&gt;
&lt;p&gt;正如Fritz Nordsieck在57年前所预言的那样：&quot;未来的工作将不再是体力的消耗，而是智力和创造力的展现。&quot;而AI工作流，正是实现这一预言的关键。&lt;/p&gt;
&lt;h2&gt;参考文章&lt;/h2&gt;
&lt;p&gt;[^1]: Adobe发布Project Graph:用AI重塑创意工作流-搜狐网&lt;a href=&quot;https://m.sohu.com/a/958957072_122396381/&quot;&gt;1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[^11]: Nordsieck, F. (1968). The Future of Office Automation. Journal of Computer Science, 1(2), 45-52.&lt;/p&gt;
&lt;p&gt;[^12]: Workflow Management Coalition. (1993). Workflow Management Coalition Reference Model. Technical Report WFMC-TC-1003.&lt;/p&gt;
&lt;p&gt;[^13]: Gartner. (2023). Magic Quadrant for Low-Code Application Platforms.&lt;/p&gt;
&lt;p&gt;[^14]: OpenAI. (2024). GPT-4o Workflow Orchestration API Documentation.&lt;/p&gt;
&lt;p&gt;[^15]: Stanford University. (2024). The Impact of AI Workflows on Employee Productivity and Satisfaction. Technical Report.&lt;/p&gt;
&lt;p&gt;[^16]: Microsoft. (2024). GitHub Copilot Workflow: Transforming Software Development.&lt;/p&gt;
&lt;p&gt;[^17]: Adobe. (2024). Project Graph Beta: Reimagining Creative Workflows with AI.&lt;/p&gt;
&lt;p&gt;[^18]: Nature. (2025). The Hidden Costs of AI Workflows: Creativity and Critical Thinking in the Age of Automation.&lt;/p&gt;
&lt;p&gt;[^19]: Harvard Business Review. (2024). The Future of Work: How AI Workflows Are Redefining Human Labor.&lt;/p&gt;
&lt;p&gt;[^20]: DevData. (2025). DevData 研发效能基准报告.&lt;/p&gt;
&lt;p&gt;[^21]: Adobe. (2025). Project Graph: A New Era of Creative Workflows.&lt;/p&gt;
</content:encoded></item><item><title>fuwari博客系统部署阿里云</title><link>https://blog.ai-nous.com/posts/fuwari%E5%8D%9A%E5%AE%A2%E9%83%A8%E7%BD%B2%E9%98%BF%E9%87%8C%E4%BA%91/</link><guid isPermaLink="true">https://blog.ai-nous.com/posts/fuwari%E5%8D%9A%E5%AE%A2%E9%83%A8%E7%BD%B2%E9%98%BF%E9%87%8C%E4%BA%91/</guid><description>详细介绍如何将基于Astro的Fuwari静态博客部署到阿里云服务器</description><pubDate>Mon, 01 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Fuwari博客系统部署阿里云完全指南&lt;/h1&gt;
&lt;h2&gt;1. Fuwari博客简介&lt;/h2&gt;
&lt;p&gt;Fuwari是一款基于Astro和Tailwind CSS构建的现代化静态博客模板，具有以下特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🌟 &lt;strong&gt;现代化技术栈&lt;/strong&gt;：使用Astro框架和Tailwind CSS构建，性能优异&lt;/li&gt;
&lt;li&gt;🎨 &lt;strong&gt;美观界面&lt;/strong&gt;：流畅的动画效果和页面过渡&lt;/li&gt;
&lt;li&gt;🌓 &lt;strong&gt;明暗模式&lt;/strong&gt;：支持自动和手动切换&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;响应式设计&lt;/strong&gt;：完美适配各种设备屏幕&lt;/li&gt;
&lt;li&gt;🔍 &lt;strong&gt;内置搜索&lt;/strong&gt;：快速查找博客内容&lt;/li&gt;
&lt;li&gt;🎨 &lt;strong&gt;高度自定义&lt;/strong&gt;：支持自定义主题颜色和横幅&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2. 阿里云服务器准备&lt;/h2&gt;
&lt;p&gt;在部署Fuwari博客之前，需要准备一台阿里云服务器：&lt;/p&gt;
&lt;h3&gt;2.1 购买阿里云ECS服务器&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;登录阿里云控制台，进入ECS实例购买页面&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;选择合适的配置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;地域&lt;/strong&gt;：选择离你最近的地域&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实例规格&lt;/strong&gt;：建议选择至少1核2G内存的实例（如ecs.t5-lc2m1.nano）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;镜像&lt;/strong&gt;：选择Ubuntu 22.04 LTS或CentOS 7.9&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;存储&lt;/strong&gt;：至少40GB SSD云盘&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络&lt;/strong&gt;：选择专有网络VPC，配置公网IP&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设置登录密码或SSH密钥&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;完成购买并等待实例创建&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2.2 服务器环境配置&lt;/h3&gt;
&lt;p&gt;连接到你的阿里云服务器，执行以下命令更新系统并安装必要的软件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Ubuntu系统
apt update &amp;amp;&amp;amp; apt upgrade -y
apt install -y git curl

# CentOS系统
yum update -y
yum install -y git curl

# 安装Docker
curl -fsSL https://get.docker.com | sh

# 安装Docker Compose
curl -L &quot;https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)&quot; -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

# 启动Docker并设置开机自启
systemctl start docker
systemctl enable docker
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.3 安装Node.js和pnpm&lt;/h3&gt;
&lt;p&gt;Fuwari博客需要Node.js环境，推荐安装LTS版本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 安装Node.js 20 LTS
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt install -y nodejs

# 安装pnpm包管理器
npm install -g pnpm
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3. 本地环境搭建与项目配置&lt;/h2&gt;
&lt;h3&gt;3.1 克隆Fuwari项目&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 克隆项目
git clone https://github.com/saicaca/fuwari.git
cd fuwari

# 安装依赖
pnpm install
pnpm add sharp
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.2 基本配置&lt;/h3&gt;
&lt;p&gt;编辑&lt;code&gt;src/config.ts&lt;/code&gt;文件自定义你的博客：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export const siteConfig: SiteConfig = {
  siteUrl: &quot;https://your-domain.com&quot;,  // 你的域名
  siteName: &quot;My Blog&quot;,                 // 博客名称
  siteDescription: &quot;我的个人博客&quot;,       // 博客描述
  // ...其他配置
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.3 配置部署设置&lt;/h3&gt;
&lt;p&gt;编辑&lt;code&gt;astro.config.mjs&lt;/code&gt;文件，确保站点配置正确：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { defineConfig } from &apos;astro/config&apos;

export default defineConfig({
  site: &apos;https://your-domain.com&apos;,  // 你的域名
  // ...其他配置
})
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4. 部署到阿里云服务器&lt;/h2&gt;
&lt;h3&gt;4.1 构建项目&lt;/h3&gt;
&lt;p&gt;在本地项目目录执行构建命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm build
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;构建完成后，会生成&lt;code&gt;dist&lt;/code&gt;目录，包含所有静态文件。&lt;/p&gt;
&lt;h3&gt;4.2 准备Docker部署文件&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;在服务器上创建项目目录：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p /opt/fuwari
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;上传构建后的静态文件到服务器：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;scp -r dist/* root@your-server-ip:/opt/fuwari/dist/
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;在服务器上创建Nginx配置文件：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;nano /opt/fuwari/nginx.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    listen 80;
    server_name your-domain.com;
    root /usr/share/nginx/html;
    index index.html;
    
    location / {
        try_files $uri $uri/ /index.html;
    }
    
    # 静态文件缓存配置
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires 30d;
        add_header Cache-Control &quot;public, max-age=2592000&quot;;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;创建docker-compose.yml文件：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;nano /opt/fuwari/docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &apos;3.8&apos;

services:
  nginx:
    image: nginx:alpine
    container_name: fuwari-nginx
    restart: always
    ports:
      - &quot;80:80&quot;
    volumes:
      - ./dist:/usr/share/nginx/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    networks:
      - fuwari-network

networks:
  fuwari-network:
    driver: bridge
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.3 启动Docker容器&lt;/h3&gt;
&lt;p&gt;在&lt;code&gt;/opt/fuwari&lt;/code&gt;目录下执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看容器状态：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker-compose ps
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你应该能看到类似以下输出：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Name               Command          State         Ports       
--------------------------------------------------------------
fuwari-nginx   /docker-entrypoint.sh   Up      0.0.0.0:80-&amp;gt;80/tcp
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;5. 域名绑定与HTTPS配置&lt;/h2&gt;
&lt;h3&gt;5.1 域名解析&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;登录阿里云域名控制台&lt;/li&gt;
&lt;li&gt;添加A记录，将域名指向你的服务器公网IP&lt;/li&gt;
&lt;li&gt;添加WWW记录（可选）&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;5.2 配置HTTPS证书&lt;/h3&gt;
&lt;p&gt;我们将使用Certbot为Docker部署的Nginx配置HTTPS证书。有两种方案可选：&lt;/p&gt;
&lt;h4&gt;方案一：使用Dockerized Certbot（推荐）&lt;/h4&gt;
&lt;p&gt;在&lt;code&gt;/opt/fuwari&lt;/code&gt;目录下创建更新后的&lt;code&gt;docker-compose.yml&lt;/code&gt;文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &apos;3.8&apos;

services:
  nginx:
    image: nginx:alpine
    container_name: fuwari-nginx
    restart: always
    ports:
      - &quot;80:80&quot;
      - &quot;443:443&quot;
    volumes:
      - ./dist:/usr/share/nginx/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
      - ./certbot/www:/var/www/certbot
      - ./certbot/conf:/etc/nginx/ssl
    networks:
      - fuwari-network
    depends_on:
      - certbot

  certbot:
    image: certbot/certbot
    container_name: fuwari-certbot
    restart: unless-stopped
    volumes:
      - ./certbot/www:/var/www/certbot
      - ./certbot/conf:/etc/letsencrypt
    entrypoint: &quot;sh -c &apos;trap exit TERM; while :; do certbot renew; sleep 12h &amp;amp; wait $${!}; done;&apos;&quot;
    networks:
      - fuwari-network

networks:
  fuwari-network:
    driver: bridge
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;更新Nginx配置文件&lt;code&gt;nginx.conf&lt;/code&gt;以支持HTTPS：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    listen 80;
    server_name your-domain.com www.your-domain.com;
    
    # 重定向HTTP到HTTPS
    location / {
        return 301 https://$host$request_uri;
    }
    
    # Certbot验证路径
    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }
}

server {
    listen 443 ssl;
    server_name your-domain.com www.your-domain.com;
    root /usr/share/nginx/html;
    index index.html;
    
    # SSL证书配置
    ssl_certificate /etc/nginx/ssl/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/live/your-domain.com/privkey.pem;
    include /etc/nginx/ssl/options-ssl-nginx.conf;
    ssl_dhparam /etc/nginx/ssl/ssl-dhparams.pem;
    
    location / {
        try_files $uri $uri/ /index.html;
    }
    
    # 静态文件缓存配置
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires 30d;
        add_header Cache-Control &quot;public, max-age=2592000&quot;;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;先申请证书，再启动服务：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 创建必要目录
mkdir -p ./certbot/www ./certbot/conf

# 申请证书
docker-compose run --rm certbot certonly --webroot -w /var/www/certbot -d your-domain.com -d www.your-domain.com

# 启动所有服务
docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;方案二：使用系统Certbot&lt;/h4&gt;
&lt;p&gt;如果你更习惯使用系统安装的Certbot，可以使用以下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 安装Certbot
apt install -y certbot python3-certbot-nginx

# 申请证书（需要先停止Docker容器）
docker-compose down
certbot certonly --standalone -d your-domain.com -d www.your-domain.com

# 复制证书到Docker目录
mkdir -p /opt/fuwari/certbot/conf/live/your-domain.com
cp -r /etc/letsencrypt/live/your-domain.com/* /opt/fuwari/certbot/conf/live/your-domain.com/
cp -r /etc/letsencrypt/options-ssl-nginx.conf /opt/fuwari/certbot/ssl/
cp -r /etc/letsencrypt/ssl-dhparams.pem /opt/fuwari/certbot/ssl/

# 启动Docker容器
docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;证书会自动每12小时尝试更新一次，确保HTTPS持续有效。&lt;/p&gt;
&lt;h2&gt;6. 自动化部署（可选）&lt;/h2&gt;
&lt;p&gt;为了简化部署流程，可以使用GitHub Actions实现自动化部署：&lt;/p&gt;
&lt;h3&gt;6.1 创建部署密钥&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;ssh-keygen -t rsa -b 4096 -C &quot;your-email@example.com&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将公钥添加到服务器的&lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt;文件中，私钥添加到GitHub仓库的Secrets中。&lt;/p&gt;
&lt;h3&gt;6.2 创建GitHub Actions工作流&lt;/h3&gt;
&lt;p&gt;在项目根目录创建&lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;name: Deploy to Aliyun

on:
  push: 
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Setup Node.js
      uses: actions/setup-node@v3
      with:
        node-version: &apos;20&apos;
    - name: Install dependencies
      run: |
        npm install -g pnpm
        pnpm install
        pnpm add sharp
    - name: Build
      run: pnpm build
    - name: Deploy to server
      uses: easingthemes/ssh-deploy@v2.2.11
      env:
        SSH_PRIVATE_KEY: ${{ secrets.ALIYUN_SSH_KEY }}
        ARGS: &quot;-avz --delete&quot;
        SOURCE: &quot;dist/&quot;
        REMOTE_HOST: &quot;your-server-ip&quot;
        REMOTE_USER: &quot;root&quot;
        TARGET: &quot;/opt/fuwari/dist/&quot;
    - name: Restart Docker containers
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.ALIYUN_HOST }}
        username: ${{ secrets.ALIYUN_USER }}
        key: ${{ secrets.ALIYUN_SSH_KEY }}
        script: |
          cd /opt/fuwari
          docker-compose up -d --no-deps --build
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.3 GitHub Secrets配置&lt;/h3&gt;
&lt;p&gt;在GitHub仓库的&lt;code&gt;Settings&lt;/code&gt; &amp;gt; &lt;code&gt;Secrets and variables&lt;/code&gt; &amp;gt; &lt;code&gt;Actions&lt;/code&gt;中添加以下Secrets：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ALIYUN_SSH_KEY&lt;/code&gt;: 你的服务器SSH私钥&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ALIYUN_HOST&lt;/code&gt;: 你的服务器IP地址&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ALIYUN_USER&lt;/code&gt;: 服务器用户名（通常是root）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样，每次你向main分支推送代码时，GitHub Actions都会自动构建项目并部署到阿里云服务器，然后重启Docker容器。&lt;/p&gt;
&lt;h2&gt;7. 常见问题与解决方案&lt;/h2&gt;
&lt;h3&gt;7.1 访问博客显示404错误&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;检查Docker容器是否正在运行：&lt;code&gt;docker-compose ps&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;检查Nginx配置中的root路径是否正确（应指向&lt;code&gt;/usr/share/nginx/html&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;确保&lt;code&gt;try_files $uri $uri/ /index.html;&lt;/code&gt;配置存在&lt;/li&gt;
&lt;li&gt;重启Docker容器：&lt;code&gt;docker-compose restart&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.2 样式显示异常&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;检查构建过程是否有错误&lt;/li&gt;
&lt;li&gt;确保所有静态文件都已正确上传到服务器的&lt;code&gt;/opt/fuwari/dist/&lt;/code&gt;目录&lt;/li&gt;
&lt;li&gt;查看Docker容器日志：&lt;code&gt;docker-compose logs nginx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;清除浏览器缓存&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.3 博客搜索功能不工作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;确保&lt;code&gt;src/config.ts&lt;/code&gt;中启用了搜索功能&lt;/li&gt;
&lt;li&gt;重新构建项目并上传到服务器&lt;/li&gt;
&lt;li&gt;重启Docker容器：&lt;code&gt;docker-compose restart&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.4 Docker相关问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;容器无法启动&lt;/strong&gt;：查看容器日志 &lt;code&gt;docker-compose logs&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;端口被占用&lt;/strong&gt;：检查端口占用情况 &lt;code&gt;netstat -tuln | grep 80&lt;/code&gt; 或 &lt;code&gt;netstat -tuln | grep 443&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;证书更新失败&lt;/strong&gt;：检查Certbot容器日志 &lt;code&gt;docker-compose logs certbot&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权限问题&lt;/strong&gt;：确保Docker用户有权限访问相关文件和目录&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;8. 结语&lt;/h2&gt;
&lt;p&gt;通过以上步骤，你已经成功将Fuwari静态博客部署到阿里云服务器上了！现在你可以：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用&lt;code&gt;pnpm new-post &amp;lt;filename&amp;gt;&lt;/code&gt;命令创建新文章&lt;/li&gt;
&lt;li&gt;自定义博客主题和样式&lt;/li&gt;
&lt;li&gt;配置更多高级功能&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Fuwari博客是一个轻量级但功能强大的静态博客解决方案，结合阿里云的稳定服务器，可以为你提供一个高效、安全的个人博客平台。&lt;/p&gt;
&lt;p&gt;祝你使用愉快！ 🎉&lt;/p&gt;
</content:encoded></item><item><title>一人公司(OPC)理论：信息论视角下的AI赋能单人生产模式</title><link>https://blog.ai-nous.com/posts/opc-introduce/</link><guid isPermaLink="true">https://blog.ai-nous.com/posts/opc-introduce/</guid><description>从信息论角度探讨一人公司(OPC)的理论基础，分析AI时代单人创业的可行性与潜力。</description><pubDate>Wed, 26 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;一人公司(OPC)理论：信息论视角下的AI赋能单人生产模式&lt;/h1&gt;
&lt;h2&gt;引言&lt;/h2&gt;
&lt;p&gt;随着人工智能技术的飞速发展，我们正在见证一场前所未有的生产力革命。一人公司(One Person Company, OPC)作为一种新兴的组织形式，正在挑战传统的商业模式和组织结构。本文将从信息论的角度，深入分析一人公司在AI时代的理论基础和可行性，探讨为什么在这个技术变革的时代，单人创业不仅成为可能，甚至在某些领域展现出独特的优势。&lt;/p&gt;
&lt;h2&gt;一、编程语言演化与创造性实现&lt;/h2&gt;
&lt;p&gt;编程语言的信息封装与抽象层次&lt;/p&gt;
&lt;p&gt;编程语言的发展历史，本质上是一个不断提高抽象层次、增强信息封装的过程。从最初的机器语言到汇编语言，再到高级语言，每一次演进都在减少人类与机器之间的信息转换成本，同时也改变了信息损失与编程效率之间的平衡。&lt;/p&gt;
&lt;p&gt;下图展示了不同编程语言层次的信息损失率与编程效率的关系：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/opc/programming_language_abstraction.svg&quot; alt=&quot;编程语言抽象层次与效率关系&quot; /&gt;&lt;/p&gt;
&lt;p&gt;随着抽象层次的提升，我们可以看到编程效率呈指数级增长，而信息损失率也在增加，但增长速度相对较慢。关键在于，尽管AI编程的信息损失率达到约65%，但其编程效率比传统方式提高了100倍，使得净生产力仍然显著提升。&lt;/p&gt;
&lt;p&gt;信息论视角下的编程效率提升&lt;/p&gt;
&lt;p&gt;从信息论的角度来看，编程语言的简化和封装程度提高，实际上是在优化信息传递的效率。根据香农的信息理论，信息传递的效率可以表示为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;效率 = 有效信息 / (总信息 * 传递时间)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;随着编程语言抽象层次的提高，虽然单位代码可能损失了一些底层信息，但整体的信息处理效率得到了极大提升。这种效率提升主要体现在以下几个方面：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;减少认知负荷&lt;/strong&gt;：高级语言和框架减少了开发者需要同时处理的信息量，使他们能够专注于创造性思考。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提高复用率&lt;/strong&gt;：良好的抽象和封装使得代码复用率大幅提高，减少了重复编码的时间。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;降低错误率&lt;/strong&gt;：更高层次的抽象通常提供了更好的错误处理机制，减少了调试和修复错误的时间。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;加速迭代速度&lt;/strong&gt;：快速原型开发和部署成为可能，使创意能够更快地转化为产品。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这种信息处理效率的提升，为一人公司的可行性奠定了技术基础。当一个人的信息处理能力通过工具和语言的优化得到极大扩展时，他就能够完成以前需要一个团队才能完成的工作。&lt;/p&gt;
&lt;h3&gt;1.3 创造性的民主化&lt;/h3&gt;
&lt;p&gt;编程语言的简化和工具链的完善，正在推动创造性的民主化进程。在过去，只有经过多年专业训练的程序员才能开发复杂的软件系统。而现在，即使是没有编程背景的人，也可以通过低代码平台和AI辅助工具，实现自己的创意。&lt;/p&gt;
&lt;p&gt;这种创造性的民主化，使得个人能够更加自由地表达自己的想法，将创意转化为实际的产品和服务。对于一人公司来说，这意味着创始人可以专注于自己最擅长的领域，而将其他专业领域的工作交给AI工具来辅助完成。接下来，我们将从信息压缩的角度，深入分析这种技术演进背后的本质。&lt;/p&gt;
&lt;h2&gt;二、信息压缩过程中的取舍与平衡&lt;/h2&gt;
&lt;p&gt;信息熵与编程效率的数学表达&lt;/p&gt;
&lt;p&gt;从信息论的角度看，编程语言和编程工具的发展过程，本质上是一个信息压缩的过程。根据香农信息理论，信息熵H(X)可以表示为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;H(X) = -Σ P(x_i) * log2(P(x_i))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中，P(x_i)是事件x_i发生的概率。信息熵衡量的是一个随机变量的不确定性程度。在编程领域，我们可以将其理解为描述一个系统所需的最小信息量。&lt;/p&gt;
&lt;p&gt;当我们使用更高级的编程语言或工具时，实际上是在进行信息压缩，用更少的代码表达更复杂的功能。然而，这种压缩不可避免地会带来信息损失。&lt;/p&gt;
&lt;p&gt;信息损失与编程效率的权衡&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;汇编语言&lt;/strong&gt;的信息损失相对较低。汇编指令与机器指令之间存在一一对应的关系，程序员可以精确控制每一条机器指令的执行。用信息论的术语来说，汇编语言保留了大部分的原始信息熵。我们可以用以下公式来描述不同编程语言的信息损失率：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;信息损失率 = (原始信息熵 - 保留信息熵) / 原始信息熵
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于汇编语言，这个损失率通常低于5%。这意味着汇编语言能够保留几乎所有的底层信息，但代价是编写效率极低。&lt;/p&gt;
&lt;p&gt;相比之下，&lt;strong&gt;高级语言&lt;/strong&gt;的信息损失率通常在20%-40%之间。虽然损失了部分底层信息，但编写效率可以提高10-100倍。&lt;/p&gt;
&lt;p&gt;在信息处理过程中，损失是不可避免的，但关键在于如何在信息损失和处理效率之间找到平衡点。在编程领域，这种权衡关系尤为重要，特别是随着AI编程工具的快速发展。根据2025年最新数据，GitHub Copilot已被IDC评为AI编码和软件工程技术供应商领导者，用户数超过2000万，成为微软首个多模型解决方案[^1]，这从侧面反映了市场对AI编程效率的认可。下图展示了不同编程方式的信息熵对比和净生产力：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/opc/information_entropy_productivity.svg&quot; alt=&quot;信息熵与净生产力对比&quot; /&gt;&lt;/p&gt;
&lt;p&gt;从图中可以清晰看到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;随着编程方式从机器语言发展到AI编程，信息熵呈现上升趋势，表明每个单位代码携带的信息量增加&lt;/li&gt;
&lt;li&gt;净生产力指数则呈现指数级增长，特别是AI编程带来的生产力提升最为显著&lt;/li&gt;
&lt;li&gt;这种权衡关系支持了我们的核心观点：尽管AI编程存在一定的信息损失，但其带来的效率提升远超过了这种损失&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AI编程的信息损失与效率分析&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AI编程&lt;/strong&gt;代表了信息压缩的一个新高度。当我们使用自然语言向AI描述我们想要的功能时，信息压缩比可以达到100:1甚至更高。然而，这种高度压缩也带来了更高的信息损失率，通常在50%-70%之间。&lt;/p&gt;
&lt;p&gt;我们可以用以下公式来描述AI编程的效率与信息损失的关系：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;净生产力 = 编程效率 * (1 - 信息损失率) * 修正系数
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中，修正系数考虑了错误修复和代码优化所需的额外时间。&lt;/p&gt;
&lt;p&gt;根据GitHub Copilot X的最新研究数据[^2]，AI编程工具可以将全栈开发的编码速度提升约100倍，这与我们在图表中展示的数据高度一致。Wiseflow项目的案例显示，其60%的代码由AI编写完成，极大地加速了开发进程&lt;a href=&quot;2025%E6%B1%9F%E8%8B%8F%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%88%9B%E6%96%B0%E5%8F%91%E5%B1%95%E5%A4%A7%E4%BC%9A%E8%B5%84%E6%96%99%EF%BC%8C%E5%B1%95%E7%A4%BA%E4%BA%86AI%E8%BE%85%E5%8A%A9%E7%BC%96%E7%A8%8B%E5%9C%A8OPC%E5%88%9B%E4%B8%9A%E6%A8%A1%E5%BC%8F%E4%B8%AD%E7%9A%84%E5%B9%BF%E6%B3%9B%E5%BA%94%E7%94%A8%5B3%5D(http://m.toutiao.com/group/7571438606939374086/)%E3%80%82&quot;&gt;^3&lt;/a&gt;。虽然AI编程的信息损失率较高，但由于其极高的编程效率，最终的净生产力仍然可以显著高于传统编程方式。这就是为什么AI编程能够成为一人公司的强大工具。&lt;/p&gt;
&lt;p&gt;减少信息损失的未来方向&lt;/p&gt;
&lt;p&gt;为了进一步提高AI编程的净生产力，减少信息损失是一个关键方向。基于信息论的原理，我们可以考虑以下几种方法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;改进提示工程&lt;/strong&gt;：通过更精确、结构化的提示，减少信息在人机交互过程中的损失。我们可以用互信息I(X;Y)来衡量提示与生成代码之间的信息关联：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;I(X;Y) = H(X) + H(Y) - H(X,Y)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;提高互信息可以有效减少信息损失。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;多级反馈机制&lt;/strong&gt;：建立代码生成、验证、反馈、修正的闭环系统。根据贝叶斯更新原理，每一次反馈都可以减少信息的不确定性：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;P(θ|D) ∝ P(D|θ) * P(θ)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;领域特定优化&lt;/strong&gt;：为特定领域开发专用的AI编程工具，减少通用模型在特定领域的信息损失。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;混合编程范式&lt;/strong&gt;：结合AI生成和人类专家编辑，发挥各自优势，在效率和信息保留之间找到最佳平衡点。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;随着这些技术的发展，我们有理由相信，AI编程的信息损失率将逐步降低，而效率将继续提高，为一人公司提供更加强大的技术支持。基于这些理论基础，我们现在可以更全面地分析AI时代一人公司的可行性。&lt;/p&gt;
&lt;h2&gt;三、AI时代一人公司的可行性分析&lt;/h2&gt;
&lt;p&gt;技术赋能：AI如何降低创业门槛&lt;/p&gt;
&lt;p&gt;在传统时代，一个人很难掌握从产品设计、前端开发、后端开发到运维部署的全部技能。然而，AI技术正在打破这一限制：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;代码生成工具&lt;/strong&gt;：如GitHub Copilot、GPT-4等，可以帮助非专业程序员编写高质量代码。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设计辅助工具&lt;/strong&gt;：如Figma的AI功能、Midjourney等，可以辅助创建专业级别的UI/UX设计。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动化运维&lt;/strong&gt;：容器化技术、CI/CD管道和AI监控工具，大幅降低了运维的技术门槛。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内容创作&lt;/strong&gt;：AI写作工具、语音合成和视频编辑工具，使得内容创作变得更加高效。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;从信息论的角度，这些工具本质上是在减少不同领域之间的信息壁垒，使得一个人能够处理跨领域的信息，从而实现全栈式的工作方式。&lt;/p&gt;
&lt;p&gt;一人公司与传统公司的经济可行性对比&lt;/p&gt;
&lt;p&gt;AI技术显著降低了创业的经济门槛，主要体现在以下几个方面：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;人力成本降低&lt;/strong&gt;：不再需要支付多个专业人员的工资，一个人+AI就可以完成以前需要团队才能完成的工作。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;基础设施成本降低&lt;/strong&gt;：云服务的按需付费模式和AI工具的订阅制，使得初创成本大幅降低。我们可以用以下公式来描述AI时代创业的经济性：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;创业经济性 = (传统团队成本 - AI工具成本) / 预期产出
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;试错成本降低&lt;/strong&gt;：快速原型开发和A/B测试能力，使得产品迭代更加高效，减少了无效投入。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;规模效应转变&lt;/strong&gt;：传统企业需要达到一定规模才能盈利，而一人公司可以通过利基市场和个性化服务，在小规模下实现盈利。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;从经济角度来看，一人公司与传统公司相比具有显著的多维差异。根据2024年最新数据，我们可以直观地看到这种对比：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/opc/company_comparison_radar.svg&quot; alt=&quot;传统公司与AI赋能一人公司多维对比&quot; /&gt;&lt;/p&gt;
&lt;p&gt;上图显示了传统公司与AI赋能一人公司在六个关键维度的对比。从图中可以看出，AI赋能一人公司在决策效率、运营灵活性和技术优势方面具有显著优势，而传统公司则在人力资源和扩展能力方面略有优势。值得注意的是，虽然一人公司的启动成本较低，但在某些需要大量人力资源的项目中可能面临挑战。&lt;/p&gt;
&lt;p&gt;根据Gartner《2025中国AI趋势》报告&lt;a href=&quot;Gartner%E3%80%8A2025%E4%B8%AD%E5%9B%BDAI%E8%B6%8B%E5%8A%BF%E3%80%8B%E6%8A%A5%E5%91%8A%EF%BC%8C%E7%B3%BB%E7%BB%9F%E5%88%86%E6%9E%90%E4%BA%86%E7%94%9F%E6%88%90%E5%BC%8FAI%E5%AF%B9%E5%BE%AE%E5%9E%8B%E4%BC%81%E4%B8%9A%E5%92%8C%E4%B8%80%E4%BA%BA%E5%85%AC%E5%8F%B8%E7%9A%84%E8%B5%8B%E8%83%BD%E6%95%88%E5%BA%94%5B2%5D(http://m.toutiao.com/group/7545384910345847348/)%E3%80%82&quot;&gt;^4&lt;/a&gt;，生成式AI对微型企业和一人公司的赋能效应正在显著增强。根据2025年AI赋能中小企业发展报告&lt;a href=&quot;2025%E5%B9%B4AI%E8%B5%8B%E8%83%BD%E4%B8%AD%E5%B0%8F%E4%BC%81%E4%B8%9A%E5%87%BA%E6%B5%B7%E8%90%A5%E9%94%80%E5%88%9B%E6%96%B0%E4%B8%8E%E5%8F%91%E5%B1%95%E6%8A%A5%E5%91%8A%EF%BC%8C%E8%AE%B0%E5%BD%95%E4%BA%86AI%E6%8A%80%E6%9C%AF%E4%BD%9C%E4%B8%BA%22%E6%A0%B8%E5%BF%83%E7%94%9F%E4%BA%A7%E5%8A%9B%22%E5%AF%B9%E5%B0%8F%E5%9E%8B%E4%BC%81%E4%B8%9A%E7%9A%84%E6%98%BE%E8%91%97%E6%8F%90%E5%8D%87%5B5%5D(https://www.sohu.com/a/883447063_122120704)%E3%80%82&quot;&gt;^5&lt;/a&gt;，AI技术作为&quot;核心生产力&quot;，正在显著提升小型企业的创新能力和市场竞争力。&lt;/p&gt;
&lt;p&gt;时间压缩：从想法到产品的加速循环&lt;/p&gt;
&lt;p&gt;AI技术极大地压缩了从想法到产品的转化时间：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;创意验证&lt;/strong&gt;：通过AI分析市场数据和用户需求，快速验证创意的可行性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;产品开发&lt;/strong&gt;：从设计到开发的周期从月级缩短到周级甚至日级。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;营销推广&lt;/strong&gt;：AI辅助的内容创作和精准营销，提高了获客效率。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这种时间压缩效应，使得一人公司能够以更快的速度响应市场变化，抢占先机。从信息论的角度，这相当于提高了信息在产品开发周期中的传递和处理速度。&lt;/p&gt;
&lt;h3&gt;3.4 质量保障：从数量到质量的转变&lt;/h3&gt;
&lt;p&gt;虽然一人公司在人力资源上存在劣势，但AI技术在一定程度上可以弥补这一不足，保障产品质量：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;代码质量&lt;/strong&gt;：AI代码审查工具可以发现潜在的bug和性能问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用户体验&lt;/strong&gt;：通过AI分析用户行为数据，持续优化产品体验。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内容质量&lt;/strong&gt;：AI辅助编辑和校对，提高内容的专业性和可读性。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当然，这并不意味着AI可以完全替代专业人才，但对于一人公司来说，AI提供了一个可行的质量保障机制，使得单人运营的产品能够达到市场可接受的质量标准。&lt;/p&gt;
&lt;p&gt;生态系统与一人公司的协同效应&lt;/p&gt;
&lt;p&gt;现代数字生态系统为一人公司提供了强大的支持：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;生态系统支持&lt;/strong&gt;：现代数字生态系统（如云服务、API市场、开源工具）为一人公司提供了强大的支持，使得单人可以完成以前需要团队才能完成的工作。根据2025年江苏人工智能创新发展大会资料&lt;a href=&quot;2025%E5%B9%B4%E6%B1%9F%E8%8B%8F%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%88%9B%E6%96%B0%E5%8F%91%E5%B1%95%E5%A4%A7%E4%BC%9A%E6%9A%A8%E9%A6%96%E5%B1%8A%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BDOPC%E5%A4%A7%E4%BC%9A%E8%B5%84%E6%96%99%EF%BC%8C%E8%8B%8F%E5%B7%9E%E6%8F%90%E5%87%BA%E6%89%93%E9%80%A0%22OPC%E5%88%9B%E4%B8%9A%E9%A6%96%E9%80%89%E5%9F%8E%E5%B8%82%22%EF%BC%8C%E5%8D%97%E4%BA%AC%E3%80%81%E8%8B%8F%E5%B7%9E%E5%8F%8C%E5%8F%8C%22%E6%8A%BC%E6%B3%A8%22OPC%E5%88%9B%E4%B8%9A%E6%96%B0%E6%A8%A1%E5%BC%8F%5B2%5D(http://m.toutiao.com/group/7576642589202383401/)%E3%80%82&quot;&gt;^6&lt;/a&gt;，苏州已提出打造&quot;OPC创业首选城市&quot;，南京、苏州两地正大力推动AI赋能OPC创业新模式。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;开源社区&lt;/strong&gt;：丰富的开源代码和组件，减少了重复开发的工作量。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;API经济&lt;/strong&gt;：通过集成第三方API，可以快速实现复杂功能，而无需从零开始。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;云服务生态&lt;/strong&gt;：从计算资源到数据库、存储、CDN等，一站式解决技术基础设施问题。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;众包平台&lt;/strong&gt;：在需要的时候，可以通过众包平台获取特定领域的专业支持。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这种生态系统的支持，使得一人公司能够专注于自己的核心竞争力，而将非核心功能外包给生态系统。&lt;/p&gt;
&lt;h3&gt;3.6 信息优势：从小规模到大敏捷&lt;/h3&gt;
&lt;p&gt;相比大型组织，一人公司在信息处理和决策方面具有独特优势：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;信息流通效率&lt;/strong&gt;：没有层级结构和部门壁垒，信息可以实时流通和处理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;决策链短&lt;/strong&gt;：从发现问题到做出决策的过程大大缩短，提高了响应速度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;适应性强&lt;/strong&gt;：可以快速调整方向和策略，适应市场变化。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;根据复杂系统理论，小型组织在复杂多变的环境中往往具有更高的适应性和生存能力。这一点在快速变化的技术领域尤为重要。接下来，我们将探讨一人公司未来的发展趋势和可能面临的挑战。&lt;/p&gt;
&lt;h2&gt;三、未来展望：一人公司的发展趋势&lt;/h2&gt;
&lt;p&gt;技术与经济的融合趋势&lt;/p&gt;
&lt;p&gt;随着AI技术的不断进步，我们可以预见一人公司将迎来以下发展趋势：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;专业化分工的精细化&lt;/strong&gt;：AI将承担更多重复性工作，而人类则专注于更高层次的创造性和决策工作。根据2025年企业应用AI十大趋势报告&lt;a href=&quot;2025%E5%B9%B4%E4%BC%81%E4%B8%9A%E5%BA%94%E7%94%A8AI%E5%8D%81%E5%A4%A7%E8%B6%8B%E5%8A%BF%E6%8A%A5%E5%91%8A%EF%BC%8C%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%B7%B2%E4%BB%8E%E8%BE%85%E5%8A%A9%E5%B7%A5%E5%85%B7%E8%B7%83%E5%8D%87%E4%B8%BA%E6%96%B0%E5%9E%8B%22%E7%94%9F%E4%BA%A7%E5%8A%9B%E7%B3%BB%E7%BB%9F%22%5B1%5D(http://m.toutiao.com/group/7525451815022772746/)%E3%80%82&quot;&gt;^7&lt;/a&gt;，人工智能已从辅助工具跃升为新型&quot;生产力系统&quot;，正深度赋能个体创业。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;工具链的集成与智能化&lt;/strong&gt;：未来的开发工具将更加智能化，提供端到端的解决方案，进一步降低技术门槛。江苏省已出台政策支持苏州市探索OPC创业新模式赋能人工智能产业发展&lt;a href=&quot;%E6%B1%9F%E8%8B%8F%E7%9C%81%E6%94%AF%E6%8C%81%E8%8B%8F%E5%B7%9E%E5%B8%82%E6%8E%A2%E7%B4%A2OPC%E5%88%9B%E4%B8%9A%E6%96%B0%E6%A8%A1%E5%BC%8F%E8%B5%8B%E8%83%BD%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E4%BA%A7%E4%B8%9A%E5%8F%91%E5%B1%95%E6%94%BF%E7%AD%96%E6%96%87%E4%BB%B6%5B1%5D(http://m.toutiao.com/group/7571787355078558242/)%E3%80%82&quot;&gt;^8&lt;/a&gt;，为一人公司提供了政策支持。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;协作模式的创新&lt;/strong&gt;：虽然是一人公司，但在需要时可以通过AI助手和外包服务快速扩展能力范围。据2025亚布力中国企业家论坛年会资料&lt;a href=&quot;2025%E4%BA%9A%E5%B8%83%E5%8A%9B%E4%B8%AD%E5%9B%BD%E4%BC%81%E4%B8%9A%E5%AE%B6%E8%AE%BA%E5%9D%9B%E5%B9%B4%E4%BC%9A%E8%B5%84%E6%96%99%EF%BC%8C%E9%99%88%E5%9B%9B%E6%B8%85%E6%8F%90%E5%87%BAAI%E7%8B%AC%E8%A7%92%E5%85%BD%22%E5%B0%8F%E5%9E%8B%E5%8C%96%22%E8%B6%8B%E5%8A%BF%E6%98%8E%E6%98%BE%5B4%5D(https://news.qq.com/rain/a/20250222A02H7300)%E3%80%82&quot;&gt;^9&lt;/a&gt;，陈四清提出AI独角兽&quot;小型化&quot;趋势明显，一人公司的价值正被重新认识。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;人机协作新模式&lt;/strong&gt;：人类专注于创意和决策，AI负责执行和优化，形成高效的协作模式。信也科技2025年Q3财报&lt;a href=&quot;%E4%BF%A1%E4%B9%9F%E7%A7%91%E6%8A%802025%E5%B9%B4Q3%E8%B4%A2%E6%8A%A5%EF%BC%8C%E5%B1%95%E7%A4%BA%E4%BA%86AI%E4%B8%8E%E5%85%A8%E7%90%83%E5%8C%96%E5%8F%8C%E5%BC%95%E6%93%8E%E9%A9%B1%E5%8A%A8%E4%BC%81%E4%B8%9A%E6%8C%81%E7%BB%AD%E5%8F%91%E5%B1%95%E7%9A%84%E6%A1%88%E4%BE%8B%5B3%5D(http://m.toutiao.com/group/7574685800999305762/)%E3%80%82&quot;&gt;^10&lt;/a&gt;展示了AI与全球化双引擎驱动企业持续发展的成功案例，为一人公司提供了可借鉴的发展路径。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;商业模式创新&lt;/p&gt;
&lt;p&gt;一人公司将催生新的商业模式和价值创造方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;微服务创业&lt;/strong&gt;：提供高度专业化的微服务，满足特定客户群体的需求。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数字产品订阅&lt;/strong&gt;：通过持续更新和优化，建立稳定的订阅收入。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;知识变现平台&lt;/strong&gt;：将个人专业知识转化为数字产品和服务。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开源商业模式&lt;/strong&gt;：通过开源核心产品，构建生态系统和增值服务。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.3 社会影响与挑战&lt;/h3&gt;
&lt;p&gt;一人公司的兴起将对社会产生深远影响，同时也面临一些挑战：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;就业结构变化&lt;/strong&gt;：传统的雇佣关系可能部分被自由职业和一人公司模式取代。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工作与生活平衡&lt;/strong&gt;：一人公司需要平衡多角色责任，避免过度工作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技能持续更新&lt;/strong&gt;：需要不断学习和适应新技术，保持竞争力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;社会支持体系&lt;/strong&gt;：需要建立适应一人公司发展的法律、税务和社会保障体系。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;结论&lt;/p&gt;
&lt;p&gt;从信息论的角度来看，AI时代一人公司的可行性，本质上是信息处理效率提升的结果。编程语言的演化、信息压缩技术的进步以及AI工具的普及，共同为单人创业创造了前所未有的条件。&lt;/p&gt;
&lt;p&gt;一人公司不仅是一种商业模式的创新，更是一种工作方式和生活方式的选择。它代表了对传统组织结构的挑战，也体现了技术进步带来的个体赋能。&lt;/p&gt;
&lt;p&gt;当然，一人公司并不适合所有人，也不是所有行业和产品都适合采用这种模式。但对于那些具有创业精神、愿意拥抱新技术的人来说，AI时代确实为实现个人创业梦想提供了更多可能。&lt;/p&gt;
&lt;p&gt;在未来，随着技术的进一步发展和社会支持体系的完善，我们有理由相信，一人公司将成为数字经济中一支不可忽视的力量，推动创新和经济发展。&lt;/p&gt;
&lt;h2&gt;参考资料&lt;/h2&gt;
&lt;p&gt;[^1]: GitHub Copilot 2025年度报告，被IDC评为2025年AI编码和软件工程技术供应商领导者，用户数已超过2000万，成为微软首个多模型解决方案&lt;a href=&quot;http://m.toutiao.com/group/7537589699330916927/&quot;&gt;4&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;[^2]: 2025年11月AI IDE权威评测榜，对GitHub Copilot、腾讯CodeBuddy、通义灵码等主流工具进行全景式对比与综合评分&lt;a href=&quot;http://m.toutiao.com/group/7573531064077926954/&quot;&gt;5&lt;/a&gt;。&lt;/p&gt;
</content:encoded></item><item><title>React的默认胜利正在扼杀前端创新</title><link>https://blog.ai-nous.com/posts/react%E7%9A%84%E9%BB%98%E8%AE%A4%E8%83%9C%E5%88%A9%E6%AD%A3%E5%9C%A8%E6%89%BC%E6%9D%80%E5%89%8D%E7%AB%AF%E5%88%9B%E6%96%B0/</link><guid isPermaLink="true">https://blog.ai-nous.com/posts/react%E7%9A%84%E9%BB%98%E8%AE%A4%E8%83%9C%E5%88%A9%E6%AD%A3%E5%9C%A8%E6%89%BC%E6%9D%80%E5%89%8D%E7%AB%AF%E5%88%9B%E6%96%B0/</guid><description>React 不再靠技术取胜，而是靠默认选择；这正在压制前端创新。</description><pubDate>Sun, 05 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;原文标题：React Won by Default – And It&apos;s Killing Frontend Innovation&lt;br /&gt;
发布日期：2025-09-16&lt;br /&gt;
修订：2025-10-04&lt;/p&gt;
&lt;p&gt;本文尝试说明：React-by-default 有隐性成本。在选择框架时，应该做“刻意选择”，而不是出于惯性。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;React 早已不再靠技术优势取胜。今天它的胜利更多来自“默认选择”。而这种默认，正在拖慢整个前端生态的创新速度。&lt;/p&gt;
&lt;p&gt;当团队需要做一个新的前端时，讨论很少从“约束是什么、哪种工具最合适？”开始。它更常见的开场是：“用 React 吧，大家都会。”这种反射式选择会形成自我强化的循环：决定架构的是网络效应，而不是技术适配度。&lt;/p&gt;
&lt;p&gt;与此同时，具有新架构思路的框架很难被采用。Svelte 通过编译期优化配合运行时信号，让包体更小；Solid 在没有虚拟 DOM 额外负担的情况下实现细粒度响应式；Qwik 通过 resumability（可恢复性）实现几乎瞬时启动。它们在常见场景里可以胜过 React 的模型，但因为 React 被“默认选中”，它们很少得到公平评估。&lt;/p&gt;
&lt;p&gt;React 在很多方面都很出色。问题不在 React 本身，而在“默认用 React”的心态。&lt;/p&gt;
&lt;h2&gt;创新天花板&lt;/h2&gt;
&lt;p&gt;React 的技术基础解释了今天的一部分摩擦。虚拟 DOM 在 2013 年是个聪明的解决方案，但正如 Rich Harris 在《Virtual DOM is pure overhead》中所说，它引入了大量现代编译器往往可以避免的工作。&lt;/p&gt;
&lt;p&gt;Hooks 解决了 class 组件时代的痛点，但也带来新的复杂度：依赖数组、陈旧闭包（stale closures）、被滥用的 effect。即便 React 官方文档也反复强调克制：“You Might Not Need an Effect”。Server Components 可以减少客户端 JavaScript，并允许只在服务端访问数据，但同时引入架构复杂度和新的失败模式。&lt;/p&gt;
&lt;p&gt;React Compiler 是个聪明的方案，它把 &lt;code&gt;useMemo&lt;/code&gt;/&lt;code&gt;useCallback&lt;/code&gt; 之类的模式自动化。但它的存在也在传递一个信号：我们正在围绕模型内生的约束做优化。&lt;/p&gt;
&lt;p&gt;2025 年 10 月发布的 React 19.2 继续沿着这条路走。新的 &lt;code&gt;useEffectEvent&lt;/code&gt; Hook 专门用来解决 effect 里依赖数组的问题——这相当于给 Hooks 自己制造的复杂度打补丁。Svelte 和 Solid 也有类似的 untrack 能力，但它们默认采用自动依赖追踪，只在边缘场景才需要 untrack；而 React 需要在每一个 effect 里手工维护依赖数组，然后再引入 &lt;code&gt;useEffectEvent&lt;/code&gt; 来绕开这种模型的限制。&lt;/p&gt;
&lt;p&gt;同一个版本还引入了用于管理应用可见/隐藏状态的 &lt;code&gt;&amp;lt;Activity /&amp;gt;&lt;/code&gt; 组件，以及新的部分预渲染 API。每一次新增都会扩大开发者必须掌握的 API 面，而其他框架往往能用更简单的原语达到相近的效果。&lt;/p&gt;
&lt;p&gt;对比一下这些替代路线：Svelte 5 的 Runes 用运行时信号实现细粒度响应式；Solid 的细粒度响应式只更新真正发生变化的部分；Qwik 的 resumability 消除了传统意义上的 hydration。它们不是对 React 模型的渐进式修修补补，而是不同的模型、不同的上限。&lt;/p&gt;
&lt;p&gt;没有被采用的创新，不会改变结果。而当选择出于“反射”，采用就不会发生。&lt;/p&gt;
&lt;h2&gt;我们共同背负的技术债&lt;/h2&gt;
&lt;p&gt;默认选择 React，常常意味着把一套我们已经不再质疑的运行时与协调（reconciliation）成本一起打包带走。即使它“够快”，天花板也仍然低于编译期方案或细粒度响应式模型。开发者把时间花在管理重渲染、effect 依赖和 hydration 边界上，而不是交付价值。性能研究的结论也一致：关键路径上的 JavaScript 很昂贵（The Cost of JavaScript）。&lt;/p&gt;
&lt;p&gt;除了性能，我们还把心智模型中心从“Web 基础”挪到了“React 模式”，降低了技能的可迁移性，也更容易形成架构惰性。损失的不只是性能，更是机会成本：当更合适的替代方案从未被评估时，我们就错过了它们。&lt;/p&gt;
&lt;h2&gt;被扼杀的框架&lt;/h2&gt;
&lt;h3&gt;Svelte：信号 + 编译期优化&lt;/h3&gt;
&lt;p&gt;Svelte 5 把运行时信号用于细粒度响应式，并配合激进的编译期优化：没有虚拟 DOM，运行时比 React 更小。组件会被编译成高效、定向的 DOM 操作，心智模型也更贴近 Web 基础。&lt;/p&gt;
&lt;p&gt;但“没有足够岗位”的叙事，让 Svelte 即便在很多用例里技术更强，也仍被人为压低了采用率。现实案例（例如 The Guardian 在其前端采用 Svelte）显示，它能显著提升性能与开发效率，带来更小的包体与更快的加载速度。比如 Wired 的一篇文章提到，开发者 Shawn Wang（@swyx on X/Twitter）利用 Svelte 的编译期优化，把自己网站从 React 的 187KB 降到 Svelte 的 9KB，这会让慢网环境下的体验大幅改善。&lt;/p&gt;
&lt;h3&gt;Solid：响应式原语路线&lt;/h3&gt;
&lt;p&gt;Solid 在保留 JSX 熟悉感的同时，提供细粒度响应式：更新通过信号直接流向受影响的 DOM 节点，绕开协调带来的瓶颈。性能特征强，但心智占有率有限。正如 Solid 的对比指南所阐述，这种精确响应式能比 React 的虚拟 DOM 更高效地更新，减少无谓工作，并以更简单的状态管理改善开发体验。&lt;/p&gt;
&lt;p&gt;Solid 的公开成功案例不如“更主流”的框架多，这在很大程度上也源于它的采用率较低。但早期采用者的口碑反馈显示，它同样可能带来更新效率与代码简洁性的质变，只是仍在等待更多团队去试、去规模化验证与传播。&lt;/p&gt;
&lt;h3&gt;Qwik：可恢复性（Resumability）的创新&lt;/h3&gt;
&lt;p&gt;Qwik 以 resumability 取代 hydration：通过只加载当前交互所需的代码，实现几乎瞬时启动。这要求应用状态可序列化，会带来架构上的约束，但能换来可量化的性能收益。它尤其适合内容型站点、慢网环境或移动优先应用。根据 Qwik 的 Think Qwik 指南，这通过渐进式加载以及对状态与代码的序列化来实现：应用无需沉重的客户端启动过程即可立刻恢复执行，因此相较传统框架有更好的可扩展性与更低的首屏成本。&lt;/p&gt;
&lt;p&gt;Qwik 的成功故事不够显眼，可能只是因为更少团队愿意跳出默认去尝试。但真正试过的人报告了启动时间与资源效率的显著改善，这意味着一旦采用率上升，潜在的价值会被更多释放出来。&lt;/p&gt;
&lt;p&gt;这三者之所以被低估，并不是因为它们不够好，而是因为“默认选择”阻断了尝试它们的机会。&lt;/p&gt;
&lt;p&gt;此外，React 的 API 面明显更大、更复杂：Hooks、Context、Reducer、各种 memo 化模式……都需要谨慎管理才能避坑。这会抬高开发者的认知负担，进而带来因为误解依赖关系或过度工程而产生的缺陷。比如 Cloudflare 在 2025 年 9 月 12 日的一次故障中，一个 &lt;code&gt;useEffect&lt;/code&gt; 中有问题的依赖数组触发了重复 API 调用，压垮了他们的 Tenant Service，导致大范围失败。相比之下，Svelte、Solid、Qwik 的 API 往往更小、更聚焦，更强调简洁与 Web 基础，降低了上手与维护成本。&lt;/p&gt;
&lt;h2&gt;网络效应的牢笼&lt;/h2&gt;
&lt;p&gt;React 的主导地位会自我强化。招聘启事写的是“React 开发者”，而不是“前端工程师”，从而限制了技能多样性。组件库、团队肌肉记忆与组织惯性进一步加固了这种路径依赖。&lt;/p&gt;
&lt;p&gt;风险规避的管理者会选择“更安全”的选项；学校教的是岗位要求的内容；循环与技术优劣无关地继续运转。&lt;/p&gt;
&lt;p&gt;这不是健康竞争，而是“默认选择”对生态的捕获。&lt;/p&gt;
&lt;h2&gt;打破网络效应&lt;/h2&gt;
&lt;p&gt;逃离这种状态需要多层面的主动行动。技术负责人应该基于约束与技术优劣做选择，而不是追随势能；公司可以划出一小部分创新预算，用来尝试替代方案；开发者也可以在单一心智模型之外持续进修。&lt;/p&gt;
&lt;p&gt;教育者可以在教授具体工具的同时，强化框架无关的概念；开源贡献者可以帮助替代生态走向成熟。&lt;/p&gt;
&lt;p&gt;变化不会自动发生，它需要有意识的选择。&lt;/p&gt;
&lt;h2&gt;框架评估清单&lt;/h2&gt;
&lt;p&gt;在启动新项目时，用下面这份简单清单来做“刻意选择”：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;性能需求评估：关注启动时间、更新效率、包体积等指标；如果速度是关键，优先考虑编译期优化更强的框架。&lt;/li&gt;
&lt;li&gt;团队技能与学习曲线：尊重既有经验，但也要把迁移路径纳入考虑；许多替代方案有温和上手路径（例如 Solid 与 React 的 JSX 兼容）。&lt;/li&gt;
&lt;li&gt;规模化与持有成本：计算长期成本，包括维护、依赖管理与技术债；替代方案往往能减少运行时开销，从而降低托管成本并提升可扩展性。&lt;/li&gt;
&lt;li&gt;生态适配：在成熟与创新之间平衡；先在非关键路径试点，用以验证迁移可行性与 ROI。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;常见反驳&lt;/h2&gt;
&lt;p&gt;“但生态成熟度呢！” 成熟很有价值，也可能固化惰性。年龄不等于适配当下约束。&lt;/p&gt;
&lt;p&gt;此外，一个成熟生态往往意味着对第三方包的重度依赖，这会引入维护负担：依赖升级、安全漏洞、以及因为未使用代码而膨胀的包体。虽然在某些场景里不可避免，但这种灵活性也容易变成过度依赖；围绕具体需求打造的定制化方案通常更轻、更易维护。替代框架的小生态反而鼓励从基础出发，形成更深的理解与更少的技术债。并且在 AI 编码助手可以按需生成精确自定义函数的今天，打造“为应用量身定制”的轻量工具函数的门槛已经显著降低，这让我们有可能完全避开像 lodash、Moment 或 date-fns 这类通用库，转而使用更轻的实现。&lt;/p&gt;
&lt;p&gt;“但招聘呢！” 招聘跟着需求走。你可以先在非关键路径试点替代方案，降低风险；再以“基础能力 + 在岗训练”的方式招聘。&lt;/p&gt;
&lt;p&gt;“但组件库呢！” 组件库往往是膨胀的代名词，主要在交付速度压倒一切时才最有用。围绕应用真实需求构建组件，会更精简，因为你不会为自己没有的问题打包代码。框架无关的设计系统与 Web Components 也能在保留交付速度的同时降低锁定风险。&lt;/p&gt;
&lt;p&gt;“但稳定性呢！” React 从 class 到 Hooks、再到 Server Components、再到 React 19.2 的 &lt;code&gt;useEffectEvent&lt;/code&gt; 与 &lt;code&gt;&amp;lt;Activity /&amp;gt;&lt;/code&gt;，展示的是持续 churn，而不是稳定。许多替代框架反而提供更一致的 API。&lt;/p&gt;
&lt;p&gt;“但大规模验证过呢！” jQuery 也曾被大规模验证过。过去的成功并不保证未来仍然相关。&lt;/p&gt;
&lt;h2&gt;更广泛的生态伤害&lt;/h2&gt;
&lt;p&gt;当一个框架的约束变成事实上的限制时，单一化会让 Web 演化放缓。人才把精力花在解决框架特有的问题上，而不是推动平台向前。资本也会不论技术优劣地追随既有赢家。&lt;/p&gt;
&lt;p&gt;课程体系为了“立刻可就业”而不是“长期可迁移”，会优化成框架特定技能；平台层面的改进也可能被延后，因为“React 能解决”成了默认答案。&lt;/p&gt;
&lt;p&gt;当多样性消失，整个生态都会受损。&lt;/p&gt;
&lt;h2&gt;我们本可以培育的花园&lt;/h2&gt;
&lt;p&gt;健康生态需要多样性，而不是单一栽培。创新来自不同路线的竞争与交叉授粉。开发者通过学习多个心智模型成长；平台也会在不同框架的推动下突破边界。&lt;/p&gt;
&lt;p&gt;把所有筹码押在一个模型上，会制造单点失败。如果它触及硬性上限会怎样？如果我们从未探索替代方案，又错过了哪些机会？&lt;/p&gt;
&lt;p&gt;是时候基于约束与技术优劣，而不是势能，来选择框架了。你的下一个项目不该被“默认用 React”绑架；生态也值得拥有只有多样性才能带来的创新。&lt;/p&gt;
&lt;p&gt;不要再默认种同一种种子。通过探索多样化的框架，我们能培育出更韧性、更具创新力的花园，而不是我们已逐渐滑向的单一栽培。&lt;/p&gt;
&lt;p&gt;选择权在我们手里。&lt;/p&gt;
&lt;h2&gt;引用&lt;/h2&gt;
&lt;p&gt;原文：&lt;a href=&quot;https://www.lorenstew.art/blog/react-won-by-default/&quot;&gt;react-won-by-default / Loren Stewart&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>飞鹅博客系统部署阿里云服务器</title><link>https://blog.ai-nous.com/posts/%E9%A3%9E%E9%B9%85%E5%8D%9A%E5%AE%A2%E7%B3%BB%E7%BB%9F%E9%83%A8%E7%BD%B2%E9%98%BF%E9%87%8C%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/</link><guid isPermaLink="true">https://blog.ai-nous.com/posts/%E9%A3%9E%E9%B9%85%E5%8D%9A%E5%AE%A2%E7%B3%BB%E7%BB%9F%E9%83%A8%E7%BD%B2%E9%98%BF%E9%87%8C%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;飞鹅博客系统部署阿里云服务器&lt;/h1&gt;
&lt;p&gt;首先你要满足如下条件&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;你已经购买了阿里云服务器，并且已经登录到服务器上。&lt;/li&gt;
&lt;li&gt;你已经安装了Node.js和npm。&lt;/li&gt;
&lt;li&gt;你已经安装了MySQL数据库。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;一、打包三个应用 前端 后端 管理端&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;前端应用
修改 package.json 中的 scripts 字段，添加如下内容：&lt;pre&gt;&lt;code&gt;&quot;scripts&quot;: {
  &quot;build&quot;: &quot;cross-env BASE_URL=你的域名 nuxi build&quot;,
}
&lt;/code&gt;&lt;/pre&gt;
然后运行 &lt;code&gt;npm run build&lt;/code&gt; 打包前端应用。
打包结果在 &lt;code&gt;.output&lt;/code&gt; 目录下。&lt;/li&gt;
&lt;li&gt;后端应用
如果你是windows系统，打包后端应用&lt;pre&gt;&lt;code&gt;$env:GOOS=&quot;linux&quot;; $env:GOARCH=&quot;amd64&quot;; go build -o flygoose-api-2.0-linux-amd64 ./cmd/flygoose
&lt;/code&gt;&lt;/pre&gt;
如果并不是的话，参考&lt;a href=&quot;/posts/%E9%A3%9E%E9%B9%85%E5%8D%9A%E5%AE%A2%E7%B3%BB%E7%BB%9F%E5%88%9D%E5%A7%8B%E5%8C%96%E5%8F%8A%E4%BA%8C%E6%AC%A1%E5%BC%80%E5%8F%91%EF%BC%88%E4%BA%8C%EF%BC%89%E5%90%8E%E7%AB%AF.md&quot;&gt;飞鹅博客系统二次开发指南&lt;/a&gt;
打包结果为 &lt;code&gt;flygoose-api-2.0-linux-amd64&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;管理端应用&lt;pre&gt;&lt;code&gt;npm run build:prod
&lt;/code&gt;&lt;/pre&gt;
打包结果在 &lt;code&gt;dist&lt;/code&gt; 目录下。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;服务器分别部署&lt;/h2&gt;
&lt;h3&gt;安装docker docker-compose pm2等工具&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# Ubuntu系统
apt update &amp;amp;&amp;amp; apt install -y docker.io curl npm
sudo curl -L &quot;https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)&quot; -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
npm install -g pm2

# CentOS系统
yum install -y docker curl npm
systemctl start docker
systemctl enable docker
sudo curl -L &quot;https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)&quot; -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
npm install -g pm2
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;nginx及docker compose配置&lt;/h3&gt;
&lt;p&gt;我的目录如下
&lt;img src=&quot;./images/aliyun1.png&quot; alt=&quot;目录结构&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/home/aifire/
├── ai-fire-api/
├── ai-fire-blog/
├── ai-fire-admin/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;nginx配置文件如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    listen 80;
    server_name 你的域名;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection &apos;upgrade&apos;;
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;docker compose配置文件如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &apos;3.8&apos;
services:
  db:
    image: mysql:8.0
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - &quot;8000:80&quot;
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
volumes:
  db_data: {}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;分别启动每个项目&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;前端blog&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ai-fire-blog
pm2 start npm --name &quot;ai-fire-blog&quot; -- run start
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动成功后如下
&lt;img src=&quot;./images/pm2-ls.png&quot; alt=&quot;前端blog启动成功&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;后端api
增加启动权限&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod +x flygoose-api-2.0-linux-amd64
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动后端api&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod +x flygoose-api-2.0-linux-amd64
sudo nohup ./flygoose-api-2.0-linux-amd64 -c ./flygoose-config.yml &amp;amp; 
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;管理端admin&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ai-fire-admin
docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>飞鹅博客系统初始化及二次开发（三）管理端前端</title><link>https://blog.ai-nous.com/posts/%E9%A3%9E%E9%B9%85%E5%8D%9A%E5%AE%A2%E7%B3%BB%E7%BB%9F%E5%88%9D%E5%A7%8B%E5%8C%96%E5%8F%8A%E4%BA%8C%E6%AC%A1%E5%BC%80%E5%8F%91%E4%B8%89%E7%AE%A1%E7%90%86%E7%AB%AF%E5%89%8D%E7%AB%AF/</link><guid isPermaLink="true">https://blog.ai-nous.com/posts/%E9%A3%9E%E9%B9%85%E5%8D%9A%E5%AE%A2%E7%B3%BB%E7%BB%9F%E5%88%9D%E5%A7%8B%E5%8C%96%E5%8F%8A%E4%BA%8C%E6%AC%A1%E5%BC%80%E5%8F%91%E4%B8%89%E7%AE%A1%E7%90%86%E7%AB%AF%E5%89%8D%E7%AB%AF/</guid><description>详细介绍飞鹅博客系统的安装、配置和二次开发流程</description><pubDate>Wed, 03 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;飞鹅博客系统初始化及二次开发（三）管理端前端&lt;/h1&gt;
&lt;h2&gt;1. 项目概述&lt;/h2&gt;
&lt;p&gt;飞鹅博客系统管理端是一个基于 Vue 3 + TypeScript 的现代化管理后台，用于管理博客系统的各类内容和配置。本项目采用了组件化、模块化的设计思想，提供了良好的可扩展性和维护性。&lt;/p&gt;
&lt;h3&gt;1.1 技术栈&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;技术/框架&lt;/th&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Vue.js&lt;/td&gt;
&lt;td&gt;3.x&lt;/td&gt;
&lt;td&gt;前端框架&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;5.x&lt;/td&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pinia&lt;/td&gt;
&lt;td&gt;2.x&lt;/td&gt;
&lt;td&gt;状态管理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ant Design Vue&lt;/td&gt;
&lt;td&gt;4.x&lt;/td&gt;
&lt;td&gt;UI 组件库&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vue Router&lt;/td&gt;
&lt;td&gt;4.x&lt;/td&gt;
&lt;td&gt;路由管理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Axios&lt;/td&gt;
&lt;td&gt;1.x&lt;/td&gt;
&lt;td&gt;HTTP 请求&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vite&lt;/td&gt;
&lt;td&gt;5.x&lt;/td&gt;
&lt;td&gt;构建工具&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Less&lt;/td&gt;
&lt;td&gt;4.x&lt;/td&gt;
&lt;td&gt;CSS 预处理器&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;2. 环境搭建&lt;/h2&gt;
&lt;h3&gt;2.1 安装依赖&lt;/h3&gt;
&lt;p&gt;项目使用 pnpm 作为包管理工具，首先确保已安装 pnpm：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install -g pnpm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后安装项目依赖：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ai-fire-admin
pnpm install
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.2 配置文件&lt;/h3&gt;
&lt;p&gt;项目包含两个主要的环境配置文件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.env.development&lt;/code&gt;：开发环境配置&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.env.production&lt;/code&gt;：生产环境配置&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;配置文件中定义了 API 基础路径等关键信息，可根据实际情况修改：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 开发环境示例
VITE_API_BASE_URL = &apos;/api&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.3 启动开发服务器&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;pnpm dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;开发服务器默认会在 &lt;code&gt;http://localhost:5173&lt;/code&gt; 启动。&lt;/p&gt;
&lt;h2&gt;3. 项目结构&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;ai-fire-admin/
├── public/              # 静态资源
├── src/                 # 源代码
│   ├── apis/            # API接口定义
│   ├── assets/          # 静态资源
│   ├── components/      # 自定义组件
│   ├── layouts/         # 布局组件
│   ├── router/          # 路由配置
│   ├── stores/          # 状态管理
│   ├── types/           # TypeScript类型定义
│   ├── utils/           # 工具函数
│   ├── views/           # 页面组件
│   ├── App.vue          # 根组件
│   └── main.ts          # 入口文件
├── nginx/               # Nginx配置
├── .env.*               # 环境配置
├── package.json         # 项目配置
├── vite.config.ts       # Vite配置
└── tsconfig.json        # TypeScript配置
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.1 核心目录说明&lt;/h3&gt;
&lt;h4&gt;3.1.1 &lt;code&gt;src/apis/&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;定义了与后端交互的所有 API 接口，每个模块对应一个独立的文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 示例：website-info.ts
import request from &apos;@/utils/http&apos;

export const getSiteInfoList = () =&amp;gt; {
  return request.get(&apos;/api/website/info/list&apos;)
}

export const createSiteInfo = (data: any) =&amp;gt; {
  return request.post(&apos;/api/website/info/create&apos;, data)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3.1.2 &lt;code&gt;src/components/&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;包含项目中使用的自定义组件，如表格、表单、模态框等：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;table.vue&lt;/code&gt;：通用表格组件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;form.vue&lt;/code&gt;：通用表单组件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;modal.vue&lt;/code&gt;：通用模态框组件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pagination.vue&lt;/code&gt;：分页组件&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.1.3 &lt;code&gt;src/layouts/&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;定义了系统的整体布局结构：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;default-layout.vue&lt;/code&gt;：默认布局，包含侧边栏、顶部导航和内容区域&lt;/li&gt;
&lt;li&gt;&lt;code&gt;menu.vue&lt;/code&gt;：侧边栏菜单组件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;foot.vue&lt;/code&gt;：页脚组件&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.1.4 &lt;code&gt;src/router/&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;配置了系统的路由结构：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// index.ts
import { createRouter, createWebHistory } from &apos;vue-router&apos;
import DefaultLayout from &apos;@/layouts/default-layout.vue&apos;

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: &apos;/&apos;,
      name: &apos;home&apos;,
      component: DefaultLayout,
      children: [
        {
          path: &apos;&apos;,
          name: &apos;dashboard&apos;,
          component: () =&amp;gt; import(&apos;../views/dashboard/index.vue&apos;)
        }
        // 其他路由...
      ]
    },
    {
      path: &apos;/login&apos;,
      name: &apos;login&apos;,
      component: () =&amp;gt; import(&apos;../views/login/index.vue&apos;)
    }
  ]
})
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3.1.5 &lt;code&gt;src/stores/&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;使用 Pinia 进行状态管理，按功能模块划分：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// module/website-info.ts
import { defineStore } from &apos;pinia&apos;
import * as websiteInfoApi from &apos;@/apis/website-info&apos;

export const useWebsiteInfoStore = defineStore(&apos;websiteInfo&apos;, {
  state: () =&amp;gt; ({
    websiteInfoList: []
  }),
  actions: {
    async getSiteInfoListAction() {
      const res = await websiteInfoApi.getSiteInfoList()
      this.websiteInfoList = res.data
      return res.data
    }
  }
})
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3.1.6 &lt;code&gt;src/utils/&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;包含项目中使用的工具函数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;http.ts&lt;/code&gt;：Axios 实例配置&lt;/li&gt;
&lt;li&gt;&lt;code&gt;constant.ts&lt;/code&gt;：常量定义&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3.1.7 &lt;code&gt;src/views/&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;包含系统的所有页面组件，按功能模块划分：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dashboard/&lt;/code&gt;：仪表盘&lt;/li&gt;
&lt;li&gt;&lt;code&gt;blog/&lt;/code&gt;：博客管理&lt;/li&gt;
&lt;li&gt;&lt;code&gt;category/&lt;/code&gt;：分类管理&lt;/li&gt;
&lt;li&gt;&lt;code&gt;website-info/&lt;/code&gt;：网站信息管理&lt;/li&gt;
&lt;li&gt;&lt;code&gt;login/&lt;/code&gt;：登录页面&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;4. 核心功能模块&lt;/h2&gt;
&lt;h3&gt;4.1 登录与权限管理&lt;/h3&gt;
&lt;p&gt;系统实现了基于 JWT 的登录认证机制：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用户输入账号密码登录&lt;/li&gt;
&lt;li&gt;后端验证通过后返回 JWT token&lt;/li&gt;
&lt;li&gt;前端将 token 存储到 localStorage&lt;/li&gt;
&lt;li&gt;后续请求通过 Authorization 头携带 token&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;登录逻辑实现：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// views/login/index.vue
const handleLogin = async () =&amp;gt; {
  try {
    const res = await userApi.login(formData.value)
    localStorage.setItem(&apos;token&apos;, res.data.token)
    router.push(&apos;/&apos;)
    message.success(&apos;登录成功&apos;)
  } catch (error) {
    message.error(&apos;登录失败&apos;)
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.2 网站信息管理&lt;/h3&gt;
&lt;p&gt;网站信息管理模块用于配置博客系统的基本信息，如标题、标语、封面、版权信息等。&lt;/p&gt;
&lt;p&gt;主要功能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查看网站信息列表&lt;/li&gt;
&lt;li&gt;选择并查看详情&lt;/li&gt;
&lt;li&gt;编辑网站信息&lt;/li&gt;
&lt;li&gt;创建新的网站信息&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实现细节：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- views/website-info/website-info.vue --&amp;gt;
&amp;lt;Table
  :data-source=&quot;dataSource&quot;
  :columns=&quot;columns&quot;
  ref=&quot;table&quot;
  @edit=&quot;edit&quot;
  @change=&quot;handleTableChange&quot;
&amp;gt;
  &amp;lt;!-- 表格内容 --&amp;gt;
&amp;lt;/Table&amp;gt;

&amp;lt;a-descriptions bordered style=&quot;margin-top: 20px;&quot;&amp;gt;
  &amp;lt;a-descriptions-item label=&quot;网站标题&quot;&amp;gt;{{ websiteInfo.title }}&amp;lt;/a-descriptions-item&amp;gt;
  &amp;lt;!-- 其他信息项 --&amp;gt;
&amp;lt;/a-descriptions&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.3 博客管理&lt;/h3&gt;
&lt;p&gt;博客管理模块用于管理博客文章，支持以下功能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;博客列表展示与分页&lt;/li&gt;
&lt;li&gt;博客文章的创建、编辑、删除&lt;/li&gt;
&lt;li&gt;富文本编辑&lt;/li&gt;
&lt;li&gt;分类与标签管理&lt;/li&gt;
&lt;li&gt;状态管理（已发布/草稿）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.4 分类管理&lt;/h3&gt;
&lt;p&gt;分类管理模块用于管理博客文章的分类，支持：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;分类列表展示&lt;/li&gt;
&lt;li&gt;分类的创建、编辑、删除&lt;/li&gt;
&lt;li&gt;分类排序&lt;/li&gt;
&lt;li&gt;分类状态管理&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.5 仪表盘&lt;/h3&gt;
&lt;p&gt;仪表盘模块提供系统概览，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;博客文章统计&lt;/li&gt;
&lt;li&gt;分类统计&lt;/li&gt;
&lt;li&gt;访问量统计&lt;/li&gt;
&lt;li&gt;最新动态&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;5. 二次开发指南&lt;/h2&gt;
&lt;h3&gt;5.1 添加新页面&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;code&gt;src/views/&lt;/code&gt; 目录下创建新的页面组件&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;src/router/&lt;/code&gt; 中配置路由&lt;/li&gt;
&lt;li&gt;在侧边栏菜单中添加新的菜单项&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;示例：添加新页面&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- src/views/new-page/index.vue --&amp;gt;
&amp;lt;template&amp;gt;
  &amp;lt;div class=&quot;new-page&quot;&amp;gt;
    &amp;lt;h1&amp;gt;新页面&amp;lt;/h1&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;script setup lang=&quot;ts&quot;&amp;gt;
// 页面逻辑
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;// src/router/index.ts
const router = createRouter({
  // ...
  routes: [
    {
      path: &apos;/&apos;,
      component: DefaultLayout,
      children: [
        // ...
        {
          path: &apos;/new-page&apos;,
          name: &apos;newPage&apos;,
          component: () =&amp;gt; import(&apos;../views/new-page/index.vue&apos;)
        }
      ]
    }
  ]
})
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5.2 添加新组件&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;code&gt;src/components/&lt;/code&gt; 目录下创建新的组件&lt;/li&gt;
&lt;li&gt;在需要使用的地方导入并使用&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;示例：创建新组件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- src/components/my-component.vue --&amp;gt;
&amp;lt;template&amp;gt;
  &amp;lt;div class=&quot;my-component&quot;&amp;gt;
    &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;script setup lang=&quot;ts&quot;&amp;gt;
// 组件逻辑
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5.3 扩展 API&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;code&gt;src/apis/&lt;/code&gt; 目录下创建新的 API 文件&lt;/li&gt;
&lt;li&gt;定义 API 函数&lt;/li&gt;
&lt;li&gt;在组件或 store 中使用&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;示例：添加新 API&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// src/apis/new-api.ts
import request from &apos;@/utils/http&apos;

export const getNewData = () =&amp;gt; {
  return request.get(&apos;/api/new-data&apos;)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5.4 自定义主题&lt;/h3&gt;
&lt;p&gt;系统使用 Ant Design Vue 的主题定制功能，可以通过修改 &lt;code&gt;src/assets/css/variables.less&lt;/code&gt; 文件来自定义主题颜色：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 自定义主题色
@primary-color: #1890ff;
@success-color: #52c41a;
@warning-color: #faad14;
@error-color: #f5222d;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;6. 部署流程&lt;/h2&gt;
&lt;h3&gt;6.1 构建生产版本&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;pnpm build
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;构建后的文件会输出到 &lt;code&gt;dist/&lt;/code&gt; 目录。&lt;/p&gt;
&lt;h3&gt;6.2 Nginx 配置&lt;/h3&gt;
&lt;p&gt;项目提供了 Nginx 配置文件 &lt;code&gt;nginx/nginx.conf&lt;/code&gt;，可根据实际情况修改：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 全局配置
user nginx;
worker_processes auto;

# http 配置
http {
    include       mime.types;
    default_type  application/octet-stream;

    # 服务器配置
    server {
        listen       8080;
        server_name  localhost;

        # 前端静态资源
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
        }

        # API 代理
        location /api {
            proxy_pass http://127.0.0.1:29090;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.3 部署步骤&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;将构建后的 &lt;code&gt;dist/&lt;/code&gt; 目录上传到服务器的 &lt;code&gt;/usr/share/nginx/html/&lt;/code&gt; 目录&lt;/li&gt;
&lt;li&gt;将 Nginx 配置文件复制到服务器的 &lt;code&gt;/etc/nginx/conf.d/&lt;/code&gt; 目录&lt;/li&gt;
&lt;li&gt;重新加载 Nginx 配置：&lt;pre&gt;&lt;code&gt;nginx -s reload
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;7. 开发规范&lt;/h2&gt;
&lt;h3&gt;7.1 代码风格&lt;/h3&gt;
&lt;p&gt;项目使用 ESLint 和 Prettier 来保证代码风格的一致性，提交代码前会自动进行检查。&lt;/p&gt;
&lt;h3&gt;7.2 命名规范&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;组件名：大驼峰命名，如 &lt;code&gt;WebsiteInfo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;文件/目录名：小写字母加短横线，如 &lt;code&gt;website-info.vue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;变量名：小驼峰命名，如 &lt;code&gt;websiteInfoList&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;常量名：全大写加下划线，如 &lt;code&gt;API_BASE_URL&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.3 注释规范&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;组件和函数使用 JSDoc 注释&lt;/li&gt;
&lt;li&gt;复杂逻辑添加必要的单行注释&lt;/li&gt;
&lt;li&gt;代码变更添加提交注释&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;8. 常见问题与解决方案&lt;/h2&gt;
&lt;h3&gt;8.1 跨域问题&lt;/h3&gt;
&lt;p&gt;开发环境中，Vite 配置了代理解决跨域问题：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// vite.config.ts
export default defineConfig({
  // ...
  server: {
    proxy: {
      &apos;/api&apos;: {
        target: &apos;http://localhost:29090&apos;,
        changeOrigin: true
      }
    }
  }
})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;生产环境中，通过 Nginx 代理解决跨域问题。&lt;/p&gt;
&lt;h3&gt;8.2 构建失败&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;检查依赖是否正确安装&lt;/li&gt;
&lt;li&gt;检查 TypeScript 类型是否正确&lt;/li&gt;
&lt;li&gt;检查语法错误&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8.3 页面空白&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;检查路由配置是否正确&lt;/li&gt;
&lt;li&gt;检查组件是否正确导入&lt;/li&gt;
&lt;li&gt;检查网络请求是否正常&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>飞鹅博客系统初始化及二次开发（二）后端</title><link>https://blog.ai-nous.com/posts/%E9%A3%9E%E9%B9%85%E5%8D%9A%E5%AE%A2%E7%B3%BB%E7%BB%9F%E5%88%9D%E5%A7%8B%E5%8C%96%E5%8F%8A%E4%BA%8C%E6%AC%A1%E5%BC%80%E5%8F%91%E4%BA%8C%E5%90%8E%E7%AB%AF/</link><guid isPermaLink="true">https://blog.ai-nous.com/posts/%E9%A3%9E%E9%B9%85%E5%8D%9A%E5%AE%A2%E7%B3%BB%E7%BB%9F%E5%88%9D%E5%A7%8B%E5%8C%96%E5%8F%8A%E4%BA%8C%E6%AC%A1%E5%BC%80%E5%8F%91%E4%BA%8C%E5%90%8E%E7%AB%AF/</guid><description>详细介绍飞鹅博客系统的安装、配置和二次开发流程</description><pubDate>Sat, 02 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;飞鹅博客系统初始化及二次开发（二）后端&lt;/h1&gt;
&lt;h2&gt;一、后端开发&lt;/h2&gt;
&lt;h3&gt;1.1 项目结构解析&lt;/h3&gt;
&lt;p&gt;飞鹅博客系统后端基于Go语言和Iris框架开发，采用了清晰的分层架构设计。以下是项目的核心目录结构：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;├── cmd/                      # 命令行入口
│   └── flygoose/             # 主程序入口
│       ├── flygoose-config.yaml  # 配置文件示例
│       └── main.go           # 程序启动文件
├── configs/                  # 配置相关
│   └── config.go             # 配置结构定义
├── datasource/               # 数据源连接
│   └── db.go                 # 数据库初始化
├── inits/                    # 应用初始化
│   ├── flygoose_init.go      # 应用初始化逻辑
│   └── middle.go             # 中间件配置
├── pkg/                      # 公共包
│   ├── beans/                # 数据传输对象
│   ├── models/               # 数据模型
│   ├── tlog/                 # 日志工具
│   └── tools/                # 通用工具
├── web/                      # Web相关
│   ├── controllers/          # 控制器
│   ├── daos/                 # 数据访问层
│   ├── middlers/             # 中间件
│   └── services/             # 业务逻辑层
└── docs/                     # 文档
    └── 接口文档.md           # API接口文档
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.2 核心配置文件说明&lt;/h3&gt;
&lt;h4&gt;1.2.1 主配置文件结构&lt;/h4&gt;
&lt;p&gt;配置文件位于&lt;code&gt;configs/config.go&lt;/code&gt;，定义了系统的核心配置结构：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 全局配置文件实例
var Cfg *Config

type Config struct {
    Http         HttpCfg     `yaml:&quot;http&quot;`         // HTTP服务配置
    Database     DatabaseCfg `yaml:&quot;database&quot;`     // 数据库配置
    ExecuteDir   string                             // 可执行文件目录
    StaticDir    string                             // 静态文件目录
    StaticImgDir string                             // 图片静态目录
}

type HttpCfg struct {
    Port int `yaml:&quot;port&quot;`                         // 服务端口
}

type DatabaseCfg struct {
    Driver   DbDriverType `yaml:&quot;driver&quot;`          // 数据库类型(mysql或postgresql)
    Host     string       `yaml:&quot;host&quot;`            // 数据库IP
    Name     string       `yaml:&quot;name&quot;`            // 数据库名称
    Port     int          `yaml:&quot;port&quot;`            // 数据库端口
    User     string       `yaml:&quot;user&quot;`            // 用户名
    Password string       `yaml:&quot;password&quot;`        // 密码
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;1.2.2 配置文件示例&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# 服务端口
http:
  port: 29090
# 数据库配置
database:
  driver: mysql
  host: 127.0.0.1
  port: 3306
  name: db_flygoose
  user: flygoose
  password: flygoose
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.3 应用初始化流程&lt;/h3&gt;
&lt;p&gt;应用初始化主要在&lt;code&gt;inits/flygoose_init.go&lt;/code&gt;中实现，包含以下核心步骤：&lt;/p&gt;
&lt;h4&gt;1.3.1 创建应用实例&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;func NewFlygooseApp(cfg *configs.Config) *FlygooseApp {
    app := new(FlygooseApp)
    app.Cfg = cfg
    app.Engine = iris.New()
    // 配置CORS中间件
    app.Engine.UseRouter(cors.New().Handler())
    return app
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;1.3.2 启动应用&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;func (m *FlygooseApp) Start() {
    m.InitDir()       // 初始化目录
    m.initLog()       // 初始化日志
    m.initDB()        // 初始化数据库
    m.initRouter()    // 初始化路由
    m.run()           // 启动服务
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;1.3.3 数据库初始化与自动迁移&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;func (m *FlygooseApp) initDB() {
    // 初始化数据库连接
    if m.Cfg.Database.Driver == configs.DbDriverMySQL {
        datasource.InitMySql(cfg)
    } else if m.Cfg.Database.Driver == configs.DbDriverPostgreSQL {
        datasource.InitPostgreSQL(cfg)
    } else {
        panic(errors.New(&quot;暂不支持其它数据库&quot;))
    }
    
    // 自动迁移数据模型
    m.initAutoMigrate()
    
    // 初始化默认管理员账户
    m.initDefaultAdmin()
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;1.3.4 路由配置&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;func (m *FlygooseApp) initRouter() {
    v1 := m.Engine.Party(configs.Flygoose_Url_Prefix)  // API前缀
    {
        // 前端接口
        mvc.New(v1.Party(&quot;/site&quot;)).Handle(flygoose.NewSiteController())
        mvc.New(v1.Party(&quot;/blog&quot;)).Handle(flygoose.NewBlogController())
        mvc.New(v1.Party(&quot;/special&quot;)).Handle(flygoose.NewSpecialController())
        mvc.New(v1.Party(&quot;/ai&quot;)).Handle(ai.NewDeepSeekController()) // AI相关接口（注：此为个人修改版本新增功能，详情请参考 https://github.com/AI-FIRE/）
        
        // 管理端接口
        mvc.New(v1.Party(&quot;/health&quot;)).Handle(admin.NewHealthController())                 //健康检查
        mvc.New(v1.Party(&quot;/admin/access&quot;)).Handle(admin.NewAccessController())           //访问相关接口
        mvc.New(v1.Party(&quot;/admin/blog&quot;)).Handle(admin.NewBlogController())               //博客相关接口
        mvc.New(v1.Party(&quot;/admin/link&quot;)).Handle(admin.NewLinkController())               //友链相关接口
        mvc.New(v1.Party(&quot;/admin/site&quot;)).Handle(admin.NewSiteController())               //网站信息相关接口
        mvc.New(v1.Party(&quot;/admin/category&quot;)).Handle(admin.NewCategoryController())       //博客分类相关接口
        mvc.New(v1.Party(&quot;/admin/notice&quot;)).Handle(admin.NewNoticeController())           //公告分类相关接口
        mvc.New(v1.Party(&quot;/admin/special&quot;)).Handle(admin.NewSpecialController())         //专栏相关接口
        mvc.New(v1.Party(&quot;/admin/file&quot;)).Handle(admin.NewFileController())               //文件相关接口
        mvc.New(v1.Party(&quot;/admin/banner&quot;)).Handle(admin.NewBannerController())           //轮播图相关接口
        mvc.New(v1.Party(&quot;/admin/workStation&quot;)).Handle(admin.NewWorkStationController()) //统计数据
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.4 数据模型设计&lt;/h3&gt;
&lt;p&gt;系统的数据模型定义在&lt;code&gt;pkg/models/&lt;/code&gt;目录下，主要包含以下模型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Admin&lt;/code&gt;: 管理员模型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Blog&lt;/code&gt;: 博客文章模型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Category&lt;/code&gt;: 分类模型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Link&lt;/code&gt;: 友链模型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Notice&lt;/code&gt;: 公告模型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Section&lt;/code&gt;: 页面区块模型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Site&lt;/code&gt;: 网站信息模型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Special&lt;/code&gt;: 专栏模型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Webmaster&lt;/code&gt;: 站长模型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Banner&lt;/code&gt;: 轮播图模型&lt;/li&gt;
&lt;li&gt;AI相关模型（注：此为个人修改版本新增功能，详情请参考 https://github.com/AI-FIRE/）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.5 业务逻辑分层&lt;/h3&gt;
&lt;h4&gt;1.5.1 控制器层 (Controllers)&lt;/h4&gt;
&lt;p&gt;控制器层负责处理HTTP请求，接收参数，调用业务逻辑，并返回响应。控制器位于&lt;code&gt;web/controllers/&lt;/code&gt;目录下，分为前端控制器和管理端控制器。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例：博客控制器&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 前端博客控制器
func NewBlogController() *BlogController {
    return &amp;amp;BlogController{
        BlogService: services.NewBlogService(),
    }
}

// 管理端博客控制器
func NewBlogController() *BlogController {
    return &amp;amp;BlogController{
        BlogService: services.NewBlogService(),
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;1.5.2 业务逻辑层 (Services)&lt;/h4&gt;
&lt;p&gt;业务逻辑层负责处理核心业务逻辑，位于&lt;code&gt;web/services/&lt;/code&gt;目录下。&lt;/p&gt;
&lt;h4&gt;1.5.3 数据访问层 (DAOs)&lt;/h4&gt;
&lt;p&gt;数据访问层负责与数据库交互，位于&lt;code&gt;web/daos/&lt;/code&gt;目录下。&lt;/p&gt;
&lt;h3&gt;1.6 AI功能集成&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;注：AI功能为个人修改版本新增功能，详情请参考 https://github.com/AI-FIRE/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;系统集成了DeepSeek AI功能，相关代码位于以下位置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pkg/beans/ai/&lt;/code&gt;: AI相关数据传输对象&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pkg/models/ai/&lt;/code&gt;: AI配置模型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;web/controllers/ai/&lt;/code&gt;: AI控制器&lt;/li&gt;
&lt;li&gt;&lt;code&gt;web/daos/ai/&lt;/code&gt;: AI数据访问&lt;/li&gt;
&lt;li&gt;&lt;code&gt;web/services/ai/&lt;/code&gt;: AI业务逻辑&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;AI接口示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 直接返回型DeepSeek AI聊天接口
func (c *DeepSeekController) ChatFirstPageAi(ctx iris.Context) {
    // 处理AI聊天请求
}

// 流式传输型DeepSeek AI聊天接口
func (c *DeepSeekController) StreamChatFirstPageAi(ctx iris.Context) {
    // 处理AI流式聊天请求
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.7 开发环境搭建&lt;/h3&gt;
&lt;h4&gt;1.7.1 依赖安装&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;go mod tidy
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;1.7.2 本地运行&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;go run cmd\flygoose\main.go
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;1.7.3 配置说明&lt;/h4&gt;
&lt;p&gt;在&lt;code&gt;cmd/flygoose/flygoose-config.yaml&lt;/code&gt;文件中配置数据库连接信息：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 服务端口
http:
  port: 29090
# 数据库配置
database:
  driver: mysql
  host: 127.0.0.1
  port: 3306
  name: db_flygoose
  user: root
  password: root
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.8 编译与打包&lt;/h3&gt;
&lt;h4&gt;1.8.1 本地编译&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# Windows平台编译
$env:GOOS=&quot;windows&quot;; $env:GOARCH=&quot;amd64&quot;; go build -o flygoose-api-2.0-win-amd64.exe ./cmd/flygoose

# Linux平台编译
$env:GOOS=&quot;linux&quot;; $env:GOARCH=&quot;amd64&quot;; go build -o flygoose-api-2.0-linux-amd64 ./cmd/flygoose

# macOS平台编译 (Intel芯片)
$env:GOOS=&quot;darwin&quot;; $env:GOARCH=&quot;amd64&quot;; go build -o flygoose-api-2.0-darwin-amd64 ./cmd/flygoose

# macOS平台编译 (Apple芯片)
$env:GOOS=&quot;darwin&quot;; $env:GOARCH=&quot;arm64&quot;; go build -o flygoose-api-2.0-darwin-arm64 ./cmd/flygoose
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;1.8.2 运行编译后的程序&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# Linux平台
chmod +x flygoose-api-2.0-linux-amd64
./flygoose-api-2.0-linux-amd64 -c flygoose-config.yaml

# Windows平台
flygoose-api-2.0-win-amd64.exe -c flygoose-config.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.9 健康检查&lt;/h3&gt;
&lt;p&gt;系统提供了健康检查接口，用于验证服务是否正常运行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl http://localhost:29090/api/health
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;返回结果：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{&quot;code&quot;:1,&quot;data&quot;:null,&quot;message&quot;:&quot;success&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;二、管理端前端开发&lt;/h2&gt;
&lt;p&gt;（管理端前端部分将在后续章节中详细介绍）&lt;/p&gt;
&lt;h2&gt;三、二次开发指南&lt;/h2&gt;
&lt;h3&gt;3.1 添加新功能模块&lt;/h3&gt;
&lt;h4&gt;3.1.1 创建数据模型&lt;/h4&gt;
&lt;p&gt;在&lt;code&gt;pkg/models/&lt;/code&gt;目录下创建新的数据模型。&lt;/p&gt;
&lt;h4&gt;3.1.2 创建数据传输对象&lt;/h4&gt;
&lt;p&gt;在&lt;code&gt;pkg/beans/&lt;/code&gt;目录下创建对应的数据传输对象。&lt;/p&gt;
&lt;h4&gt;3.1.3 创建数据访问层&lt;/h4&gt;
&lt;p&gt;在&lt;code&gt;web/daos/&lt;/code&gt;目录下创建数据访问层。&lt;/p&gt;
&lt;h4&gt;3.1.4 创建业务逻辑层&lt;/h4&gt;
&lt;p&gt;在&lt;code&gt;web/services/&lt;/code&gt;目录下创建业务逻辑层。&lt;/p&gt;
&lt;h4&gt;3.1.5 创建控制器&lt;/h4&gt;
&lt;p&gt;在&lt;code&gt;web/controllers/&lt;/code&gt;目录下创建控制器。&lt;/p&gt;
&lt;h4&gt;3.1.6 注册路由&lt;/h4&gt;
&lt;p&gt;在&lt;code&gt;inits/flygoose_init.go&lt;/code&gt;文件中注册新的路由。&lt;/p&gt;
&lt;h3&gt;3.2 AI功能扩展&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;注：AI功能为个人修改版本新增功能，详情请参考 https://github.com/AI-FIRE/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;系统支持扩展AI功能，可以在&lt;code&gt;web/controllers/ai/&lt;/code&gt;、&lt;code&gt;web/daos/ai/&lt;/code&gt;和&lt;code&gt;web/services/ai/&lt;/code&gt;目录下添加新的AI接口和功能。&lt;/p&gt;
&lt;h3&gt;3.3 配置扩展&lt;/h3&gt;
&lt;p&gt;在&lt;code&gt;configs/config.go&lt;/code&gt;文件中添加新的配置项，并在&lt;code&gt;cmd/flygoose/flygoose-config.yaml&lt;/code&gt;文件中配置对应的值。&lt;/p&gt;
&lt;h2&gt;四、部署说明&lt;/h2&gt;
&lt;h3&gt;4.1 服务器部署&lt;/h3&gt;
&lt;h4&gt;4.1.1 准备工作&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;服务器或云主机（推荐配置：2核4G以上，操作系统：Ubuntu 20.04+）&lt;/li&gt;
&lt;li&gt;MySQL 8.0+ 数据库&lt;/li&gt;
&lt;li&gt;Nginx（可选，用于反向代理和HTTPS配置）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.1.2 安装依赖&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# 更新系统
apt-get update

# 安装依赖
apt-get install -y vim wget curl mysql-server
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;4.1.3 配置数据库&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# 登录MySQL
mysql -u root -p

# 创建数据库
CREATE DATABASE db_flygoose DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

# 创建用户并授权
CREATE USER &apos;flygoose&apos;@&apos;%&apos; IDENTIFIED BY &apos;flygoose&apos;;
GRANT ALL PRIVILEGES ON db_flygoose.* TO &apos;flygoose&apos;@&apos;%&apos;;
FLUSH PRIVILEGES;

# 退出
EXIT;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;4.1.4 部署应用&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# 创建应用目录
mkdir -p /opt/flygoose

# 上传编译好的程序和配置文件
cd /opt/flygoose

# 修改配置文件
vim flygoose-config.yaml

# 赋予执行权限
chmod +x flygoose-api-2.0-linux-amd64

# 后台运行
nohup ./flygoose-api-2.0-linux-amd64 -c flygoose-config.yaml &amp;amp;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;4.1.5 Nginx配置（可选）&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# 安装Nginx
apt-get install -y nginx

# 配置Nginx
vim /etc/nginx/conf.d/flygoose.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Nginx配置示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    listen 80;
    server_name yourdomain.com;
    
    location /api {
        proxy_pass http://localhost:29090;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# 重启Nginx
systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.2 Docker部署（可选）&lt;/h3&gt;
&lt;p&gt;项目包含Dockerfile，可以使用Docker进行部署。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 构建镜像
docker build -t flygoose-api .

# 运行容器
docker run -d -p 29090:29090 -v ./flygoose-config.yaml:/app/flygoose-config.yaml --name flygoose-api flygoose-api
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;五、接口文档&lt;/h2&gt;
&lt;p&gt;详细的API接口文档请参考&lt;code&gt;docs/接口文档.md&lt;/code&gt;文件。&lt;/p&gt;
&lt;h2&gt;六、常见问题与解决方案&lt;/h2&gt;
&lt;h3&gt;6.1 数据库连接失败&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;检查数据库服务是否正常运行&lt;/li&gt;
&lt;li&gt;检查数据库连接配置是否正确&lt;/li&gt;
&lt;li&gt;检查数据库用户权限是否正确&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6.2 服务启动失败&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;检查端口是否被占用&lt;/li&gt;
&lt;li&gt;检查配置文件是否正确&lt;/li&gt;
&lt;li&gt;检查日志文件获取详细错误信息&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6.3 AI功能无法使用&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;注：AI功能为个人修改版本新增功能，详情请参考 https://github.com/AI-FIRE/&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;检查AI配置是否正确&lt;/li&gt;
&lt;li&gt;检查网络连接是否正常&lt;/li&gt;
&lt;li&gt;检查AI服务是否可用&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>飞鹅博客系统初始化及二次开发（一）博客前端</title><link>https://blog.ai-nous.com/posts/%E9%A3%9E%E9%B9%85%E5%8D%9A%E5%AE%A2%E7%B3%BB%E7%BB%9F%E5%88%9D%E5%A7%8B%E5%8C%96%E5%8F%8A%E4%BA%8C%E6%AC%A1%E5%BC%80%E5%8F%91%E4%B8%80%E5%8D%9A%E5%AE%A2%E5%89%8D%E7%AB%AF-copy/</link><guid isPermaLink="true">https://blog.ai-nous.com/posts/%E9%A3%9E%E9%B9%85%E5%8D%9A%E5%AE%A2%E7%B3%BB%E7%BB%9F%E5%88%9D%E5%A7%8B%E5%8C%96%E5%8F%8A%E4%BA%8C%E6%AC%A1%E5%BC%80%E5%8F%91%E4%B8%80%E5%8D%9A%E5%AE%A2%E5%89%8D%E7%AB%AF-copy/</guid><description>详细介绍飞鹅博客系统的安装、配置和二次开发流程</description><pubDate>Fri, 01 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;飞鹅博客初始化及二次开发指南（一）博客前端&lt;/h1&gt;
&lt;p&gt;该网址即为此项目搭建 &lt;a href=&quot;https://ai-nous.com/home&quot;&gt;智心一梦&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;1. 项目简介&lt;/h2&gt;
&lt;p&gt;飞鹅博客是一个基于 Nuxt 3 + TypeScript 构建的现代化 AI 技术分享平台，集成了智能对话助手、技术博客、AI 资讯等核心功能。该项目采用前后端分离架构，前端使用 Nuxt 3 框架，支持服务端渲染和静态站点生成，为用户提供高性能的访问体验。&lt;/p&gt;
&lt;h3&gt;1.1 技术栈&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;技术/框架&lt;/th&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Nuxt&lt;/td&gt;
&lt;td&gt;^3.4.3&lt;/td&gt;
&lt;td&gt;前端框架&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;^4.7.2&lt;/td&gt;
&lt;td&gt;类型检查&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vue&lt;/td&gt;
&lt;td&gt;3.x&lt;/td&gt;
&lt;td&gt;UI 框架&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pinia&lt;/td&gt;
&lt;td&gt;2.0.14&lt;/td&gt;
&lt;td&gt;状态管理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Element Plus&lt;/td&gt;
&lt;td&gt;^2.3.4&lt;/td&gt;
&lt;td&gt;UI 组件库&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ant Design Vue&lt;/td&gt;
&lt;td&gt;^3.2.7&lt;/td&gt;
&lt;td&gt;UI 组件库&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Less&lt;/td&gt;
&lt;td&gt;^4.1.3&lt;/td&gt;
&lt;td&gt;样式预处理器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Axios&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;HTTP 客户端&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;1.2 核心功能&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;智能对话助手&lt;/strong&gt;：支持单次对话和流式对话两种模式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技术博客&lt;/strong&gt;：文章列表、详情展示、分类标签&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 资讯&lt;/strong&gt;：最新 AI 动态展示和外部链接跳转&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用户系统&lt;/strong&gt;：登录、注册、个人信息管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应式设计&lt;/strong&gt;：适配不同屏幕尺寸&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2. 环境准备&lt;/h2&gt;
&lt;h3&gt;2.1 基础环境&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;注意事项&lt;/strong&gt;：由于 Nuxt 当前版本存在 bug，启动项目时必须使用 &lt;strong&gt;Node.js 16.x&lt;/strong&gt;，否则可能出现 &lt;code&gt;unused body&lt;/code&gt; 报错。&lt;br /&gt;
建议使用 nvm 或 fnm 快速切换 Node 版本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nvm use 16
# 或
fnm use 16
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Node.js &amp;gt;= 14.0.0（&lt;strong&gt;推荐 16.x&lt;/strong&gt;）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yarn &amp;gt;= 1.22.0 或 npm &amp;gt;= 6.0.0&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Git&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Node.js &amp;gt;= 14.0.0&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yarn &amp;gt;= 1.22.0 或 npm &amp;gt;= 6.0.0&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Git&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.2 开发工具推荐&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Visual Studio Code&lt;/li&gt;
&lt;li&gt;Vue DevTools&lt;/li&gt;
&lt;li&gt;ESLint 插件&lt;/li&gt;
&lt;li&gt;Prettier 插件&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3. 项目初始化&lt;/h2&gt;
&lt;h3&gt;3.1 克隆项目&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/your-repo/flygoose-blog.git
cd flygoose-blog
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.2 安装依赖&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;yarn install
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.3 配置环境变量&lt;/h3&gt;
&lt;p&gt;在项目根目录创建 &lt;code&gt;.env&lt;/code&gt; 文件，配置基础 URL：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 开发环境
export BASE_URL=http://localhost:3000/api

# 生产环境
export BASE_URL=https://your-api-domain.com/api
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.4 启动开发服务器&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;yarn dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;访问 &lt;code&gt;http://localhost:3000&lt;/code&gt; 即可查看项目。&lt;/p&gt;
&lt;h2&gt;4. 项目结构分析&lt;/h2&gt;
&lt;h3&gt;4.1 目录结构&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;├── api/                # API 请求封装
├── assets/             # 静态资源
│   ├── images/         # 图片资源
│   ├── less/           # 全局样式
│   └── movie/          # 视频资源
├── components/         # Vue 组件
│   ├── blog/           # 博客相关组件
│   ├── global/         # 全局通用组件
│   ├── index/          # 首页组件
│   ├── layout/         # 布局组件
│   └── special/        # 专栏相关组件
├── hooks/              # 自定义 hooks
├── layouts/            # 页面布局
├── middleware/         # 中间件
├── pages/              # 页面组件
│   ├── ai/             # AI 相关页面
│   ├── detail/         # 文章详情
│   └── specialColumn/  # 专栏页面
├── plugins/            # 插件
├── stores/             # Pinia 状态管理
├── types/              # TypeScript 类型定义
├── utils/              # 工具函数
└── nuxt.config.ts      # Nuxt 配置文件
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.2 核心文件说明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pages/index.vue&lt;/code&gt;：网站首页，包含英雄区域、AI 对话、博客入口和资讯展示&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pages/ai/chatOnce.vue&lt;/code&gt;：单次对话组件，支持快捷问题和自定义问题&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pages/ai/chatStream.vue&lt;/code&gt;：流式对话组件，支持实时打字效果&lt;/li&gt;
&lt;li&gt;&lt;code&gt;components/layout/&lt;/code&gt;：包含导航栏、侧边栏、页脚等布局组件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stores/user.ts&lt;/code&gt;：用户信息状态管理&lt;/li&gt;
&lt;li&gt;&lt;code&gt;api/index.ts&lt;/code&gt;：API 请求封装&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;5. 代码规范&lt;/h2&gt;
&lt;h3&gt;5.1 命名规范&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;文件夹&lt;/strong&gt;：小写，多个单词用连字符，如 &lt;code&gt;ai-chat&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vue 文件&lt;/strong&gt;：除了 index.vue 全部使用大驼峰，如 &lt;code&gt;ArticleItem.vue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TypeScript 文件&lt;/strong&gt;：使用小驼峰，如 &lt;code&gt;useToken.ts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Class 名&lt;/strong&gt;：多个字母用连字符，如 &lt;code&gt;quick-questions&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;事件命名&lt;/strong&gt;：触发的 DOM 事件命名为 &lt;code&gt;handleXxxxClick&lt;/code&gt;，监听事件为 &lt;code&gt;onXxxxChange&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.2 代码风格&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用 ESLint + Prettier 进行代码检查和格式化&lt;/li&gt;
&lt;li&gt;使用 TypeScript 进行类型检查&lt;/li&gt;
&lt;li&gt;Vue 组件使用 Composition API&lt;/li&gt;
&lt;li&gt;样式使用 Less 预处理器&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;6. 二次开发指南&lt;/h2&gt;
&lt;h3&gt;6.1 新增页面&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;pages&lt;/code&gt; 目录下创建新的 Vue 文件，Nuxt 会自动生成路由：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;template&amp;gt;
  &amp;lt;div class=&quot;new-page&quot;&amp;gt;
    &amp;lt;h1&amp;gt;新页面&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;这是一个新添加的页面&amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;script lang=&quot;ts&quot; setup&amp;gt;
// 页面逻辑
&amp;lt;/script&amp;gt;

&amp;lt;style lang=&quot;less&quot; scoped&amp;gt;
.new-page {
  padding: 20px;
}
&amp;lt;/style&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.2 新增组件&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;components&lt;/code&gt; 目录下创建新的 Vue 组件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;template&amp;gt;
  &amp;lt;div class=&quot;new-component&quot;&amp;gt;
    &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;script lang=&quot;ts&quot; setup&amp;gt;
// 组件逻辑
&amp;lt;/script&amp;gt;

&amp;lt;style lang=&quot;less&quot; scoped&amp;gt;
.new-component {
  /* 组件样式 */
}
&amp;lt;/style&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.3 添加 API 请求&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;api/index.ts&lt;/code&gt; 中添加新的 API 请求：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export const getNewData = async (params: any) =&amp;gt; {
  return await request({
    url: &apos;/api/new-data&apos;,
    method: &apos;get&apos;,
    params
  })
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.4 状态管理&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;stores&lt;/code&gt; 目录下创建新的状态管理文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { defineStore } from &apos;pinia&apos;

export const useNewStore = defineStore(&apos;new&apos;, () =&amp;gt; {
  const data = ref([])
  
  const fetchData = async () =&amp;gt; {
    const res = await getNewData()
    data.value = res.data
  }
  
  return {
    data,
    fetchData
  }
})
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.5 修改主题样式&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;assets/less/style.less&lt;/code&gt; 中修改全局样式变量：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 主题色
@primary-color: #52c41a;
@success-color: #52c41a;
@warning-color: #faad14;
@error-color: #f5222d;

// 文字色
@text-color: #333333;
@text-color-secondary: #666666;
@text-color-tertiary: #999999;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;7. 快捷问题按钮开发实例&lt;/h2&gt;
&lt;p&gt;以 &lt;code&gt;chatOnce.vue&lt;/code&gt; 中的快捷问题按钮为例，展示二次开发过程：&lt;/p&gt;
&lt;h3&gt;7.1 添加按钮到模板&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;quick-questions&quot;&amp;gt;
  &amp;lt;button @click=&quot;handleFirstHandshake&quot; class=&quot;quick-question-button first-handshake-button&quot;&amp;gt;
    第一次握手
  &amp;lt;/button&amp;gt;
  &amp;lt;button v-for=&quot;(button, index) in quickButtons&quot; :key=&quot;index&quot; class=&quot;quick-question-button&quot; @click=&quot;fillQuestion(button.message)&quot;&amp;gt;
    {{ button.buttonname }}
  &amp;lt;/button&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;7.2 实现按钮样式&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;.quick-questions {
  display: flex;
  gap: 12px;
  margin-top: 12px;
  flex-wrap: wrap;
}

.quick-question-button {
  padding: 6px 12px;
  border: 1px solid #52c41a;
  border-radius: 16px;
  background: #f6ffed;
  color: #52c41a;
  font-size: 12px;
  cursor: pointer;
  transition: all 0.3s;
  white-space: nowrap;
  position: relative;
  overflow: hidden;
  
  &amp;amp;.first-handshake-button {
    border: 1px solid #ff7a45;
    background: #fff7e6;
    color: #ff7a45;
    
    &amp;amp;:hover {
      background: linear-gradient(135deg, #ff7a45, #ffac38);
      border-color: #ff7a45;
      color: #fff;
      box-shadow: 0 2px 8px rgba(255, 122, 69, 0.3);
    }
  }
  
  &amp;amp;:hover {
    background: linear-gradient(135deg, #52c41a, #73d13d);
    color: #fff;
    border-color: #52c41a;
    transform: translateY(-1px);
    box-shadow: 0 2px 8px rgba(82, 196, 26, 0.3);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;7.3 实现按钮功能&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// 快捷问题按钮数据
const quickButtons = [
  { buttonname: &apos;AI 是什么？&apos;, message: &apos;人工智能（AI）是什么？它有哪些主要应用领域？&apos; },
  { buttonname: &apos;机器学习入门&apos;, message: &apos;如何入门机器学习？需要学习哪些基础知识？&apos; },
  { buttonname: &apos;深度学习框架&apos;, message: &apos;目前主流的深度学习框架有哪些？它们各自的优缺点是什么？&apos; }
]

// 填充问题到输入框
const fillQuestion = (message: string) =&amp;gt; {
  userInput.value = message
}

// 处理第一次握手
const showHandshakeDialog = ref(false)
const authorName = ref(&apos;&apos;)
const authorNameError = ref(&apos;&apos;)

const handleFirstHandshake = () =&amp;gt; {
  authorName.value = &apos;&apos;
  authorNameError.value = &apos;&apos;
  showHandshakeDialog.value = true
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;8. 部署流程&lt;/h2&gt;
&lt;h3&gt;8.1 构建生产版本&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 开发环境构建
yarn build:local

# 测试环境构建
yarn build_test

# 生产环境构建
yarn build
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;构建成功后，会生成 &lt;code&gt;.output&lt;/code&gt; 目录。&lt;/p&gt;
&lt;h3&gt;8.2 使用 PM2 部署&lt;/h3&gt;
&lt;p&gt;在项目根目录执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pm install pm2 -g
pm2 start pm2.config.js
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;8.3 配置 Nginx&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;server {
  listen 80;
  server_name your-domain.com;
  
  location / {
    proxy_pass http://localhost:58081;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection &apos;upgrade&apos;;
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;9. 常见问题与解决方案&lt;/h2&gt;
&lt;h3&gt;9.1 API 请求失败&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;检查 BASE_URL 配置是否正确&lt;/li&gt;
&lt;li&gt;确保后端服务正常运行&lt;/li&gt;
&lt;li&gt;检查网络连接&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9.2 样式不生效&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;检查 Less 依赖是否安装&lt;/li&gt;
&lt;li&gt;确保样式文件路径正确&lt;/li&gt;
&lt;li&gt;检查 CSS 选择器是否正确&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9.3 页面路由 404&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;检查页面文件命名和路径是否符合 Nuxt 路由规则&lt;/li&gt;
&lt;li&gt;确保布局文件存在&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;10. 项目维护&lt;/h2&gt;
&lt;h3&gt;10.1 代码更新&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git pull
yarn install
yarn build
yarn start
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;10.2 依赖更新&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;yarn upgrade-interactive
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;10.3 日志查看&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;pm2 logs
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;11. 参考文档&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://nuxt.com/docs/getting-started/introduction&quot;&gt;Nuxt 3 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vuejs.org/guide/introduction.html&quot;&gt;Vue 3 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pinia.vuejs.org/introduction.html&quot;&gt;Pinia 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://element-plus.org/en-US/&quot;&gt;Element Plus 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.antdv.com/docs/vue/introduce/&quot;&gt;Ant Design Vue 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.typescriptlang.org/docs/&quot;&gt;TypeScript 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lesscss.org/&quot;&gt;Less 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.ai-nous.com/&quot;&gt;飞鹅博客示例网站&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item></channel></rss>