<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Immerse (沉浸式趣谈)</title>
    <link>http://beta.w2solo.com/Immerse</link>
    <description>个人网站：https://yaolifeng.com</description>
    <language>en-us</language>
    <item>
      <title>OpenClaw 到底能干什么？可以看看这 60 个真实用例</title>
      <description>&lt;p&gt;大家好，我是 Immerse，一名独立开发者、内容创作者、AGI 实践者。&lt;/p&gt;

&lt;p&gt;关注公众号：&lt;a href="https://yaolifeng.com/other/wx_public_account.webp" rel="nofollow" target="_blank" title=""&gt;沉浸式 AI&lt;/a&gt;，获取最新文章（更多内容只在公众号更新）&lt;/p&gt;

&lt;p&gt;个人网站：&lt;a href="https://yaolifeng.com" rel="nofollow" target="_blank" title=""&gt;https://yaolifeng.com&lt;/a&gt; 也同步更新。&lt;/p&gt;

&lt;p&gt;转载请在文章开头注明出处和版权信息。&lt;/p&gt;

&lt;p&gt;我会在这里分享关于&lt;code&gt;编程&lt;/code&gt;、&lt;code&gt;独立开发&lt;/code&gt;、&lt;code&gt;AI干货&lt;/code&gt;、&lt;code&gt;开源&lt;/code&gt;、&lt;code&gt;个人思考&lt;/code&gt;等内容。&lt;/p&gt;

&lt;p&gt;如果本文对您有所帮助，欢迎动动小手指一键三连 (&lt;code&gt;点赞&lt;/code&gt;、&lt;code&gt;评论&lt;/code&gt;、&lt;code&gt;转发&lt;/code&gt;)，给我一些支持和鼓励，谢谢！&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;img src="https://raw.githubusercontent.com/yaolifeng0629/oss/main/images/20260303232925721.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;OpenClaw 最大的问题是什么，答案不是技术门槛，而是大多数人根本想不到它能用来干什么。能不能赚到钱，但也说实话 Token 消耗是真的快&lt;/p&gt;

&lt;p&gt;GitHub 上的 awesome-openclaw-usecases 仓库，里面收集了 60 多个真实运行的用例。这些不是概念验证，而是有人实际跑了至少一天的东西。仓库的规则很简单：必须附上截图或体验描述，拒绝纸上谈兵&lt;/p&gt;
&lt;h2 id="社交媒体：让 AI 帮你筛选信息"&gt;社交媒体：让 AI 帮你筛选信息&lt;/h2&gt;
&lt;p&gt;社交媒体的信息过载是个老问题了。你关注了一堆 subreddit，订阅了几十个 YouTube 频道，但根本没时间看完。&lt;/p&gt;

&lt;p&gt;有人用 OpenClaw 做了&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/daily-reddit-digest.md" rel="nofollow" target="_blank" title=""&gt;每日 Reddit 摘要&lt;/a&gt;，根据你的偏好自动总结喜欢的 subreddit—这个思路很简单，但真正难得的是坚持每天整理。类似的还有&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/daily-youtube-digest.md" rel="nofollow" target="_blank" title=""&gt;每日 YouTube 摘要&lt;/a&gt;，让你不错过关注的创作者更新。&lt;/p&gt;

&lt;p&gt;如果你想分析自己的社交媒体表现，&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/x-account-analysis.md" rel="nofollow" target="_blank" title=""&gt;X 账号分析&lt;/a&gt;可以对你的账号做定性分析。还有人做了&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/multi-source-tech-news-digest.md" rel="nofollow" target="_blank" title=""&gt;多源科技新闻摘要&lt;/a&gt;，聚合了 109 个以上来源的科技新闻。&lt;/p&gt;
&lt;h2 id="创意与构建：从想法到产品"&gt;创意与构建：从想法到产品&lt;/h2&gt;
&lt;p&gt;有人真的用 OpenClaw 做了&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/overnight-mini-app-builder.md" rel="nofollow" target="_blank" title=""&gt;一夜之间自动生成并完成迷你应用&lt;/a&gt;的系统，目标是目标驱动的自主任务执行——说白了，就是睡前给 AI 一个需求，第二天早上起来应用已经跑起来了。&lt;/p&gt;

&lt;p&gt;内容创作者也在用。&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/youtube-content-pipeline.md" rel="nofollow" target="_blank" title=""&gt;YouTube 内容流水线&lt;/a&gt;可以自动挖掘选题、研究、追踪。更夸张的是&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/content-factory.md" rel="nofollow" target="_blank" title=""&gt;多智能体内容工厂&lt;/a&gt;，在 Discord 里让研究、写作、缩略图智能体协同工作，相当于一个小型内容工作室&lt;/p&gt;

&lt;p&gt;还有人用它管理&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/autonomous-game-dev-pipeline.md" rel="nofollow" target="_blank" title=""&gt;自主游戏开发流水线&lt;/a&gt;，全生命周期管理教育游戏开发，甚至搞了个「先修 Bug」政策——每次开发新功能前，先把现有 Bug 修干净。&lt;/p&gt;
&lt;h2 id="基础设施与 DevOps：让服务器自己照顾自己"&gt;基础设施与 DevOps：让服务器自己照顾自己&lt;/h2&gt;
&lt;p&gt;DevOps 场景下，OpenClaw 的价值在于自动化和自愈能力。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/n8n-workflow-orchestration.md" rel="nofollow" target="_blank" title=""&gt;n8n 工作流编排&lt;/a&gt;让智能体不接触凭证，所有集成可视化——这对安全敏感的人来说很重要。&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/self-healing-home-server.md" rel="nofollow" target="_blank" title=""&gt;自愈家庭服务器&lt;/a&gt;通过 SSH 加自动 cron 实现自愈能力，服务器出问题时自动修复，相当于雇了一个 24 小时值班的运维。&lt;/p&gt;
&lt;h2 id="生产力：这个分类用例最多"&gt;生产力：这个分类用例最多&lt;/h2&gt;
&lt;p&gt;生产力工具是 OpenClaw 最热门的应用场景。从项目管理到客户服务，从收件箱整理到健康追踪，几乎所有重复性工作都有人在尝试自动化。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/autonomous-project-management.md" rel="nofollow" target="_blank" title=""&gt;自主项目管理&lt;/a&gt;可以自动跟踪项目进度。&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/multi-channel-customer-service.md" rel="nofollow" target="_blank" title=""&gt;多渠道 AI 客户服务&lt;/a&gt;统一处理 WhatsApp、Instagram、邮件、Google 评论，对小团队来说相当于省了一个客服人力的成本。&lt;/p&gt;

&lt;p&gt;有人做了&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/phone-based-personal-assistant.md" rel="nofollow" target="_blank" title=""&gt;基于电话的个人助理&lt;/a&gt;，通过手机语音或短信免提操作——想象一下你在开车的时候喊一声就能让 AI 帮你回消息。还有&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/inbox-declutter.md" rel="nofollow" target="_blank" title=""&gt;收件箱整理&lt;/a&gt;、&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/personal-crm.md" rel="nofollow" target="_blank" title=""&gt;个人 CRM&lt;/a&gt;、&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/health-symptom-tracker.md" rel="nofollow" target="_blank" title=""&gt;健康与症状追踪器&lt;/a&gt;也是常见的尝试方向。。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/multi-channel-assistant.md" rel="nofollow" target="_blank" title=""&gt;多渠道个人助理&lt;/a&gt;、&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/project-state-management.md" rel="nofollow" target="_blank" title=""&gt;项目状态管理&lt;/a&gt;、&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/dynamic-dashboard.md" rel="nofollow" target="_blank" title=""&gt;动态仪表板&lt;/a&gt;、&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/todoist-task-manager.md" rel="nofollow" target="_blank" title=""&gt;Todoist 任务管理器&lt;/a&gt;都在这个列表里。&lt;/p&gt;

&lt;p&gt;家庭场景也有覆盖。&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/family-calendar-household-assistant.md" rel="nofollow" target="_blank" title=""&gt;家庭日历与家务助理&lt;/a&gt;可以协调家庭成员的日程——这个对有娃的家庭挺实用。&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/multi-agent-team.md" rel="nofollow" target="_blank" title=""&gt;多智能体专业团队&lt;/a&gt;包含战略、开发、营销、业务四个专精智能体，相当于一个 AI 组成的虚拟团队。&lt;/p&gt;

&lt;p&gt;早上起来想知道今天的重点？&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/custom-morning-brief.md" rel="nofollow" target="_blank" title=""&gt;定制早间简报&lt;/a&gt;可以帮你。想要一个&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/second-brain.md" rel="nofollow" target="_blank" title=""&gt;第二大脑&lt;/a&gt;？有人做了短信记忆加 Next.js 仪表板搜索的系统，等于给记忆装了个检索入口&lt;/p&gt;

&lt;p&gt;甚至有人用 OpenClaw 做&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/event-guest-confirmation.md" rel="nofollow" target="_blank" title=""&gt;活动嘉宾确认&lt;/a&gt;，让 AI 语音逐一打电话确认——这个用法挺巧妙，省了逐一通知的繁琐。。&lt;/p&gt;
&lt;h2 id="研究与学习：信息处理的新方式"&gt;研究与学习：信息处理的新方式&lt;/h2&gt;
&lt;p&gt;研究和学习场景下，OpenClaw 的价值在于信息的聚合和检索。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/earnings-tracker.md" rel="nofollow" target="_blank" title=""&gt;AI 财报追踪器&lt;/a&gt;可以自动追踪公司财报，对投资爱好者来说相当于多了只眼睛。&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/knowledge-base-rag.md" rel="nofollow" target="_blank" title=""&gt;个人知识库 (RAG)&lt;/a&gt;让你建立自己的知识检索系统，读过的东西不会看完就忘。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/market-research-product-factory.md" rel="nofollow" target="_blank" title=""&gt;市场研究与产品工厂&lt;/a&gt;更进一步，从 Reddit 和 X 挖掘痛点，自动生成 MVP——这个思路很接近硅谷的 MVP 文化，只是用 AI 代替了人工调研。&lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/semantic-memory-search.md" rel="nofollow" target="_blank" title=""&gt;语义记忆搜索&lt;/a&gt;让你用自然语言搜索过去的记录，相当于给过去的自己留了个对话窗口。&lt;/p&gt;
&lt;h2 id="我的看法"&gt;我的看法&lt;/h2&gt;
&lt;p&gt;看完这些用例，我最大的感受是：OpenClaw 的价值不在于它能做什么，而在于你能想到用它做什么，能不能赚到钱取决于你怎么用，但 Token 消耗确实也是实实在在的成本。&lt;/p&gt;

&lt;p&gt;如果你还在想 OpenClaw 能用来干什么，翻翻这个仓库。也许某个用例会给你启发——不是启发你怎么用，而是启发你思考什么值得自动化。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;仓库地址：&lt;/strong&gt; &lt;a href="https://github.com/hesamsheikh/awesome-openclaw-usecases" rel="nofollow" target="_blank"&gt;https://github.com/hesamsheikh/awesome-openclaw-usecases&lt;/a&gt;&lt;/p&gt;</description>
      <author>Immerse</author>
      <pubDate>Thu, 12 Mar 2026 14:52:54 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/7020</link>
      <guid>http://beta.w2solo.com/topics/7020</guid>
    </item>
    <item>
      <title>6247</title>
      <description>&lt;p&gt;大家好，我是 Immerse，一名独立开发者、内容创作者、AGI 实践者。&lt;/p&gt;

&lt;p&gt;关注公众号：&lt;a href="https://yaolifeng.com/other/wx_public_account.webp" rel="nofollow" target="_blank" title=""&gt;沉浸式 AI&lt;/a&gt;，获取最新文章（更多内容只在公众号更新）&lt;/p&gt;

&lt;p&gt;个人网站：&lt;a href="https://yaolifeng.com" rel="nofollow" target="_blank" title=""&gt;https://yaolifeng.com&lt;/a&gt; 也同步更新。&lt;/p&gt;

&lt;p&gt;转载请在文章开头注明出处和版权信息。&lt;/p&gt;

&lt;p&gt;我会在这里分享关于&lt;code&gt;编程&lt;/code&gt;、&lt;code&gt;独立开发&lt;/code&gt;、&lt;code&gt;AI干货&lt;/code&gt;、&lt;code&gt;开源&lt;/code&gt;、&lt;code&gt;个人思考&lt;/code&gt;等内容。&lt;/p&gt;

&lt;p&gt;如果本文对您有所帮助，欢迎动动小手指一键三连 (&lt;code&gt;点赞&lt;/code&gt;、&lt;code&gt;评论&lt;/code&gt;、&lt;code&gt;转发&lt;/code&gt;)，给我一些支持和鼓励，谢谢！&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;Boris 又发了一份 Anthropic 内部的 Claude Code 使用心得。&lt;/p&gt;

&lt;p&gt;看完觉得挺实用，记录几条：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. 多开 worktree&lt;/strong&gt;
同时跑 3-5 个 git worktree，每个开一个独立会话。团队里公认这个最提效。Boris 自己习惯用 git checkout，但大部分人更爱 worktree。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. 复杂任务先规划&lt;/strong&gt;
遇到复杂活儿就开 plan mode。可以让一个 Claude 写计划，另一个当幕僚审查。跑偏了就切回去重新规划。验证环节也会专门进计划模式。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. 错误后更新 CLAUDE.md&lt;/strong&gt;
每次纠错完都加一句："更新你的 CLAUDE.md，别再犯同样的错。"反复迭代到错误率明显降下来。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. 自建 Skills 库&lt;/strong&gt;
把常用操作做成 Skills 提交到 git，各项目复用。一天做两次以上的事就该做成 Skills。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. 让 Claude 自己修 bug&lt;/strong&gt;
接入 Slack MCP，把 bug 讨论帖扔给 Claude，说一句"修它"就行。或者直接"去修失败的 CI"，不用管细节。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. 提高提示词质量&lt;/strong&gt;
试试"严格审查这些改动，测试不过不准建 PR"，让 Claude 当审查员。或者"证明给我看这能跑通"，让它对比 main 和功能分支的差异。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. 追求更优方案&lt;/strong&gt;
碰到平庸的修复就说："基于现在掌握的信息，废掉这个方案，实现更优雅的。"任务前写详细规格，减少歧义。描述越具体，输出越好。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. 终端配置&lt;/strong&gt;
团队在用 Ghostty 终端，支持同步渲染、24 位色彩和完整 Unicode。用 /statusline 自定义状态栏显示上下文用量和 git 分支。给标签页做颜色编码和命名，一个任务一个标签页。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. 语音输入&lt;/strong&gt;
说话比打字快三倍，提示词也会详细很多。macOS 连按两次 fn 就能开启。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10. 用子代理&lt;/strong&gt;
想让 Claude 多花点算力就加"use subagents"。把任务分给子代理，主代理的上下文窗口保持干净。&lt;/p&gt;

&lt;p&gt;详情：x.com/bcherny/status/2017742741636321619&lt;/p&gt;</description>
      <author>Immerse</author>
      <pubDate>Sat, 14 Feb 2026 14:55:43 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6931</link>
      <guid>http://beta.w2solo.com/topics/6931</guid>
    </item>
    <item>
      <title>Vercel 为 AI Agent 专门做了个浏览器自动化工具（附安装方法）</title>
      <description>&lt;p&gt;大家好，我是 Immerse，一名独立开发者、内容创作者、AGI 实践者。&lt;/p&gt;

&lt;p&gt;关注公众号：&lt;a href="https://yaolifeng.com/other/wx_public_account.webp" rel="nofollow" target="_blank" title=""&gt;沉浸式 AI&lt;/a&gt;，获取最新文章（更多内容只在公众号更新）&lt;/p&gt;

&lt;p&gt;个人网站：&lt;a href="https://yaolifeng.com" rel="nofollow" target="_blank" title=""&gt;https://yaolifeng.com&lt;/a&gt; 也同步更新。&lt;/p&gt;

&lt;p&gt;转载请在文章开头注明出处和版权信息。&lt;/p&gt;

&lt;p&gt;我会在这里分享关于&lt;code&gt;编程&lt;/code&gt;、&lt;code&gt;独立开发&lt;/code&gt;、&lt;code&gt;AI干货&lt;/code&gt;、&lt;code&gt;开源&lt;/code&gt;、&lt;code&gt;个人思考&lt;/code&gt;等内容。&lt;/p&gt;

&lt;p&gt;如果本文对您有所帮助，欢迎动动小手指一键三连 (&lt;code&gt;点赞&lt;/code&gt;、&lt;code&gt;评论&lt;/code&gt;、&lt;code&gt;转发&lt;/code&gt;)，给我一些支持和鼓励，谢谢！&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;之前让 AI Agent 写自动化脚本，最头疼的就是 CSS 选择器。这玩意儿简直是 Agent 的克星——要么选不准，要么网页改个样式脚本就挂了。&lt;/p&gt;

&lt;p&gt;最近被 Vercel 开源的 &lt;code&gt;agent-browser&lt;/code&gt; 圈粉了。这工具专门为了解决 AI 操作浏览器的痛点设计的，试了一圈，确实比直接硬写 Playwright 舒服太多。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://qncdn.mopic.mozigu.net/work/143/26/5d9711d6f438485d/image-7.png" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="终于不用猜选择器了"&gt;终于不用猜选择器了&lt;/h2&gt;
&lt;p&gt;这工具最聪明的地方，就是用 &lt;code&gt;refs&lt;/code&gt; 机制替代了传统的 CSS 选择器。&lt;/p&gt;

&lt;p&gt;以前我们得告诉 AI "去找那个 class 里带 &lt;code&gt;submit&lt;/code&gt; 的按钮"，现在不用了。你运行一下 &lt;code&gt;snapshot&lt;/code&gt; 命令，它直接给页面拍个快照，给每个能点击、能输入的元素打上唯一标签（比如 &lt;code&gt;@e1&lt;/code&gt;, &lt;code&gt;@e2&lt;/code&gt;）。&lt;/p&gt;

&lt;p&gt;AI 拿到的视角是这样的：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# - button "Submit" [ref=e2]&lt;/span&gt;
&lt;span class="c"&gt;# - textbox "Email" [ref=e3]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后操作就变成了："点击 &lt;a href="/e2" class="user-mention" title="@e2"&gt;&lt;i&gt;@&lt;/i&gt;e2&lt;/a&gt;"，"在 &lt;a href="/e3" class="user-mention" title="@e3"&gt;&lt;i&gt;@&lt;/i&gt;e3&lt;/a&gt; 里填个邮箱"。这逻辑跟人眼操作一模一样，指哪打哪，底层 DOM 结构怎么变都无所谓，稳定性直接上了一个台阶。&lt;/p&gt;
&lt;h2 id="Rust 加持，快得飞起"&gt;Rust 加持，快得飞起&lt;/h2&gt;
&lt;p&gt;它的 CLI 是用 Rust 写的，背后挂了个 Node.js daemon 管理浏览器实例。&lt;/p&gt;

&lt;p&gt;最大的感受就是&lt;strong&gt;快&lt;/strong&gt;。以前跑脚本，初始化浏览器得等半天。现在 daemon 一直在后台挂着，命令发过去几乎是秒响应。对于那种需要连续操作几十步的复杂任务，这种低延迟体验真的回不去。&lt;/p&gt;
&lt;h2 id="开箱即用的命令集"&gt;开箱即用的命令集&lt;/h2&gt;
&lt;p&gt;文档：&lt;a href="https://agent-browser.dev/commands" rel="nofollow" target="_blank" title=""&gt;https://agent-browser.dev/commands&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;命令设计没那么多花里胡哨的，全是直觉式操作：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;agent-browser open google.com
agent-browser click @e35
agent-browser &lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="s2"&gt;"Vercel"&lt;/span&gt;
agent-browser &lt;span class="nb"&gt;wait &lt;/span&gt;500
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;而且通过 &lt;code&gt;--json&lt;/code&gt; 参数还能返回结构化数据，方便 Agent 进一步处理。目前大概有 50 多个命令，日常的截图、Cookie 管理、多 Tab 切换基本都覆盖了。&lt;/p&gt;
&lt;h2 id="AI 原生支持"&gt;AI 原生支持&lt;/h2&gt;
&lt;p&gt;Vercel 毕竟是做开发工具起家的，生态考虑得很周到。它不光是一个工具，还直接提供了适配 Claude Code 的 Skill 文件。&lt;/p&gt;

&lt;p&gt;把你下载的 Skill 文件往 &lt;code&gt;.claude/skills&lt;/code&gt; 里一扔，AI 立马就学会怎么用这套工具了，连 Prompt 都不用怎么调教。Cursor、Copilot 这些支持 Shell 命令的 Agent 也都能无缝衔接。&lt;/p&gt;

&lt;p&gt;链接：&lt;a href="https://github.com/vercel-labs/agent-browser/blob/main/skills/agent-browser/SKILL.md" rel="nofollow" target="_blank" title=""&gt;SKILL.md：https://github.com/vercel-labs/agent-browser/blob/main/skills/agent-browser/SKILL.md&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="几个很实用的细节"&gt;几个很实用的细节&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Session 隔离&lt;/strong&gt;：想测试 "用户 A 和用户 B 同时在线" 的场景？不用开俩浏览器窗口，直接指定不同 Session 就行，Cookie 互不干扰。&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;视觉降噪&lt;/strong&gt;：有些网页乱七八糟元素太多，容易把 AI 绕晕。它有个过滤模式，可以只把交互元素提取出来喂给 AI，省 Token 又提高准确率。&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;这就是即便 serverless 也能跑&lt;/strong&gt;：支持自定义 Chromium 路径，哪怕是在 AWS Lambda 这种环境里，挂个精简版 Chromium 也能跑起来。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;如果你也在折腾 AI Agent 做 E2E 测试或者爬虫，可以推荐试试 &lt;code&gt;agent-browser&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;把这种脏活累活丢给专门的工具，才是 AI 时代的正确姿势。&lt;/p&gt;

&lt;p&gt;项目地址：&lt;a href="https://github.com/vercel-labs/agent-browser" rel="nofollow" target="_blank" title=""&gt;agent-browser：https://github.com/vercel-labs/agent-browser&lt;/a&gt;&lt;/p&gt;</description>
      <author>Immerse</author>
      <pubDate>Tue, 03 Feb 2026 16:51:42 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6892</link>
      <guid>http://beta.w2solo.com/topics/6892</guid>
    </item>
    <item>
      <title>Vercel 把 10 年 React 经验打包成 Skill 开源了（附安装方法）</title>
      <description>&lt;p&gt;大家好，我是 Immerse，一名独立开发者、内容创作者、AGI 实践者。&lt;/p&gt;

&lt;p&gt;关注公众号：&lt;a href="https://yaolifeng.com/other/wx_public_account.webp" rel="nofollow" target="_blank" title=""&gt;沉浸式 AI&lt;/a&gt;，获取最新文章（更多内容只在公众号更新）&lt;/p&gt;

&lt;p&gt;个人网站：&lt;a href="https://yaolifeng.com" rel="nofollow" target="_blank" title=""&gt;https://yaolifeng.com&lt;/a&gt; 也同步更新。&lt;/p&gt;

&lt;p&gt;转载请在文章开头注明出处和版权信息。&lt;/p&gt;

&lt;p&gt;我会在这里分享关于&lt;code&gt;编程&lt;/code&gt;、&lt;code&gt;独立开发&lt;/code&gt;、&lt;code&gt;AI干货&lt;/code&gt;、&lt;code&gt;开源&lt;/code&gt;、&lt;code&gt;个人思考&lt;/code&gt;等内容。&lt;/p&gt;

&lt;p&gt;如果本文对您有所帮助，欢迎动动小手指一键三连 (&lt;code&gt;点赞&lt;/code&gt;、&lt;code&gt;评论&lt;/code&gt;、&lt;code&gt;转发&lt;/code&gt;)，给我一些支持和鼓励，谢谢！&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;Vercel 开源了一个项目，叫 agent-skills。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://qncdn.mopic.mozigu.net/work/143/26/5d9711d6f438485d/image-3.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;他们把团队积累的 React、Next.js 开发经验，打包成了 AI 可以直接调用的技能包。&lt;/p&gt;

&lt;p&gt;写代码时，AI 会自动检查性能问题、可访问性、最佳实践。相当于自动 Code Review。&lt;/p&gt;
&lt;h2 id="3 个技能包"&gt;3 个技能包&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;react-best-practices&lt;/strong&gt;：40 多条规则，分 8 个类别。&lt;/p&gt;

&lt;p&gt;包括消除请求瀑布流、优化包体积、服务端性能、客户端数据获取。每条规则标注优先级（Critical、High、Medium）。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;web-design-guidelines&lt;/strong&gt;：100 多条规则。&lt;/p&gt;

&lt;p&gt;涵盖可访问性、焦点状态、表单处理、动画、排版、图片、性能、导航、暗黑模式、触控交互、国际化。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;vercel-deploy-claimable&lt;/strong&gt;：在聊天窗口直接部署到 Vercel。&lt;/p&gt;

&lt;p&gt;支持 40 多种框架，部署完给预览地址和认领地址。&lt;/p&gt;
&lt;h2 id="安装和使用"&gt;安装和使用&lt;/h2&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;npx add-skill vercel-labs/agent-skills
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;装完不需要配置，AI 自动检测使用场景。写 React 组件时自动检查性能，说要部署时自动调用部署功能。&lt;/p&gt;
&lt;h2 id="工具支持"&gt;工具支持&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://qncdn.mopic.mozigu.net/work/143/26/5d9711d6f438485d/image-4.png" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="这个思路的价值"&gt;这个思路的价值&lt;/h2&gt;
&lt;p&gt;把经验和最佳实践结构化，让 AI 能理解和执行。&lt;/p&gt;

&lt;p&gt;比文档好用，AI 会在写代码时主动提醒你。这些技能遵循 Agent Skills 标准，是开放格式。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;项目地址：&lt;code&gt;https://github.com/vercel-labs/agent-skills&lt;/code&gt;&lt;/p&gt;</description>
      <author>Immerse</author>
      <pubDate>Thu, 29 Jan 2026 16:35:20 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6873</link>
      <guid>http://beta.w2solo.com/topics/6873</guid>
    </item>
    <item>
      <title>CSS 终于能做瀑布流了！三行代码搞定,告别 JavaScript 布局</title>
      <description>&lt;p&gt;大家好，我是 Immerse，一名独立开发者、内容创作者、AGI 实践者。&lt;/p&gt;

&lt;p&gt;关注公众号：&lt;a href="https://yaolifeng.com/other/wx_public_account.webp" rel="nofollow" target="_blank" title=""&gt;沉浸式趣谈&lt;/a&gt;，获取最新文章（更多内容只在公众号更新）&lt;/p&gt;

&lt;p&gt;个人网站：&lt;a href="https://yaolifeng.com" rel="nofollow" target="_blank" title=""&gt;https://yaolifeng.com&lt;/a&gt; 也同步更新。&lt;/p&gt;

&lt;p&gt;转载请在文章开头注明出处和版权信息。&lt;/p&gt;

&lt;p&gt;我会在这里分享关于&lt;code&gt;编程&lt;/code&gt;、&lt;code&gt;独立开发&lt;/code&gt;、&lt;code&gt;AI干货&lt;/code&gt;、&lt;code&gt;开源&lt;/code&gt;、&lt;code&gt;个人思考&lt;/code&gt;等内容。&lt;/p&gt;

&lt;p&gt;如果本文对您有所帮助，欢迎动动小手指一键三连 (&lt;code&gt;点赞&lt;/code&gt;、&lt;code&gt;评论&lt;/code&gt;、&lt;code&gt;转发&lt;/code&gt;)，给我一些支持和鼓励，谢谢！&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;img src="https://qncdn.mopic.mozigu.net/work/143/25/b4c2a3b2dc0a4f6a/image-4.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;之前做瀑布流布局，要么用 Masonry.js 这种库，要么自己写一堆 JavaScript 计算位置。&lt;/p&gt;

&lt;p&gt;现在好了，CSS Grid Lanes 来了，三行代码就搞定。&lt;/p&gt;

&lt;p&gt;Safari 技术预览版已经支持了，你现在就能试。&lt;/p&gt;
&lt;h2 id="三行代码实现瀑布流"&gt;三行代码实现瀑布流&lt;/h2&gt;
&lt;p&gt;看最简单的用法。&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid-lanes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auto-fill&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;250px&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://qncdn.mopic.mozigu.net/work/143/25/b4c2a3b2dc0a4f6a/image-5.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;就这样。&lt;/p&gt;

&lt;p&gt;第一行设置 &lt;code&gt;display: grid-lanes&lt;/code&gt;，告诉浏览器用 Grid Lanes 布局。&lt;/p&gt;

&lt;p&gt;第二行定义列，至少 250px 宽，自动填充所有可用空间。浏览器会根据屏幕宽度决定显示几列。&lt;/p&gt;

&lt;p&gt;第三行设置间距，列与列之间、卡片与卡片之间都是 16px。&lt;/p&gt;

&lt;p&gt;不用写 JavaScript，不用算高度，不用考虑响应式。浏览器全帮你搞定了。&lt;/p&gt;
&lt;h2 id="原理是什么？"&gt;原理是什么？&lt;/h2&gt;
&lt;p&gt;把它想象成堵车的高速公路。&lt;/p&gt;

&lt;p&gt;每辆车都想往前挤，哪条车道空就往哪条钻。每个新卡片也一样，浏览器会把它放在最靠上的位置。&lt;/p&gt;

&lt;p&gt;这样布局出来的效果和 Masonry.js 一模一样，但性能好太多了。&lt;/p&gt;

&lt;p&gt;如果你要做无限滚动加载更多内容，也不用 JavaScript 控制布局了。滚到底部加载新数据，浏览器自动把新卡片摆好。&lt;/p&gt;
&lt;h2 id="列宽可以不一样"&gt;列宽可以不一样&lt;/h2&gt;
&lt;p&gt;因为底层用的是 CSS Grid，你可以做各种花样。&lt;/p&gt;

&lt;p&gt;比如奇数列窄，偶数列宽，最后一列始终是窄的：&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid-lanes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auto-fill&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;8rem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;16rem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="n"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;8rem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://qncdn.mopic.mozigu.net/work/143/25/b4c2a3b2dc0a4f6a/image-6.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;这样布局出来就有节奏感了，不会显得太死板。&lt;/p&gt;
&lt;h2 id="卡片可以跨列"&gt;卡片可以跨列&lt;/h2&gt;
&lt;p&gt;既然是 Grid，那肯定能跨列。&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;article&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;grid-column&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;span&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;article&lt;/span&gt;&lt;span class="nd"&gt;:nth-child&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;grid-column&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;span&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;article&lt;/span&gt;&lt;span class="nd"&gt;:nth-child&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;2&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
&lt;span class="nt"&gt;article&lt;/span&gt;&lt;span class="nd"&gt;:nth-child&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;grid-column&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;span&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://qncdn.mopic.mozigu.net/work/143/25/b4c2a3b2dc0a4f6a/image-7.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;第一张卡片占 4 列做头图，第 2 到第 3 张占 2 列做次要内容，其他的占 1 列。&lt;/p&gt;

&lt;p&gt;这种布局以前只能用 JavaScript 计算，现在纯 CSS 就行。&lt;/p&gt;

&lt;p&gt;报纸那种复杂版式也能做出来了。&lt;/p&gt;
&lt;h2 id="固定位置也可以"&gt;固定位置也可以&lt;/h2&gt;
&lt;p&gt;你还能指定某个元素放在特定位置。&lt;/p&gt;

&lt;p&gt;比如把 header 固定在最右边的两列：&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;main&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid-lanes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auto-fill&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;24ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;header&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;grid-column&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;-3&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="m"&gt;-1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://qncdn.mopic.mozigu.net/work/143/25/b4c2a3b2dc0a4f6a/image-8.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;不管屏幕多宽，header 都会出现在右边。其他内容该怎么排怎么排。&lt;/p&gt;
&lt;h2 id="横向布局也能做"&gt;横向布局也能做&lt;/h2&gt;
&lt;p&gt;瀑布流是竖着流，Grid Lanes 也能横着流。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://qncdn.mopic.mozigu.net/work/143/25/b4c2a3b2dc0a4f6a/image-9.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;竖着流用 &lt;code&gt;grid-template-columns&lt;/code&gt; 定义列：&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid-lanes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;横着流就用 &lt;code&gt;grid-template-rows&lt;/code&gt; 定义行：&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid-lanes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;grid-template-rows&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;浏览器会根据你定义的是列还是行，自动判断流的方向。&lt;/p&gt;

&lt;p&gt;不用额外设置什么属性，它自己就知道。&lt;/p&gt;
&lt;h2 id="容错度控制"&gt;容错度控制&lt;/h2&gt;
&lt;p&gt;有个新概念叫容错度。&lt;/p&gt;

&lt;p&gt;假设第一列的卡片高度是 100px，第四列是 99px。下一张卡片应该放哪？&lt;/p&gt;

&lt;p&gt;如果追求绝对精确，应该放第四列，因为它矮 1px。&lt;/p&gt;

&lt;p&gt;但这 1px 根本看不出来，而且会导致卡片顺序很乱。用户 Tab 切换时会跳来跳去。&lt;/p&gt;

&lt;p&gt;所以 Grid Lanes 有个默认容错度 &lt;code&gt;1em&lt;/code&gt;。只有高度差超过 1em，浏览器才会认为它们不一样。&lt;/p&gt;

&lt;p&gt;小于 1em 的差异会被忽略，卡片会更倾向于从左到右排列。&lt;/p&gt;

&lt;p&gt;你可以调整这个值：&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="py"&gt;item-tolerance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设大一点，布局更规整，但可能浪费空间。设小一点，空间利用率高，但顺序会更乱。&lt;/p&gt;

&lt;p&gt;根据你的内容大小和内容差异来调。&lt;/p&gt;

&lt;p&gt;注意这个属性名字可能还会改，正式发布前留意一下。&lt;/p&gt;
&lt;h2 id="现在就能试"&gt;现在就能试&lt;/h2&gt;
&lt;p&gt;Safari 技术预览版 234 已经支持了。&lt;/p&gt;

&lt;p&gt;你可以下载来试试，官方 Demo 网站也更新了新语法。&lt;/p&gt;

&lt;p&gt;除了图片瀑布流，还有其他用法。&lt;/p&gt;

&lt;p&gt;比如做 Mega Menu 的底部链接区域。每组链接高度不同，用 Grid Lanes 排起来非常整齐：&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid-lanes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auto-fill&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max-content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;24ch&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="nl"&gt;column-gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="n"&gt;lh&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;各组链接紧密排列，不会浪费空间。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://qncdn.mopic.mozigu.net/work/143/25/b4c2a3b2dc0a4f6a/image-10.png" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="接下来呢"&gt;接下来呢&lt;/h2&gt;
&lt;p&gt;CSS 工作组还有几个细节在讨论，但整体语法已经确定了。&lt;/p&gt;

&lt;p&gt;现在可以学起来，可以做 Demo 玩玩，可以给反馈。&lt;/p&gt;

&lt;p&gt;WebKit 团队从 2022 年中开始做这个功能，现在终于能用了。&lt;/p&gt;

&lt;p&gt;我估计其他浏览器也会很快跟进，毕竟这需求太常见了。&lt;/p&gt;

&lt;p&gt;以后做瀑布流，再也不用引 JavaScript 库了。&lt;/p&gt;
&lt;h2 id="参考资料："&gt;参考资料：&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://webkit.org/blog/17660/introducing-css-grid-lanes/" rel="nofollow" target="_blank" title=""&gt;Introducing Grid Lanes&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://webkit.org/demos/grid-lanes/" rel="nofollow" target="_blank" title=""&gt;Example Gallery&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>Immerse</author>
      <pubDate>Wed, 14 Jan 2026 16:45:25 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6804</link>
      <guid>http://beta.w2solo.com/topics/6804</guid>
    </item>
    <item>
      <title>发现一个宝藏图片对比工具！速度比 ImageMagick 快 6 倍，还是开源的</title>
      <description>&lt;p&gt;大家好，我是 Immerse，一名独立开发者、内容创作者、AGI 实践者。&lt;/p&gt;

&lt;p&gt;关注公众号：&lt;a href="https://yaolifeng.com/other/wx_public_account.webp" rel="nofollow" target="_blank" title=""&gt;沉浸式趣谈&lt;/a&gt;，获取最新文章（更多内容只在公众号更新）&lt;/p&gt;

&lt;p&gt;个人网站：&lt;a href="https://yaolifeng.com" rel="nofollow" target="_blank" title=""&gt;https://yaolifeng.com&lt;/a&gt; 也同步更新。&lt;/p&gt;

&lt;p&gt;转载请在文章开头注明出处和版权信息。&lt;/p&gt;

&lt;p&gt;我会在这里分享关于&lt;code&gt;编程&lt;/code&gt;、&lt;code&gt;独立开发&lt;/code&gt;、&lt;code&gt;AI干货&lt;/code&gt;、&lt;code&gt;开源&lt;/code&gt;、&lt;code&gt;个人思考&lt;/code&gt;等内容。&lt;/p&gt;

&lt;p&gt;如果本文对您有所帮助，欢迎动动小手指一键三连 (&lt;code&gt;点赞&lt;/code&gt;、&lt;code&gt;评论&lt;/code&gt;、&lt;code&gt;转发&lt;/code&gt;)，给我一些支持和鼓励，谢谢！&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;img src="https://raw.githubusercontent.com/dmtrKovalenko/odiff/main/odiff-logo-dark.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;今天给大家分享一个超牛的图片对比工具 — Odiff。&lt;/p&gt;

&lt;p&gt;不仅速度快到飞起，还完全开源免费。&lt;/p&gt;
&lt;h2 id="速度很快"&gt;速度很快&lt;/h2&gt;
&lt;p&gt;官网拿它和常用的 ImageMagick、pixelmatch 对比了一下。&lt;/p&gt;

&lt;p&gt;完整的网页截图：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://qncdn.mopic.mozigu.net/work/143/25/67adbf7cf4c84cf9/image.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;ImageMagick 要 8.8 秒，pixelmatch 要 7.7 秒。&lt;/p&gt;

&lt;p&gt;Odiff？1.2 秒搞定。&lt;/p&gt;

&lt;p&gt;快了 6 倍不止。&lt;/p&gt;

&lt;p&gt;更夸张的是 8K 大图对比：&lt;/p&gt;

&lt;p&gt;别的工具要 9-10 秒，Odiff 只要 2 秒。&lt;/p&gt;
&lt;h2 id="技术方面"&gt;技术方面&lt;/h2&gt;
&lt;p&gt;Odiff 最早用 OCaml 写的，现在用 Zig 重写了。&lt;/p&gt;

&lt;p&gt;支持 SSE2、AVX2、AVX512 和 NEON。&lt;/p&gt;

&lt;p&gt;直接榨干 CPU 的并行计算能力，一次处理多个像素。&lt;/p&gt;

&lt;p&gt;难怪能这么快。&lt;/p&gt;
&lt;h2 id="功能很全"&gt;功能很全&lt;/h2&gt;
&lt;p&gt;快归快，功能没缩水。&lt;/p&gt;

&lt;p&gt;跨格式对比随便玩，jpg 和 png 直接比，不用转格式。&lt;/p&gt;

&lt;p&gt;支持的格式也多：png、jpg、jpeg、webp、tiff 全都行。&lt;/p&gt;

&lt;p&gt;抗锯齿检测、区域忽略这些高级功能也有。&lt;/p&gt;

&lt;p&gt;用的是 YIQ NTSC 算法，判断视觉差异更准确。&lt;/p&gt;

&lt;p&gt;不同布局的图片也能对比。&lt;/p&gt;

&lt;p&gt;输出结果很详细，差异像素数量、百分比、对比图都给你生成好。&lt;/p&gt;
&lt;h2 id="上手超简单"&gt;上手超简单&lt;/h2&gt;
&lt;p&gt;装个 npm 包就能用：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;odiff-bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后直接用命令行：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;odiff base.png compare.png diff.png
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第三个参数是输出的对比图，可以不写。&lt;/p&gt;

&lt;p&gt;如果你想在 Node.js 代码里用，也很简单：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;compare&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;odiff-bin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reason&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;compare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path/to/first.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path/to/second.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path/to/diff.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true 或 false&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 不匹配的原因&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;返回结果会告诉你图片是否匹配。&lt;/p&gt;

&lt;p&gt;如果不匹配，会给出原因：是像素差异，还是布局不同。&lt;/p&gt;

&lt;p&gt;还有差异像素数量和差异百分比。&lt;/p&gt;
&lt;h2 id="还有个服务器模式"&gt;还有个服务器模式&lt;/h2&gt;
&lt;p&gt;对比大量图片的话，推荐用服务器模式。&lt;/p&gt;

&lt;p&gt;Odiff 提供了服务器模式。&lt;/p&gt;

&lt;p&gt;它会启动一个常驻进程，多次对比都用同一个进程，省去了启动开销。&lt;/p&gt;

&lt;p&gt;Node.js 里用起来也很简单：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ODiffServer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;odiff-bin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;ODiffServer&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;compare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;b.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;diff1.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;compare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;c.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;d.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;diff2.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;还可以设置超时时间，防止某个对比卡住：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;compare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;b.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;diff.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;服务器模式还会自动根据 CPU 核心数并行处理。&lt;/p&gt;

&lt;p&gt;多个测试用例同时跑也不会阻塞。&lt;/p&gt;
&lt;h2 id="集成也很方便"&gt;集成也很方便&lt;/h2&gt;
&lt;p&gt;用 Playwright 的话，有专门的插件：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;playwright-odiff
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在测试文件里：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;playwright-odiff/setup&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;toHaveScreenshotOdiff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;screenshot-name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cypress 也有对应的插件 cypress-odiff。&lt;/p&gt;

&lt;p&gt;还有很多视觉回归测试服务直接集成了 Odiff。&lt;/p&gt;

&lt;p&gt;比如 LostPixel、Argos CI、Visual Regression Tracker。&lt;/p&gt;

&lt;p&gt;Argos CI 之前发推说，换到 Odiff 之后速度提升了 8 倍。&lt;/p&gt;
&lt;h2 id="完全开源免费"&gt;完全开源免费&lt;/h2&gt;
&lt;p&gt;Odiff 是 MIT 协议的开源项目。&lt;/p&gt;

&lt;p&gt;代码全在 GitHub 上，维护也很活跃。&lt;/p&gt;

&lt;p&gt;提供预编译的二进制文件，Windows、Mac、Linux 都支持。&lt;/p&gt;

&lt;p&gt;npm 安装的话，会自动下载对应平台的版本，不用操心。&lt;/p&gt;
&lt;h2 id="写在最后"&gt;写在最后&lt;/h2&gt;
&lt;p&gt;做视觉回归测试，或者平时需要对比图片的话。&lt;/p&gt;

&lt;p&gt;强烈推荐试试 Odiff。&lt;/p&gt;

&lt;p&gt;速度快到飞起，功能还全，开箱即用。&lt;/p&gt;

&lt;p&gt;关键还是开源免费的，良心。&lt;/p&gt;

&lt;p&gt;项目地址：&lt;a href="https://github.com/dmtrKovalenko/odiff" rel="nofollow" target="_blank"&gt;https://github.com/dmtrKovalenko/odiff&lt;/a&gt;&lt;/p&gt;</description>
      <author>Immerse</author>
      <pubDate>Wed, 07 Jan 2026 14:57:31 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6774</link>
      <guid>http://beta.w2solo.com/topics/6774</guid>
    </item>
    <item>
      <title>《独立开发者精选工具》第 025 期</title>
      <description>&lt;p&gt;&lt;a href="https://www.indietools.work" rel="nofollow" target="_blank" title=""&gt;&lt;img src="https://qncdn.mopic.mozigu.net/work/143/25/1fc1ebd511a54d5e/a1bada9_640.webp" title="" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Indie Tools 是一个收录独立开发、AI 出海领域最新、最实用的免费工具与资源工具站。让你快速找到所需，专注于创造产品。&lt;/p&gt;

&lt;p&gt;独立开发者必备网站：&lt;a href="https://www.indietools.work" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;https://www.indietools.work&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Github: &lt;a href="https://github.com/yaolifeng0629/Awesome-independent-tools" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;https://github.com/yaolifeng0629/Awesome-independent-tools&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;如果本文能给你提供启发和帮助，感谢各位小伙伴动动小手指，一键三连 (点赞、评论、转发)，给我一些支持和鼓励，谢谢。&lt;/p&gt;
&lt;h2 id="Rapidlaunch"&gt;Rapidlaunch&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;基于 Next.js 的快速启动库，提供 Starter Kits 和组件，加速 Web 开发。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/51a4f872-e4de-4f73-9c3e-d867784bb5db.webp" title="" alt="Rapidlaunch"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/rapidlaunch&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 提供多种 Starter Kits，快速搭建基础架构。&lt;/li&gt;
&lt;li&gt; 包含即用型 UI 组件，快速拼装界面。&lt;/li&gt;
&lt;li&gt; 基于 Next.js，支持服务端渲染。&lt;/li&gt;
&lt;li&gt; 代码开源，结构清晰，易于定制。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="使用场景"&gt;使用场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 快速启动新项目原型。&lt;/li&gt;
&lt;li&gt; 构建后台或营销页面时寻找 UI 模块。&lt;/li&gt;
&lt;li&gt; 团队统一项目结构和规范。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 维护依赖社区贡献。&lt;/li&gt;
&lt;li&gt; 绑定 Next.js，不适用其他框架。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="precedent"&gt;precedent&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;Next.js 项目的精选组件和工具库，加速现代化应用开发。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/527a5f4b-0bfa-41be-bd4c-592777a56238.webp" title="" alt="precedent"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/precedent&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 提供模态框等精选 UI 组件。&lt;/li&gt;
&lt;li&gt; 包含实用自定义 React Hooks。&lt;/li&gt;
&lt;li&gt; 内置 Next.js App Router 工具函数。&lt;/li&gt;
&lt;li&gt; TypeScript 编写，类型安全。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="使用场景"&gt;使用场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 快速启动高质量 Next.js 项目。&lt;/li&gt;
&lt;li&gt; 统一团队 UI 和代码规范。&lt;/li&gt;
&lt;li&gt; 构建高体验 Web 应用。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 个人维护，设计可能不合众口。&lt;/li&gt;
&lt;li&gt; 初学者需时间理解其结构。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="Next-JS-Landing-Page-Starter-Template"&gt;Next-JS-Landing-Page-Starter-Template&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;基于 Next.js 14 的开箱即用着陆页模板，集成完整工具链。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/bab3f990-ca17-4f61-a577-7981c3d5df12.webp" title="" alt="Next-JS-Landing-Page-Starter-Template"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/next-js-landing-page-starter-template&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; Next.js 14 + App Router，高性能。&lt;/li&gt;
&lt;li&gt; TypeScript + Tailwind CSS 3，类型安全且样式高效。&lt;/li&gt;
&lt;li&gt; 内置 ESLint、Prettier 等代码质量工具。&lt;/li&gt;
&lt;li&gt; 预配置 VSCode 和 Netlify 部署。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="使用场景"&gt;使用场景&lt;/h3&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 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 设计基础，需定制品牌风格。&lt;/li&gt;
&lt;li&gt; 面向开发者，学习成本较高。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="Startup is free Next.js template"&gt;Startup is free Next.js template&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;专为 SaaS 初创公司设计的免费 Next.js 模板，含核心页面与组件。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/5072fa22-ab09-48f4-a2e3-4ddf2ed3ce13.webp" title="" alt="Startup is free Next.js template"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/startup-free-nextjs-saas-template&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 基于 Next.js，性能与 SEO 优异。&lt;/li&gt;
&lt;li&gt; 包含主页、定价等 SaaS 必备页面。&lt;/li&gt;
&lt;li&gt; 提供预构建 UI 组件和布局。&lt;/li&gt;
&lt;li&gt; 设计现代响应式，适配多端。&lt;/li&gt;
&lt;li&gt; 开源免费，易于定制。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="使用场景"&gt;使用场景&lt;/h3&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 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 通用设计，需定制品牌风格。&lt;/li&gt;
&lt;li&gt; 仅含前端，需自行集成后端。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="next-saas-starter"&gt;next-saas-starter&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;基于 Next.js 的免费响应式 SaaS 落地页模板，JAMStack 架构。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/84103887-4668-4f70-b6f2-e981d0b41829.webp" title="" alt="next-saas-starter"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/next-saas-starter&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; Next.js 构建，支持 SSR，SEO 友好。&lt;/li&gt;
&lt;li&gt; JAMStack 架构，安全快速。&lt;/li&gt;
&lt;li&gt; 完全响应式设计。&lt;/li&gt;
&lt;li&gt; 集成 Tailwind CSS，易定制。&lt;/li&gt;
&lt;li&gt; 包含 SaaS 核心组件。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="使用场景"&gt;使用场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 快速构建 SaaS 营销网站。&lt;/li&gt;
&lt;li&gt; 获取高性能 Next.js 项目起点。&lt;/li&gt;
&lt;li&gt; 构建静态化 Web 应用。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 功能基础，需扩展业务逻辑。&lt;/li&gt;
&lt;li&gt; 仅含前端，需集成后端。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="relivator-nextjs-template"&gt;relivator-nextjs-template&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;基于 Next.js 15 和 React 19 的全栈电商 SaaS 模板，集成支付与认证。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/c8ab4075-aed8-4445-8d03-adcca32cc9e3.webp" title="" alt="relivator-nextjs-template"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/relivator-nextjs-template&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; Next.js 15 + React 19，体验现代。&lt;/li&gt;
&lt;li&gt; 集成 Auth、支付、UI 库和 ORM。&lt;/li&gt;
&lt;li&gt; 提供完整电商功能模块。&lt;/li&gt;
&lt;li&gt; 支持深色模式，Tailwind CSS 定制。&lt;/li&gt;
&lt;li&gt; TypeScript 编写，类型安全。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="使用场景"&gt;使用场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 快速启动全栈电商或 SaaS 项目。&lt;/li&gt;
&lt;li&gt; 寻求高集成度 React/Next.js 模板。&lt;/li&gt;
&lt;li&gt; 构建含支付的用户系统。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 技术栈复杂，上手曲线陡峭。&lt;/li&gt;
&lt;li&gt; 功能繁多，简单项目可能显得臃肿。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="free-nextjs-admin-dashboard"&gt;free-nextjs-admin-dashboard&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;基于 Next.js 和 Tailwind CSS 的免费开源后台管理模板。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/827f3792-9b51-4942-8f8a-15abdb36f6be.webp" title="" alt="free-nextjs-admin-dashboard"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/free-nextjs-admin-dashboard&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; Next.js + Tailwind CSS，高效开发。&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;h3 id="使用场景"&gt;使用场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 快速构建后台管理或仪表盘。&lt;/li&gt;
&lt;li&gt; 学习 Next.js 实战开发。&lt;/li&gt;
&lt;li&gt; 项目原型快速开发。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 缺乏高级功能或企业支持。&lt;/li&gt;
&lt;li&gt; 界面基础，复杂项目需定制。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="chadnext"&gt;chadnext&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;功能丰富的 Next.js 15 全栈启动模板，集成 UI、认证、数据库和支付。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/f47c61fc-d775-49a9-a8d6-6cea6b4c7305.webp" title="" alt="chadnext"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/chadnext&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; Next.js 15 App Router，支持 SSR。&lt;/li&gt;
&lt;li&gt; 集成 Shadcn/ui 组件库。&lt;/li&gt;
&lt;li&gt; 内置 LuciaAuth 认证。&lt;/li&gt;
&lt;li&gt; 使用 Prisma ORM。&lt;/li&gt;
&lt;li&gt; 预配置 Stripe 支付。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="使用场景"&gt;使用场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 快速启动全栈 Web 应用。&lt;/li&gt;
&lt;li&gt; 构建含支付的 SaaS 产品。&lt;/li&gt;
&lt;li&gt; 寻求开箱即用的基础框架。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 技术栈固定，灵活性受限。&lt;/li&gt;
&lt;li&gt; 集成功能多，简单项目略显臃肿。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="Next.js-Developer-Portfolio-Starter-Code"&gt;Next.js-Developer-Portfolio-Starter-Code&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;基于 Next.js、Tailwind CSS 和 Framer Motion 的开发者作品集模板。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/17cfc643-99c0-4c84-87b7-0d46cbf1ed1c.webp" title="" alt="Next.js-Developer-Portfolio-Starter-Code"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/nextjs-developer-portfolio-starter-code&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; Next.js 框架，SEO 与性能优异。&lt;/li&gt;
&lt;li&gt; Tailwind CSS 样式，响应式设计。&lt;/li&gt;
&lt;li&gt; 集成 Framer Motion 动画。&lt;/li&gt;
&lt;li&gt; 包含作品集核心页面。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="使用场景"&gt;使用场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 快速搭建个人展示网站。&lt;/li&gt;
&lt;li&gt; 学习 Next.js 动画实战。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 功能设计基础，需深度定制。&lt;/li&gt;
&lt;li&gt; 依赖特定技术栈，需学习成本。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="Galaxy"&gt;Galaxy&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;专为工程师设计的现代化 SQL 编辑器，集成 AI 辅助与团队协作。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/ca33eaf8-85ee-4f7f-b2b2-88de3a3b74ca.webp" title="" alt="Galaxy"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/galaxy&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 高性能，轻量级内存占用。&lt;/li&gt;
&lt;li&gt; 内置 AI 助手辅助 SQL 编写。&lt;/li&gt;
&lt;li&gt; 支持实时协作与权限管理。&lt;/li&gt;
&lt;li&gt; 企业级安全标准。&lt;/li&gt;
&lt;li&gt; 优化 SQL 工作流体验。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="使用场景"&gt;使用场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 高效编写和调试 SQL。&lt;/li&gt;
&lt;li&gt; 团队协作分析数据。&lt;/li&gt;
&lt;li&gt; 企业级安全 SQL 开发。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 聚焦 SQL，数据可视化功能有限。&lt;/li&gt;
&lt;li&gt; 生态系统尚不如老牌工具完善。&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>Immerse</author>
      <pubDate>Fri, 02 Jan 2026 16:56:19 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6759</link>
      <guid>http://beta.w2solo.com/topics/6759</guid>
    </item>
    <item>
      <title>Knip - 一键清理项目无用代码</title>
      <description>&lt;p&gt;大家好，我是 Immerse，一名独立开发者、内容创作者、AGI 实践者。&lt;/p&gt;

&lt;p&gt;关注公众号：&lt;a href="https://yaolifeng.com/other/wx_public_account.webp" rel="nofollow" target="_blank" title=""&gt;沉浸式趣谈&lt;/a&gt;，获取最新文章（更多内容只在公众号更新）&lt;/p&gt;

&lt;p&gt;个人网站：&lt;a href="https://yaolifeng.com" rel="nofollow" target="_blank" title=""&gt;https://yaolifeng.com&lt;/a&gt; 也同步更新。&lt;/p&gt;

&lt;p&gt;转载请在文章开头注明出处和版权信息。&lt;/p&gt;

&lt;p&gt;我会在这里分享关于&lt;code&gt;编程&lt;/code&gt;、&lt;code&gt;独立开发&lt;/code&gt;、&lt;code&gt;AI干货&lt;/code&gt;、&lt;code&gt;开源&lt;/code&gt;、&lt;code&gt;个人思考&lt;/code&gt;等内容。&lt;/p&gt;

&lt;p&gt;如果本文对您有所帮助，欢迎动动小手指一键三连 (&lt;code&gt;点赞&lt;/code&gt;、&lt;code&gt;评论&lt;/code&gt;、&lt;code&gt;转发&lt;/code&gt;)，给我一些支持和鼓励，谢谢！&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="什么是 Knip？"&gt;什么是 Knip？&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://qncdn.mopic.mozigu.net/work/143/25/ea92ff7b3c02499c/image.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;Knip 是一个专门用来清理 JavaScript 和 TypeScript 项目的工具。&lt;/p&gt;
&lt;h2 id="它能帮你找到什么？"&gt;它能帮你找到什么？&lt;/h2&gt;
&lt;p&gt;Knip 主要帮你找出三类"垃圾代码"：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;未使用的依赖包&lt;/strong&gt; - 你安装了但实际没用到的 npm 包&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;h2 id="如何使用？"&gt;如何使用？&lt;/h2&gt;&lt;h3 id="快速开始"&gt;快速开始&lt;/h3&gt;
&lt;p&gt;使用非常简单！只需要一条命令：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init @knip/config
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个命令会：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;自动安装 Knip&lt;/li&gt;
&lt;li&gt;在你的 &lt;code&gt;package.json&lt;/code&gt; 中添加运行脚本&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;然后运行：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run knip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Knip 就会开始分析你的项目，告诉你哪些依赖、导出和文件没有被使用。&lt;/p&gt;
&lt;h3 id="系统要求"&gt;系统要求&lt;/h3&gt;
&lt;p&gt;Knip 需要 Node.js 18.18.0 或更高版本，也支持 Bun。&lt;/p&gt;
&lt;h2 id="强大的生态支持"&gt;强大的生态支持&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://qncdn.mopic.mozigu.net/work/143/25/375705bc88a54954/image-1.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;官网：&lt;a href="https://knip.dev" rel="nofollow" target="_blank"&gt;https://knip.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Knip 不是一个简单的工具，它内置了 100+ 个插件，支持各种流行的框架和工具，比如：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Astro、Next.js、Remix、Svelte&lt;/li&gt;
&lt;li&gt;Jest、Vitest、Cypress&lt;/li&gt;
&lt;li&gt;ESLint、Webpack、Vite&lt;/li&gt;
&lt;li&gt;GitHub Actions、Nx、Storybook&lt;/li&gt;
&lt;li&gt;以及更多...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这意味着 Knip 能够理解这些工具的配置文件，准确分析你的项目结构。&lt;/p&gt;</description>
      <author>Immerse</author>
      <pubDate>Wed, 24 Dec 2025 14:40:51 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6728</link>
      <guid>http://beta.w2solo.com/topics/6728</guid>
    </item>
    <item>
      <title>Node.js 原生功能狂飙，15 个热门 npm 包要失业了</title>
      <description>&lt;p&gt;大家好，我是 Immerse，一名独立开发者、内容创作者、AGI 实践者。&lt;/p&gt;

&lt;p&gt;关注公众号：&lt;a href="https://yaolifeng.com/other/wx_public_account.webp" rel="nofollow" target="_blank" title=""&gt;沉浸式趣谈&lt;/a&gt;，获取最新文章（更多内容只在公众号更新）&lt;/p&gt;

&lt;p&gt;个人网站：&lt;a href="https://yaolifeng.com" rel="nofollow" target="_blank" title=""&gt;https://yaolifeng.com&lt;/a&gt; 也同步更新。&lt;/p&gt;

&lt;p&gt;转载请在文章开头注明出处和版权信息。&lt;/p&gt;

&lt;p&gt;我会在这里分享关于&lt;code&gt;编程&lt;/code&gt;、&lt;code&gt;独立开发&lt;/code&gt;、&lt;code&gt;AI干货&lt;/code&gt;、&lt;code&gt;开源&lt;/code&gt;、&lt;code&gt;个人思考&lt;/code&gt;等内容。&lt;/p&gt;

&lt;p&gt;如果本文对您有所帮助，欢迎动动小手指一键三连 (&lt;code&gt;点赞&lt;/code&gt;、&lt;code&gt;评论&lt;/code&gt;、&lt;code&gt;转发&lt;/code&gt;)，给我一些支持和鼓励，谢谢！&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;之前装个 Node.js 项目，npm 包能装一大堆。&lt;/p&gt;

&lt;p&gt;现在发现很多包其实不用装了，Node.js 自己就支持。&lt;/p&gt;

&lt;p&gt;这次整理了 15 个已经被 Node.js 原生功能替代的热门 npm 包。&lt;/p&gt;

&lt;p&gt;有些已经稳定了，有些还在实验阶段，但都能用起来了。&lt;/p&gt;
&lt;h2 id="fetch 终于成全局函数了"&gt;fetch 终于成全局函数了&lt;/h2&gt;
&lt;p&gt;以前在 Node.js 里用 fetch，必须装 node-fetch。&lt;/p&gt;

&lt;p&gt;现在 Node.js 18 开始，fetch 已经是全局函数了，和浏览器里的用法完全一样。&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.github.com/repos/nodejs/node&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;full_name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;直接就能用，不用装任何包。&lt;/p&gt;

&lt;p&gt;Node.js 17.5 开始实验性支持，到 18 就稳定了。&lt;/p&gt;

&lt;p&gt;如果你的项目还在用 Node.js 18 之前的版本，那还是得装 node-fetch。&lt;/p&gt;
&lt;h2 id="WebSocket 也原生支持了"&gt;WebSocket 也原生支持了&lt;/h2&gt;
&lt;p&gt;之前做 WebSocket 客户端，基本都用 ws 这个包。&lt;/p&gt;

&lt;p&gt;现在 Node.js 有了全局的 WebSocket 类。&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;WebSocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;wss://echo.websocket.org&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onopen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onmessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Received:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Node.js 21 加的，不过还是实验性的。&lt;/p&gt;

&lt;p&gt;要注意的是，这只是客户端支持。&lt;/p&gt;

&lt;p&gt;如果要做 WebSocket 服务端，还是得用 ws 或者其他库。&lt;/p&gt;
&lt;h2 id="测试框架不用装了"&gt;测试框架不用装了&lt;/h2&gt;
&lt;p&gt;以前写测试，要装 mocha、jest 这些框架。&lt;/p&gt;

&lt;p&gt;现在 Node.js 自带测试模块 node:test。&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;test&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:test&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:assert&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;addition works&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;strictEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Node.js 18 加的实验性功能，到 20 就稳定了。&lt;/p&gt;

&lt;p&gt;如果需要快照测试、mock 这些高级功能，第三方框架还是更强。&lt;/p&gt;

&lt;p&gt;不过对于模块级别的测试，node:test 完全够用了。&lt;/p&gt;
&lt;h2 id="SQLite 也要原生支持了"&gt;SQLite 也要原生支持了&lt;/h2&gt;
&lt;p&gt;之前用 SQLite，要装 sqlite3 或 better-sqlite3。&lt;/p&gt;

&lt;p&gt;这俩包都需要编译原生模块，升级 Node.js 版本经常出问题。&lt;/p&gt;

&lt;p&gt;现在 Node.js 在开发 node:sqlite 模块。&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;open&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:sqlite&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;:memory:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;CREATE TABLE users (id INTEGER, name TEXT)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不过还是实验性的，等稳定了就能彻底告别编译问题了。&lt;/p&gt;
&lt;h2 id="控制台彩色输出不用装 chalk 了"&gt;控制台彩色输出不用装 chalk 了&lt;/h2&gt;
&lt;p&gt;给控制台输出加颜色，以前都用 chalk 或 kleur。&lt;/p&gt;

&lt;p&gt;现在 Node.js 有 util.styleText 函数。&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;styleText&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:util&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;styleText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;red&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;styleText&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bold&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;green&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Success!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Node.js 20.12 加的，到 22.17 就稳定了。&lt;/p&gt;

&lt;p&gt;如果需要复杂的主题配置或链式调用，chalk 还是更好用。&lt;/p&gt;

&lt;p&gt;但简单的颜色输出，原生的就够了。&lt;/p&gt;
&lt;h2 id="清理 ANSI 码也不用装包了"&gt;清理 ANSI 码也不用装包了&lt;/h2&gt;
&lt;p&gt;以前要去掉日志里的 ANSI 转义码，得装 strip-ansi。&lt;/p&gt;

&lt;p&gt;现在有 util.stripVTControlCharacters 函数。&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;stripVTControlCharacters&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:util&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;u001B[4mUnderlined&lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;u001B[0m&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;stripVTControlCharacters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;原生处理，稳定可靠。&lt;/p&gt;

&lt;p&gt;基本不需要再装第三方包了。&lt;/p&gt;
&lt;h2 id="glob 匹配文件也原生了"&gt;glob 匹配文件也原生了&lt;/h2&gt;
&lt;p&gt;匹配文件路径，以前必须用 glob 包。&lt;/p&gt;

&lt;p&gt;Node.js 22 开始有 fs.glob 函数了。&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:fs/promises&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;**/*.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;22 版本就稳定了，可以放心用。&lt;/p&gt;

&lt;p&gt;老项目还在用旧版本 Node.js 的话，还是得继续用 glob 包。&lt;/p&gt;
&lt;h2 id="递归删除目录不用 rimraf 了"&gt;递归删除目录不用 rimraf 了&lt;/h2&gt;
&lt;p&gt;删除整个目录树，以前都用 rimraf。&lt;/p&gt;

&lt;p&gt;现在 fs.rm 直接支持递归删除。&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:fs/promises&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dist&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;recursive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;force&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Node.js 12.10 就有了，现在所有 LTS 版本都稳定支持。&lt;/p&gt;
&lt;h2 id="递归创建目录也不用 mkdir 了"&gt;递归创建目录也不用 mkdir 了&lt;/h2&gt;
&lt;p&gt;创建多级目录，以前要装 mkdir。&lt;/p&gt;

&lt;p&gt;现在 fs.mkdir 原生支持。&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;logs/app&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;recursive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Node.js 10.12 就加了，早就稳定了。&lt;/p&gt;
&lt;h2 id="UUID 生成不用装包了"&gt;UUID 生成不用装包了&lt;/h2&gt;
&lt;p&gt;生成 UUID v4，以前要装 uuid 包。&lt;/p&gt;

&lt;p&gt;现在 crypto 模块自带 randomUUID 函数。&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;randomUUID&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:crypto&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Node.js 14.17 就有了，稳定版本。&lt;/p&gt;
&lt;h2 id="Base64 编解码也原生支持了"&gt;Base64 编解码也原生支持了&lt;/h2&gt;
&lt;p&gt;以前要 polyfill atob 和 btoa 函数。&lt;/p&gt;

&lt;p&gt;现在这俩已经是全局函数了。&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;encoded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;btoa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;encoded&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;atob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;encoded&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buffer 一直都有，现在加上 atob 和 btoa，浏览器和 Node.js 的代码终于统一了。&lt;/p&gt;

&lt;p&gt;Node.js 20 左右加的，现在 LTS 版本都有。&lt;/p&gt;
&lt;h2 id="URL 路由匹配有了 URLPattern"&gt;URL 路由匹配有了 URLPattern&lt;/h2&gt;
&lt;p&gt;做路由匹配，以前要装 url-pattern。&lt;/p&gt;

&lt;p&gt;现在有全局的 URLPattern API。&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;URLPattern&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/users/:id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/users/42&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Node.js 20 加的，不过还是实验性的。&lt;/p&gt;

&lt;p&gt;但已经能用了，而且和浏览器的 URLPattern 完全一样。&lt;/p&gt;
&lt;h2 id="加载 .env 文件不一定要 dotenv 了"&gt;加载 .env 文件不一定要 dotenv 了&lt;/h2&gt;
&lt;p&gt;之前加载环境变量文件，必须装 dotenv。&lt;/p&gt;

&lt;p&gt;现在可以用 --env-file 参数。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node --env-file=.env app.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Node.js 20.10 加的实验性功能。&lt;/p&gt;

&lt;p&gt;如果需要变量展开或多文件支持，dotenv 还是更强。&lt;/p&gt;

&lt;p&gt;但简单场景下，原生的就够了。&lt;/p&gt;
&lt;h2 id="EventTarget 也是全局的了"&gt;EventTarget 也是全局的了&lt;/h2&gt;
&lt;p&gt;以前 Node.js 只有 EventEmitter，要用 Web 标准的 EventTarget 得装 event-target-shim。&lt;/p&gt;

&lt;p&gt;现在 EventTarget 已经是全局的了。&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;EventTarget&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ping&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pong&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dispatchEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ping&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Node.js 15 加的，15.4 就稳定了。&lt;/p&gt;

&lt;p&gt;浏览器和 Node.js 终于可以用同样的事件 API 了。&lt;/p&gt;
&lt;h2 id="运行 TypeScript 不一定要 tsc 了"&gt;运行 TypeScript 不一定要 tsc 了&lt;/h2&gt;
&lt;p&gt;以前运行 .ts 文件，要装 TypeScript 编译器或 ts-node。&lt;/p&gt;

&lt;p&gt;现在 Node.js 有实验性的 TypeScript 支持。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node --experimental-strip-types app.ts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Node.js 21 加的实验性功能。&lt;/p&gt;

&lt;p&gt;不过这只是去掉类型标注，不做类型检查。&lt;/p&gt;

&lt;p&gt;生产环境还是得用完整的 TypeScript 工具链。&lt;/p&gt;
&lt;h2 id="为啥 Node.js 要把这些功能内置"&gt;为啥 Node.js 要把这些功能内置&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;/p&gt;

&lt;p&gt;降低供应链攻击风险，不用担心某个包被投毒。&lt;/p&gt;

&lt;p&gt;代码在浏览器和服务端之间更容易移植。&lt;/p&gt;
&lt;h2 id="能用就用起来"&gt;能用就用起来&lt;/h2&gt;
&lt;p&gt;这些原生功能，浏览器支持好的就可以直接用了。&lt;/p&gt;

&lt;p&gt;实验性的功能可以在开发环境先试试。&lt;/p&gt;</description>
      <author>Immerse</author>
      <pubDate>Mon, 22 Dec 2025 12:01:26 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6721</link>
      <guid>http://beta.w2solo.com/topics/6721</guid>
    </item>
    <item>
      <title>《独立开发者精选工具》第 024 期</title>
      <description>&lt;p&gt;&lt;a href="https://www.indietools.work" rel="nofollow" target="_blank" title=""&gt;&lt;img src="https://qncdn.mopic.mozigu.net/work/143/25/1fc1ebd511a54d5e/a1bada9_640.webp" title="" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Indie Tools 是一个收录独立开发、AI 出海领域最新、最实用的免费工具与资源工具站。让你快速找到所需，专注于创造产品。&lt;/p&gt;

&lt;p&gt;独立开发者必备网站：&lt;a href="https://www.indietools.work" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;https://www.indietools.work&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Github: &lt;a href="https://github.com/yaolifeng0629/Awesome-independent-tools" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;https://github.com/yaolifeng0629/Awesome-independent-tools&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;如果本文能给你提供启发和帮助，感谢各位小伙伴动动小手指，一键三连 (点赞、评论、转发)，给我一些支持和鼓励，谢谢。&lt;/p&gt;
&lt;h2 id="Awesome Shadcn UI"&gt;Awesome Shadcn UI&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;一个精心整理的 Shadcn UI 资源大全，汇集了组件库、模板和工具等两百多个资源。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/5d76c73e-57ae-4c38-9802-91c3b10f5c33.webp" title="" alt="Awesome Shadcn UI"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/awesome-shadcn-ui&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 资源分类清晰，涵盖组件库、模板、工具等 13 个不同类别。&lt;/li&gt;
&lt;li&gt; 收录资源丰富，包含超过 200 个与 Shadcn UI 相关的优质项目。&lt;/li&gt;
&lt;li&gt; 提供可直接使用的 SaaS 模板，集成了认证、支付等后端功能。&lt;/li&gt;
&lt;li&gt; 包含大量 Landing Page 和 UI 组件模板，方便快速启动项目。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="使用场景"&gt;使用场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 开发者需要快速查找高质量的 Shadcn UI 组件或模板时。&lt;/li&gt;
&lt;li&gt; 希望基于 Shadcn UI 构建完整 SaaS 应用或落地页的团队。&lt;/li&gt;
&lt;li&gt; 寻找扩展组件或工具来增强 Shadcn UI 项目功能的场景。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 作为第三方合集，资源质量依赖社区维护，需自行甄别。&lt;/li&gt;
&lt;li&gt; 内容可能更新不及时，无法保证所有链接长期有效。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="mobbin"&gt;mobbin&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;一个专注于移动端应用界面设计的灵感库，提供海量真实产品截图。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/1ea6ac65-be00-4802-be19-893df8f91f84.webp" title="" alt="mobbin"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/mobbin&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&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 id="使用场景"&gt;使用场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 设计师需要参考流行应用的具体交互或视觉设计时。&lt;/li&gt;
&lt;li&gt; 产品经理规划新功能，寻找同类功能的实现参考。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 高级功能（如完整设计流程查看）需要付费订阅。&lt;/li&gt;
&lt;li&gt; 内容主要为截图，缺乏背后的设计逻辑和用户数据支撑。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="https://www.savantlook.com"&gt;&lt;a href="https://www.savantlook.com" rel="nofollow" target="_blank"&gt;https://www.savantlook.com&lt;/a&gt;&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;一款基于 Semrush API 构建的 SEO 数据查询与分析工具，功能聚焦且实用。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/a51d78a1-8c0a-4958-bb09-4e3394b85d38.webp" title="" alt="https://www.savantlook.com"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/savantlook&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 提供域名概览查询，快速了解网站的核心 SEO 指标与流量概况。&lt;/li&gt;
&lt;li&gt; 内置关键词魔法工具，可进行关键词拓展与相关词挖掘分析。&lt;/li&gt;
&lt;li&gt; 工具设计简洁，操作直接，能快速获取关键数据结果。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="使用场景"&gt;使用场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; SEO 从业者需要快速查询竞争对手域名或关键词的初步数据。&lt;/li&gt;
&lt;li&gt; 内容营销人员在策划主题时，用于进行关键词的拓展与筛选。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 功能深度依赖 Semrush 数据源，功能相对基础。&lt;/li&gt;
&lt;li&gt; 作为第三方工具，其功能与稳定性受限于 Semrush 官方 API。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="Free Website Traffic Checker"&gt;Free Website Traffic Checker&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;一款功能全面且免费的网站流量查询工具，支持多种查询模式，适合快速获取网站流量数据。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/f440de12-5375-4350-a154-95ef3da04297.webp" title="" alt="Free Website Traffic Checker"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/free-website-traffic-checker&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&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;/ol&gt;
&lt;h3 id="使用场景"&gt;使用场景&lt;/h3&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 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 提供的流量数据为估算值，可能与实际数据存在偏差。&lt;/li&gt;
&lt;li&gt; 高级功能或更详细的数据报告可能需要付费。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="Picir.ai"&gt;Picir.ai&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;一款通过自然语言指令精确编辑图片的 AI 工具，采用先进模型，操作直观。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/382da56a-19aa-42b4-8c91-2cd015b2c197.webp" title="" alt="Picir.ai"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/picir-ai&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 采用 Nano Banana/Gemini 2.5 Flash 等先进模型，实现高质量的图像理解和生成。&lt;/li&gt;
&lt;li&gt; 核心功能是使用自然语言描述来编辑图片，无需复杂软件操作技能。&lt;/li&gt;
&lt;li&gt; 支持对图像进行细节调整、内容修改、风格转换等多种编辑操作。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="使用场景"&gt;使用场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 快速修改图片中的特定元素，如替换物体、调整颜色或修复瑕疵。&lt;/li&gt;
&lt;li&gt; 为社交媒体、博客或演示文稿快速创建或优化所需的视觉素材。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 对复杂或高度专业的编辑需求可能处理能力有限。&lt;/li&gt;
&lt;li&gt; 生成效果完全依赖于输入指令的准确性和模型的当前能力。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="shoteasy"&gt;shoteasy&lt;/h2&gt;&lt;h3 id="一款便捷的在线图片编辑与处理工具"&gt;一款便捷的在线图片编辑与处理工具&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://www.indietools.work/images/8375af1b-40b8-4449-b3bb-57a555f2f5eb.webp" title="" alt="shoteasy"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/shoteasy&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&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 id="使用场景"&gt;使用场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 社交媒体用户快速调整图片尺寸以适应平台要求。&lt;/li&gt;
&lt;li&gt; 需要为文档或演示文稿快速裁剪和简单美化图片。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 功能相对基础，缺乏高级编辑工具。&lt;/li&gt;
&lt;li&gt; 可能存在文件大小或处理数量的限制。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="Remove Object from Photo"&gt;Remove Object from Photo&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;一款基于 AI 的在线图片物体移除工具，操作简单，无需专业技巧即可快速清理图片。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/ebcef366-0555-4f93-82dc-3778a7094dee.webp" title="" alt="Remove Object from Photo"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/remove-object-from-photo&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 核心功能是使用 AI 智能识别，一键擦除照片中不需要的物体或人物。&lt;/li&gt;
&lt;li&gt; 提供画笔工具，让用户可以精确选择需要移除的特定区域。&lt;/li&gt;
&lt;li&gt; 整个过程在线完成，无需下载或安装任何复杂的桌面软件。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="使用场景"&gt;使用场景&lt;/h3&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 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 处理复杂背景或精细物体时，AI 效果可能不完美，需手动调整。&lt;/li&gt;
&lt;li&gt; 作为在线工具，上传和处理大量高清图片可能受网络速度和服务器限制。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="Aluo AI"&gt;Aluo AI&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;一个为电商卖家设计的 AI 图像编辑平台，旨在快速、低成本地制作专业产品图片。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/979309c0-920b-4332-8ef7-687ab5051bba.webp" title="" alt="Aluo AI"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/aluo-ai&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 提供一键移除图片背景功能，简化产品图处理流程。&lt;/li&gt;
&lt;li&gt; 支持 AI 生成多样化的产品场景，无需实体拍摄。&lt;/li&gt;
&lt;li&gt; 宣称能在 30 秒内完成编辑，极大提升工作效率。&lt;/li&gt;
&lt;li&gt; 强调成本仅为传统方式的 1/50，性价比突出。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="使用场景"&gt;使用场景&lt;/h3&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 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 可能对创意和复杂图像编辑需求的支持有限。&lt;/li&gt;
&lt;li&gt; 生成结果的风格和质量可能受 AI 模型限制，不够独特。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="Nano Banana AI Image Edit"&gt;Nano Banana AI Image Edit&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;一款基于自然语言指令、能快速进行局部精准编辑的 AI 图片处理工具。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/84f70018-a975-49e1-9657-914d537873aa.webp" title="" alt="Nano Banana AI Image Edit"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/nano-banana-ai-image-edit&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 核心功能是自然语言局部编辑，用户可用一句话指令精准修改图片特定部分。&lt;/li&gt;
&lt;li&gt; 处理速度极快，号称达到 10 秒级响应，能大幅提升编辑效率。&lt;/li&gt;
&lt;li&gt; 编辑算法注重保留原图细节，避免过度处理导致画质损失。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="使用场景"&gt;使用场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 快速修图：移除照片中不需要的人物、物体或修复污渍、瑕疵。&lt;/li&gt;
&lt;li&gt; 创意调整：轻松改变背景效果、人物姿势或为黑白照片上色。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 作为在线 AI 工具，其处理效果可能对复杂指令或图片存在不确定性。&lt;/li&gt;
&lt;li&gt; 可能需要网络连接，且高级功能可能存在使用次数限制或付费门槛。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="image to pixel"&gt;image to pixel&lt;/h2&gt;&lt;h3 id="一款免费在线工具，可将图片快速转换为复古像素艺术。"&gt;一款免费在线工具，可将图片快速转换为复古像素艺术。&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://www.indietools.work/images/73cb1ba6-e74d-4efc-8f9a-9d8a0ee0a3c5.webp" title="" alt="image to pixel"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/image-to-pixel&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&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 id="使用场景"&gt;使用场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 为独立游戏或社交媒体内容创作复古像素风格素材。&lt;/li&gt;
&lt;li&gt; 将照片或设计稿转换为像素画，用于制作个性化周边产品。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 上传文件大小限制为 10MB，可能无法处理极高分辨率原图。&lt;/li&gt;
&lt;li&gt; 作为在线工具，功能深度可能不及专业像素艺术软件。&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>Immerse</author>
      <pubDate>Thu, 18 Dec 2025 10:23:49 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6660</link>
      <guid>http://beta.w2solo.com/topics/6660</guid>
    </item>
    <item>
      <title>2025 年 Safari 和 iOS 版本检测新思路</title>
      <description>&lt;p&gt;大家好，我是 Immerse，一名独立开发者、内容创作者、AGI 实践者。&lt;/p&gt;

&lt;p&gt;关注公众号：&lt;a href="https://yaolifeng.com/other/wx_public_account.webp" rel="nofollow" target="_blank" title=""&gt;沉浸式趣谈&lt;/a&gt;，获取最新文章（更多内容只在公众号更新）&lt;/p&gt;

&lt;p&gt;个人网站：&lt;a href="https://yaolifeng.com" rel="nofollow" target="_blank" title=""&gt;https://yaolifeng.com&lt;/a&gt; 也同步更新。&lt;/p&gt;

&lt;p&gt;转载请在文章开头注明出处和版权信息。&lt;/p&gt;

&lt;p&gt;我会在这里分享关于&lt;code&gt;编程&lt;/code&gt;、&lt;code&gt;独立开发&lt;/code&gt;、&lt;code&gt;AI干货&lt;/code&gt;、&lt;code&gt;开源&lt;/code&gt;、&lt;code&gt;个人思考&lt;/code&gt;等内容。&lt;/p&gt;

&lt;p&gt;如果本文对您有所帮助，欢迎动动小手指一键三连 (&lt;code&gt;点赞&lt;/code&gt;、&lt;code&gt;评论&lt;/code&gt;、&lt;code&gt;转发&lt;/code&gt;)，给我一些支持和鼓励，谢谢！&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;最近看到一篇文章，针对于 Safari 和 iOS 版本检测很不错，分享出来给大家。&lt;/p&gt;

&lt;p&gt;之前都用 User-Agent 一把嗦，但文章提到检测结果不准确。&lt;/p&gt;
&lt;h2 id="两个方式"&gt;两个方式&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;User-Agent&lt;/li&gt;
&lt;li&gt;特性检测&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="User-Agent 检测"&gt;User-Agent 检测&lt;/h3&gt;
&lt;p&gt;这个方法就是获取浏览器的 User-Agent，从里面提取版本信息。&lt;/p&gt;

&lt;p&gt;但是有问题，这个结果不准确。&lt;/p&gt;

&lt;p&gt;Safari 的 UA 字符串里有两个版本号，一个是技术版本，一个是市场版本。很多脚本会把这俩搞混。&lt;/p&gt;

&lt;p&gt;还有一点，从 macOS 11 开始，Safari 的 UA 里系统版本就不更新了，永远显示 10.15.7。&lt;/p&gt;

&lt;p&gt;所以想从 UA 里准确获取版本？基本不可能。&lt;/p&gt;

&lt;p&gt;MDN 官方都说了，别依赖 UA 字符串做浏览器检测逻辑，这是个常见 bug 源头。&lt;/p&gt;
&lt;h3 id="特性检测"&gt;特性检测&lt;/h3&gt;
&lt;p&gt;苹果官方推荐: 特性检测。&lt;/p&gt;

&lt;p&gt;就是直接检查浏览器支不支持某个 API 或 CSS 特性。&lt;/p&gt;

&lt;p&gt;但它没法区分所有版本，因为很多特性在好几个版本里都有。&lt;/p&gt;
&lt;h2 id="解决思路"&gt;解决思路&lt;/h2&gt;
&lt;p&gt;把两种方法结合起来用, 主要靠特性检测，UA 检测作为补充。&lt;/p&gt;
&lt;h3 id="第一步：检测 WebKit 引擎"&gt;第一步：检测 WebKit 引擎&lt;/h3&gt;
&lt;p&gt;在 iOS 上，所有浏览器都必须用 WebKit，包括 Chrome、Firefox 这些。&lt;/p&gt;

&lt;p&gt;所以检测 WebKit 能帮我们缩小范围：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 桌面 Safari 和所有 iOS 浏览器&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;isWebkit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GestureEvent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// 所有移动端 WebKit 浏览器&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;isMobileWebKit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ongesturechange&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// 只检测桌面 Safari&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;isDesktopWebKit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;undefined&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;safari&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pushNotification&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;safari&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="第二步：检测特定 iOS 版本"&gt;第二步：检测特定 iOS 版本&lt;/h3&gt;
&lt;p&gt;去查 Safari 发布说明或 WebKit 的更新日志，找到某个版本新增的特性。&lt;/p&gt;

&lt;p&gt;比如我想检测 iOS 17.0，发现这个版本加入了 &lt;code&gt;contain-intrinsic-size&lt;/code&gt; 支持。&lt;/p&gt;

&lt;p&gt;那就检测这个特性：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// iOS 17.0+ 返回 true&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isAtLeastiOS17&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;CSS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;supports&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;contain-intrinsic-size&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;100px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果要检测具体的小版本，可以配合下一个版本的特性来排除。&lt;/p&gt;

&lt;p&gt;比如 &lt;code&gt;ManagedMediaSource&lt;/code&gt; 是在 iOS 17.1 才有的：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;supportsManagedMediaSource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ManagedMediaSource&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// 只匹配 iOS 17.0&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;isOnlyiOS170&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;isAtLeastiOS17&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;supportsManagedMediaSource&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isMobileWebKit&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isOnlyiOS170&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// 这是 iOS 17.0&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="第三步：真机测试"&gt;第三步：真机测试&lt;/h3&gt;
&lt;p&gt;理论归理论，实际测试才是王道。&lt;/p&gt;

&lt;p&gt;踩坑：&lt;/p&gt;

&lt;p&gt;iOS 17.6 的发布说明里说支持 CSS 的 &lt;code&gt;safe&lt;/code&gt; 关键字，用 &lt;code&gt;@supports&lt;/code&gt; 检测也返回 true。&lt;/p&gt;

&lt;p&gt;结果真机上一跑，根本不生效。&lt;/p&gt;

&lt;p&gt;这种情况下，只能换个思路，检测实际的渲染效果：&lt;/p&gt;


&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isSafeKeywordSupported&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;container&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;div&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;child&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;span&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;child&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Evil Martians&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;display&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;flex&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;justifyContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;safe center&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;5%&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;position&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;absolute&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;top&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-9999px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-9999px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;child&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;containerRect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getBoundingClientRect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;childRect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;child&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getBoundingClientRect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isCroppedOnLeft&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;childRect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;left&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;containerRect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;removeChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isCroppedOnLeft&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过检查元素的实际渲染位置，判断特性是不是真的生效了。&lt;/p&gt;
&lt;h3 id="第四步：配合 UA 检测"&gt;第四步：配合 UA 检测&lt;/h3&gt;
&lt;p&gt;有时候特性检测也不够用。&lt;/p&gt;

&lt;p&gt;比如要区分 iPad 和其他设备。&lt;/p&gt;

&lt;p&gt;iPad 的 UA 字符串跟 macOS 上的 Safari 一模一样。&lt;/p&gt;

&lt;p&gt;但如果 UA 显示是 macOS，特性检测又显示是移动端 WebKit，那就能判断出这是 iPad：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 检测 iPadOS&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;isiPad&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;isDesktopWebKit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;isMobileWebKit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="几个关键点"&gt;几个关键点&lt;/h2&gt;
&lt;p&gt;WebKit 不等于 Safari，iOS 上所有浏览器都用 WebKit。&lt;/p&gt;

&lt;p&gt;主要用特性检测，UA 检测只是补充。&lt;/p&gt;

&lt;p&gt;多看 Safari 和 WebKit 的发布说明，但也别全信，因为有些变更根本没写进去。&lt;/p&gt;

&lt;p&gt;真机测试不能省，有些 bug 只有在实际设备上才能发现。&lt;/p&gt;

&lt;p&gt;有时候 &lt;code&gt;@supports&lt;/code&gt; 会撒谎，浏览器说支持但实际不行，这时候得检查实际渲染效果。&lt;/p&gt;
&lt;h2 id="写在最后"&gt;写在最后&lt;/h2&gt;
&lt;p&gt;核心思路就是：特性检测为主，UA 检测为辅，真机测试验证。&lt;/p&gt;
&lt;h3 id="参考资料"&gt;参考资料&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://developer.apple.com/documentation/safari-release-notes" rel="nofollow" target="_blank"&gt;https://developer.apple.com/documentation/safari-release-notes&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://webkit.org/" rel="nofollow" target="_blank"&gt;https://webkit.org/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Browser_detection_using_the_user_agent" rel="nofollow" target="_blank"&gt;https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Browser_detection_using_the_user_agent&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>Immerse</author>
      <pubDate>Wed, 10 Dec 2025 15:02:44 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6635</link>
      <guid>http://beta.w2solo.com/topics/6635</guid>
    </item>
    <item>
      <title>《独立开发者精选工具》第 023 期</title>
      <description>&lt;p&gt;&lt;a href="https://www.indietools.work" rel="nofollow" target="_blank" title=""&gt;&lt;img src="https://qncdn.mopic.mozigu.net/work/143/25/1fc1ebd511a54d5e/a1bada9_640.webp" title="" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Indie Tools 是一个收录独立开发、AI 出海领域最新、最实用的免费工具与资源工具站。让你快速找到所需，专注于创造产品。&lt;/p&gt;

&lt;p&gt;独立开发者必备网站：&lt;a href="https://www.indietools.work" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;https://www.indietools.work&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Github: &lt;a href="https://github.com/yaolifeng0629/Awesome-independent-tools" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;https://github.com/yaolifeng0629/Awesome-independent-tools&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;如果本文能给你提供启发和帮助，感谢各位小伙伴动动小手指，一键三连 (点赞、评论、转发)，给我一些支持和鼓励，谢谢。&lt;/p&gt;
&lt;h2 id="favicon-generator"&gt;favicon-generator&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;免费在线 Favicon 生成工具，快速生成多设备图标。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/7164acb0-1dd3-4092-b608-4250663c606c.webp" title="" alt="favicon-generator"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/favicon-generator&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&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;提供可直接嵌入的 HTML 代码。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="使用场景"&gt;使用场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;网站开发者快速创建 Favicon。&lt;/li&gt;
&lt;li&gt;为移动应用或 PWA 生成应用图标。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;高级编辑功能有限。&lt;/li&gt;
&lt;li&gt;网站界面较陈旧。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="WeClone"&gt;WeClone&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;用聊天记录微调大模型，打造个性化数字分身。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/7c2af271-12ff-4fe3-a122-e327556dac4f.webp" title="" alt="WeClone"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/weclone&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&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 id="使用场景"&gt;使用场景&lt;/h3&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 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;数据隐私保护可能不足。&lt;/li&gt;
&lt;li&gt;生成效果受限于基础模型能力。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="Midjourney Sref"&gt;Midjourney Sref&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;收录 4000+ 个 Midjourney 风格参考代码，快速复制艺术风格。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/eb1ab114-5d26-42fd-963c-afe822e20f86.webp" title="" alt="Midjourney Sref"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/midjourney-sref&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;提供超 4000 个精选--sref 代码。&lt;/li&gt;
&lt;li&gt;每个代码配有效果图预览。&lt;/li&gt;
&lt;li&gt;界面简洁，易于搜索浏览。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="使用场景"&gt;使用场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;快速为作品寻找特定艺术风格。&lt;/li&gt;
&lt;li&gt;参考不同风格激发创作灵感。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;风格库庞大，新手选择困难。&lt;/li&gt;
&lt;li&gt;功能单一，缺乏高级筛选。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="awesome-chatgpt-prompts-zh"&gt;awesome-chatgpt-prompts-zh&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;丰富的中文提示词库，提升 ChatGPT 对话质量。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/87a77c73-0c1d-40b7-8dc7-55fa4697feaf.webp" title="" alt="awesome-chatgpt-prompts-zh"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/awesome-chatgpt-prompts-zh&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&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 id="使用场景"&gt;使用场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;让 ChatGPT 扮演特定角色对话。&lt;/li&gt;
&lt;li&gt;为创作者、学生提供提问灵感。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;提示词质量参差不齐。&lt;/li&gt;
&lt;li&gt;主要面向中文用户。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="awesome-chatgpt-prompts"&gt;awesome-chatgpt-prompts&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;社区驱动的 ChatGPT 提示词库，提升与大模型的互动效率。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/ecd2dbdc-f93c-4163-a38c-64d3f54bcfc3.webp" title="" alt="awesome-chatgpt-prompts"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/awesome-chatgpt-prompts&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&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 id="使用场景"&gt;使用场景&lt;/h3&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 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;提示词质量水平不一。&lt;/li&gt;
&lt;li&gt;部分提示词需调整适配新模型。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="minimaxi"&gt;minimaxi&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;高性价比国内文本转语音 API 平台，付费使用。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/44a43eff-1248-4221-acaf-ea1a2dfa5a7b.webp" title="" alt="minimaxi"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/minimaxi&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;多种高自然度音色可选。&lt;/li&gt;
&lt;li&gt;性价比高，适合预算有限用户。&lt;/li&gt;
&lt;li&gt;API 稳定，方便集成。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="使用场景"&gt;使用场景&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;为视频、有声读物生成配音。&lt;/li&gt;
&lt;li&gt;为智能助手提供语音交互。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;需付费，不适合轻度用户。&lt;/li&gt;
&lt;li&gt;国际化和多语言支持有限。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="SnippAI"&gt;SnippAI&lt;/h2&gt;&lt;h3 id="总结"&gt;总结&lt;/h3&gt;
&lt;p&gt;AI 截图工具，智能识别并处理屏幕内容。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://www.indietools.work/images/69da7382-3a6d-4ba1-99ed-d0a56ccca4ac.webp" title="" alt="SnippAI"&gt;&lt;/p&gt;

&lt;p&gt;链接: &lt;code&gt;https://www.indietools.work/product/snippai&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="特性"&gt;特性&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;智能识别截图中的文本、代码或图像。&lt;/li&gt;
&lt;li&gt;AI 驱动的总结、解释和翻译功能。&lt;/li&gt;
&lt;li&gt;一键截图获取 AI 分析结果。&lt;/li&gt;
&lt;li&gt;支持代码片段解释和格式优化。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="使用场景"&gt;使用场景&lt;/h3&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;/ol&gt;
&lt;h3 id="缺点"&gt;缺点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;处理复杂专业内容时可能不精确。&lt;/li&gt;
&lt;li&gt;离线状态下功能受限。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="往期回顾"&gt;往期回顾&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://mp.weixin.qq.com/s/-DDkWXf1gRSwMOhLeJWL_A" rel="nofollow" target="_blank" title=""&gt;《独立开发者精选工具》第 023 期（最新）&lt;/a&gt; 🔥&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://mp.weixin.qq.com/s/IfBFbvZeR8YadX3tynW90w" rel="nofollow" target="_blank" title=""&gt;《独立开发者精选工具》第 022 期&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://mp.weixin.qq.com/s/OGvJKwAxIdLl-P8T_z8fbQ" rel="nofollow" target="_blank" title=""&gt;《独立开发者精选工具》第 021 期&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://mp.weixin.qq.com/s/lsGaGKMBqqETuuhO7NpxFg" rel="nofollow" target="_blank" title=""&gt;《独立开发者精选工具》第 020 期&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://mp.weixin.qq.com/s/PlrojO5X4Ypg61YeXYfVbg" rel="nofollow" target="_blank" title=""&gt;《独立开发者精选工具》第 019 期&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://mp.weixin.qq.com/s/PC-mh4mXADdBQ0ovkDbrLg" rel="nofollow" target="_blank" title=""&gt;《独立开发者精选工具》第 018 期&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://mp.weixin.qq.com/s/i_lSbscGcEMhNSlnKhZESA" rel="nofollow" target="_blank" title=""&gt;《独立开发者精选工具》第 017 期&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://mp.weixin.qq.com/s/xc5saU93KoJh63jFlTAPjw" rel="nofollow" target="_blank" title=""&gt;《独立开发者精选工具》第 016 期&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://mp.weixin.qq.com/s/nHQxIBCU3VGF3x3N10aQ6Q" rel="nofollow" target="_blank" title=""&gt;《独立开发者精选工具》第 015 期&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://mp.weixin.qq.com/s/BkyeqA_BhNY5BrvhQVw_Pw" rel="nofollow" target="_blank" title=""&gt;《独立开发者精选工具》第 014 期&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://mp.weixin.qq.com/s/8RlROZ6HrgsVVDKwBvn8Nw" rel="nofollow" target="_blank" title=""&gt;《独立开发者精选工具》第 013 期&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://mp.weixin.qq.com/s/TJfOjWqphdqu8kkq3I6FCg" rel="nofollow" target="_blank" title=""&gt;《独立开发者精选工具》第 012 期&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://mp.weixin.qq.com/s/oUcBq_0pRU7ucmx03w5_7g" rel="nofollow" target="_blank" title=""&gt;《独立开发者精选工具》第 011 期&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://mp.weixin.qq.com/s/zr-1dGOVFyTF_YG6hrSEsg" rel="nofollow" target="_blank" title=""&gt;《独立开发者精选工具》第 010 期&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://mp.weixin.qq.com/s/eKKBBDtKDb8TIy0wLko-sQ" rel="nofollow" target="_blank" title=""&gt;《独立开发者精选工具》第 009 期&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://mp.weixin.qq.com/s/01oia3vAMUgFN1-_7gIkhA" rel="nofollow" target="_blank" title=""&gt;《独立开发者精选工具》第 008 期&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://mp.weixin.qq.com/s/JFO5rPDbYWstu7c5zdB__Q" rel="nofollow" target="_blank" title=""&gt;《独立开发者精选工具》第 007 期&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://mp.weixin.qq.com/s/cqx-TFZLXFFSf3TRwNa--w" rel="nofollow" target="_blank" title=""&gt;《独立开发者精选工具》第 006 期&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://mp.weixin.qq.com/s/9dYLnfOv1Jt565-wvgBsCA" rel="nofollow" target="_blank" title=""&gt;《独立开发者精选工具》第 005 期&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://mp.weixin.qq.com/s/y17Sz3GCOkoAs_kWsFHt_Q" rel="nofollow" target="_blank" title=""&gt;《独立开发者精选工具》第 004 期&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://mp.weixin.qq.com/s/HpcKT6wqQ6E2aFrayyEfLg" rel="nofollow" target="_blank" title=""&gt;《独立开发者精选工具》第 003 期&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://mp.weixin.qq.com/s/7UYPzffH2aWWOIQRR7COlQ" rel="nofollow" target="_blank" title=""&gt;《独立开发者精选工具》第 002 期&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://mp.weixin.qq.com/s/moCAaVlagxiEoURmtP6kmw" rel="nofollow" target="_blank" title=""&gt;《独立开发者精选工具》第 001 期&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>Immerse</author>
      <pubDate>Tue, 02 Dec 2025 15:18:10 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6612</link>
      <guid>http://beta.w2solo.com/topics/6612</guid>
    </item>
    <item>
      <title>2025 年 CSS 新特性大盘点</title>
      <description>&lt;p&gt;大家好，我是 Immerse，一名独立开发者、内容创作者、AGI 实践者。&lt;/p&gt;

&lt;p&gt;关注公众号：&lt;a href="https://yaolifeng.com/other/wx_public_account.webp" rel="nofollow" target="_blank" title=""&gt;沉浸式趣谈&lt;/a&gt;，获取最新文章（更多内容只在公众号更新）&lt;/p&gt;

&lt;p&gt;个人网站：&lt;a href="https://yaolifeng.com" rel="nofollow" target="_blank" title=""&gt;https://yaolifeng.com&lt;/a&gt; 也同步更新。&lt;/p&gt;

&lt;p&gt;转载请在文章开头注明出处和版权信息。&lt;/p&gt;

&lt;p&gt;我会在这里分享关于&lt;code&gt;编程&lt;/code&gt;、&lt;code&gt;独立开发&lt;/code&gt;、&lt;code&gt;AI干货&lt;/code&gt;、&lt;code&gt;开源&lt;/code&gt;、&lt;code&gt;个人思考&lt;/code&gt;等内容。&lt;/p&gt;

&lt;p&gt;如果本文对您有所帮助，欢迎动动小手指一键三连 (&lt;code&gt;点赞&lt;/code&gt;、&lt;code&gt;评论&lt;/code&gt;、&lt;code&gt;转发&lt;/code&gt;)，给我一些支持和鼓励，谢谢！&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;2025 年了，CSS 又进化了&lt;/p&gt;

&lt;p&gt;去年写过一篇 CSS 新特性盘点，本来以为今年不会有太大变化。结果一看，新东西比去年还多。&lt;/p&gt;

&lt;p&gt;这次整理了几个我觉得特别实用的功能，浏览器支持也都不错，可以用起来了。&lt;/p&gt;
&lt;h2 id="终于可以动画到 auto 了"&gt;终于可以动画到 auto 了&lt;/h2&gt;
&lt;p&gt;之前我们做高度展开动画，基本都是靠 max-height 硬撑。&lt;/p&gt;

&lt;p&gt;比如从 0 展开到实际高度，只能写个超大的值，体验很差。&lt;/p&gt;

&lt;p&gt;现在可以直接动画到 auto 了：&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;interpolate-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;allow-keywords&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;加上这一行，所有 height: 0 到 height: auto 的过渡都能生效。&lt;/p&gt;

&lt;p&gt;或者你也可以用 calc-size() 函数，不需要全局设置：&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.content&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="n"&gt;lh&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="m"&gt;0.2s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="err"&gt;&amp;amp;.expanded&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;calc-size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个功能总算来了。&lt;/p&gt;

&lt;p&gt;而且不只是 height，任何接受尺寸的属性都能用，不只是 auto，min-content 这些关键字也行。&lt;/p&gt;

&lt;p&gt;目前 Chrome 已经支持，其他浏览器应该也快了。&lt;/p&gt;
&lt;h2 id="Popover 和 Invoker"&gt;Popover 和 Invoker&lt;/h2&gt;
&lt;p&gt;Popover 是个 HTML 属性，给任意元素加上就有开关功能。&lt;/p&gt;

&lt;p&gt;配合 Invoker 用起来更爽，不用写 JavaScript 就能控制弹窗。&lt;/p&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;commandfor=&lt;/span&gt;&lt;span class="s"&gt;"menu"&lt;/span&gt; &lt;span class="na"&gt;command=&lt;/span&gt;&lt;span class="s"&gt;"toggle"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  打开菜单
&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"menu"&lt;/span&gt; &lt;span class="na"&gt;popover&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  菜单内容
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样就够了，按钮点击自动控制弹窗显示隐藏。&lt;/p&gt;

&lt;p&gt;浏览器会自动处理无障碍访问、键盘操作、焦点管理这些细节。&lt;/p&gt;

&lt;p&gt;而且还能配合 Anchor Positioning 用，让弹窗自动定位到触发元素旁边。&lt;/p&gt;

&lt;p&gt;Popover 已经全浏览器支持，Invoker 目前只有 Chrome，不过有 polyfill 可以用。&lt;/p&gt;
&lt;h2 id="CSS 里可以写函数了"&gt;CSS 里可以写函数了&lt;/h2&gt;
&lt;p&gt;CSS 有 calc()、clamp() 这些内置函数，现在我们可以自己写了：&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@function&lt;/span&gt; &lt;span class="n"&gt;--titleBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="s1"&gt;" is cool."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后就能在任何地方调用：&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.title&lt;/span&gt;&lt;span class="nd"&gt;::after&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;--titleBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;"CSS"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个功能让 CSS 更像编程语言了。&lt;/p&gt;

&lt;p&gt;把复杂逻辑封装到函数里，代码更清爽，也更好维护。&lt;/p&gt;

&lt;p&gt;不过目前只有 Chrome 支持，可以先用着，不支持的浏览器会回退到默认值。&lt;/p&gt;
&lt;h2 id="if() 函数也来了"&gt;if() 函数也来了&lt;/h2&gt;
&lt;p&gt;CSS 本来就有很多条件逻辑，比如选择器匹配、媒体查询。&lt;/p&gt;

&lt;p&gt;但这次的 if() 函数是第一个专门做条件分支的：&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.grid&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="n"&gt;media&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max-width&lt;/span&gt; &lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;300px&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="err"&gt;media(max-width&lt;/span&gt; &lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;600px):&lt;/span&gt; &lt;span class="err"&gt;repeat(3,&lt;/span&gt; &lt;span class="err"&gt;1fr);&lt;/span&gt;
      &lt;span class="err"&gt;media(max-width&lt;/span&gt; &lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;900px):&lt;/span&gt; &lt;span class="err"&gt;repeat(auto-fit,&lt;/span&gt; &lt;span class="err"&gt;minmax(250px,&lt;/span&gt; &lt;span class="err"&gt;1fr));&lt;/span&gt;
      &lt;span class="py"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="err"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;看起来像不像 switch 语句？第一个匹配的条件会生效。&lt;/p&gt;

&lt;p&gt;条件可以是 media()、supports()、style() 这几种。&lt;/p&gt;

&lt;p&gt;把所有逻辑都写在一个属性里，代码可读性好很多。&lt;/p&gt;

&lt;p&gt;目前 Chrome 独占，其他浏览器还在路上。&lt;/p&gt;
&lt;h2 id="表单输入框自动调整大小"&gt;表单输入框自动调整大小&lt;/h2&gt;
&lt;p&gt;field-sizing 这个属性专门解决表单输入框的问题。&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;textarea&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;field-sizing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;加上这一行，textarea 会自动根据内容调整高度。&lt;/p&gt;

&lt;p&gt;用户输入多少内容，输入框就有多高，不用手动拖拽了。&lt;/p&gt;

&lt;p&gt;在手机上体验特别好，拖拽调整大小本来就很难操作。&lt;/p&gt;

&lt;p&gt;这个功能之前都是用 JavaScript 实现，现在 CSS 原生支持了。&lt;/p&gt;

&lt;p&gt;Chrome 和 Safari 都能用，Firefox 估计也快了。&lt;/p&gt;
&lt;h2 id="select 下拉框终于能自定义样式了"&gt;select 下拉框终于能自定义样式了&lt;/h2&gt;
&lt;p&gt;select 元素的外观一直很难自定义，打开后显示的选项更是完全没法控制。&lt;/p&gt;

&lt;p&gt;现在可以完全自定义了，只要先开启：&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;select&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nd"&gt;::picker&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;select&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;appearance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;base-select&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后想怎么改就怎么改，选项的样式、布局、动画都能控制。&lt;/p&gt;

&lt;p&gt;目前 Chrome 独占，不过不支持的浏览器会回退到原生样式，完全不影响使用。&lt;/p&gt;
&lt;h2 id="text-wrap 让排版更好看"&gt;text-wrap 让排版更好看&lt;/h2&gt;
&lt;p&gt;text-wrap: balance 可以让每行文字长度尽量接近：&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;text-wrap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;用在标题上效果特别好，不会出现最后一行只有一个词的情况。&lt;/p&gt;

&lt;p&gt;还有个 text-wrap: pretty，专门优化正文排版：&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;text-wrap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pretty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;浏览器会自动调整断行，避免孤词，让文字看起来更舒服。&lt;/p&gt;

&lt;p&gt;balance 已经全浏览器支持，pretty 在 Chrome 和 Safari 能用。&lt;/p&gt;

&lt;p&gt;这种优化对用户体验很重要，而且完全不影响功能，可以直接加上。&lt;/p&gt;
&lt;h2 id="linear() 实现复杂缓动效果"&gt;linear() 实现复杂缓动效果&lt;/h2&gt;
&lt;p&gt;CSS 的 linear 关键字之前就是匀速动画，很无聊。&lt;/p&gt;

&lt;p&gt;但 linear() 函数可以实现超复杂的缓动，比如弹跳效果：&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.bounce&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;animation-timing-function&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.004&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.016&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.035&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.063&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.098&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.141&lt;/span&gt; &lt;span class="m"&gt;13.6%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.391&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.563&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.765&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.891&lt;/span&gt; &lt;span class="m"&gt;40.9%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.848&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.813&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.785&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.766&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.754&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.754&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.766&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.785&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="m"&gt;0.813&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.848&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.891&lt;/span&gt; &lt;span class="m"&gt;68.2%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;72.7%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.973&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.953&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.941&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.938&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.941&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.953&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="m"&gt;0.973&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.988&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.984&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.988&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这种效果用 cubic-bezier() 根本做不出来。&lt;/p&gt;

&lt;p&gt;而且已经全浏览器支持了，可以放心用。&lt;/p&gt;

&lt;p&gt;有在线工具可以生成这些值，不用自己手写。&lt;/p&gt;
&lt;h2 id="shape() 函数画任意图形"&gt;shape() 函数画任意图形&lt;/h2&gt;
&lt;p&gt;CSS 之前有 path() 函数，但语法很难写，而且只能用像素。&lt;/p&gt;

&lt;p&gt;shape() 是专门为 CSS 设计的，支持所有单位和自定义属性：&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.arrow&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;clip-path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;evenodd&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="m"&gt;97.788201%&lt;/span&gt; &lt;span class="m"&gt;41.50201%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="m"&gt;-30.839077%&lt;/span&gt; &lt;span class="m"&gt;-41.50201%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;curve&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="m"&gt;-10.419412%&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="m"&gt;-2.841275%&lt;/span&gt; &lt;span class="m"&gt;-3.823154%&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="m"&gt;-7.578137%&lt;/span&gt; &lt;span class="m"&gt;-3.823154%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;smooth&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt; &lt;span class="m"&gt;14.020119%&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="m"&gt;-2.841275%&lt;/span&gt; &lt;span class="m"&gt;10.196965%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;close&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以用在 clip-path 裁剪元素，也能用在 offset-path 做路径动画。&lt;/p&gt;

&lt;p&gt;而且可以响应式调整，配合媒体查询和容器查询都没问题。&lt;/p&gt;

&lt;p&gt;Chrome 和 Safari 已经支持，Firefox 也在开发中。&lt;/p&gt;
&lt;h2 id="attr() 变强了"&gt;attr() 变强了&lt;/h2&gt;
&lt;p&gt;之前 attr() 只能取字符串，现在可以指定类型了：&lt;/p&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;data-count=&lt;/span&gt;&lt;span class="s"&gt;"42"&lt;/span&gt; &lt;span class="na"&gt;data-color=&lt;/span&gt;&lt;span class="s"&gt;"#ff0000"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data-count&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="py"&gt;--color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data-color&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样可以直接把 HTML 属性当数字或颜色用，方便多了。&lt;/p&gt;

&lt;p&gt;目前 Chrome 独占，不过对于不支持的浏览器，可以设置回退值。&lt;/p&gt;
&lt;h2 id="reading-flow 解决 Tab 顺序问题"&gt;reading-flow 解决 Tab 顺序问题&lt;/h2&gt;
&lt;p&gt;用 Grid 或 Flexbox 重新排列元素后，Tab 键的焦点顺序会乱。&lt;/p&gt;

&lt;p&gt;现在可以用 reading-flow 告诉浏览器按照视觉顺序来：&lt;/p&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.grid&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;reading-flow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid-rows&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样焦点就会按照 Grid 的行顺序移动，不会乱跳了。&lt;/p&gt;

&lt;p&gt;Flexbox 用 flex-flow，其他布局也有对应的值。&lt;/p&gt;

&lt;p&gt;这个功能对无障碍访问很重要，不过目前只有 Chrome 支持。&lt;/p&gt;

&lt;p&gt;等其他浏览器跟进之前，最好不要大量重排布局。&lt;/p&gt;
&lt;h2 id="值得期待的功能"&gt;值得期待的功能&lt;/h2&gt;
&lt;p&gt;还有一些功能在开发中，但还没正式发布：&lt;/p&gt;

&lt;p&gt;Masonry 布局虽然各浏览器实现不同，但在稳步推进。&lt;/p&gt;

&lt;p&gt;Safari 的 random() 函数可以生成随机数，玩起来很有意思。&lt;/p&gt;

&lt;p&gt;margin-trim 可以自动去掉容器边缘元素的外边距，Safari 独占中。&lt;/p&gt;

&lt;p&gt;sibling-index() 和 sibling-count() 函数在 Chrome 能用，做交错动画很方便。&lt;/p&gt;

&lt;p&gt;View Transitions 的 match-element 不用给每个元素起名字了，而且 Firefox 也在开发中。&lt;/p&gt;

&lt;p&gt;还有很多其他功能在路上。&lt;/p&gt;
&lt;h2 id="别忘了这些已经能用的"&gt;别忘了这些已经能用的&lt;/h2&gt;
&lt;p&gt;Container Queries 和 :has() 这些去年的新功能，现在已经全浏览器支持。&lt;/p&gt;

&lt;p&gt;View Transitions、Anchor Positioning、Scroll-Driven Animations 也都在 Safari 上线了。&lt;/p&gt;

&lt;p&gt;dvh 这些视口单位也成为标准了。&lt;/p&gt;

&lt;p&gt;CSS 现在能做的事情越来越多，写起来也越来越顺手。&lt;/p&gt;

&lt;p&gt;参考：&lt;a href="https://frontendmasters.com/blog/what-you-need-to-know-about-modern-css-2025-edition/" rel="nofollow" target="_blank"&gt;https://frontendmasters.com/blog/what-you-need-to-know-about-modern-css-2025-edition/&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="其他好文推荐"&gt;其他好文推荐&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s/uqxi-r9y_SkP0mGLybsp8w" rel="nofollow" target="_blank" title=""&gt;2025 最新！独立开发者穷鬼套餐&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s/VUFLFQjlr6W7gEJaxfdTzA" rel="nofollow" target="_blank" title=""&gt;Windows 安装 Claude Code 的新姿势，保姆级教程&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s/K27Wdi_hBwP50v_bo7FHVw" rel="nofollow" target="_blank" title=""&gt;Claude Code 从入门到精通：最全配置指南和工具推荐&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s/UjC8XhqAzf7dOcxD1ZvLhg" rel="nofollow" target="_blank" title=""&gt;Claude Code 终极配置指南：一行命令搞定各种配置&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s/wHzwJvVdEFwAEyEDAI1aUA" rel="nofollow" target="_blank" title=""&gt;一个配置文件搞定！Claude Code 多模型智能切换&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s/lUqojQDTOmrxqYIle21cYw" rel="nofollow" target="_blank" title=""&gt;这个 361k Star 的项目，一定要收藏！&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s/6GdfVnmu30Ki1XeadzuuRg" rel="nofollow" target="_blank" title=""&gt;搞定 XLSX 预览？别瞎找了，这几个库（尤其最后一个）真香！&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s/f5pIdyY8grx9t6qYxMgR1w" rel="nofollow" target="_blank" title=""&gt;【完整汇总】近 5 年 JavaScript 新特性完整总览&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s/RGFQbqzmrY1NVkdUsQcMBw" rel="nofollow" target="_blank" title=""&gt;关于 Node，一定要学这个 10+ 万 Star 项目！&lt;/a&gt;&lt;/p&gt;</description>
      <author>Immerse</author>
      <pubDate>Sat, 29 Nov 2025 16:43:42 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6597</link>
      <guid>http://beta.w2solo.com/topics/6597</guid>
    </item>
    <item>
      <title>每天一个独立开发者工具</title>
      <description>&lt;p&gt;# 每天一个独立开发者工具&lt;/p&gt;

&lt;p&gt;✨ 今日分享：
一个基于现代技术栈（Vite、Vue 3、TypeScript）开发的中后台 Admin 模板&lt;/p&gt;

&lt;p&gt;👇 直达链接：
&lt;a href="https://www.indietools.work/product/naive-ui-pro" rel="nofollow" target="_blank"&gt;https://www.indietools.work/product/naive-ui-pro&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img title=":arrow_right:" alt="➡" src="https://twemoji.ruby-china.com/2/svg/27a1.svg" class="twemoji"&gt;️ Github: &lt;a href="https://github.com/yaolifeng0629/Awesome-independent-tools" rel="nofollow" target="_blank"&gt;https://github.com/yaolifeng0629/Awesome-independent-tools&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;#SaaS #BuildInPublic #IndieTools #IndieHackers #WebDev   &lt;/p&gt;</description>
      <author>Immerse</author>
      <pubDate>Mon, 24 Nov 2025 07:54:29 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6578</link>
      <guid>http://beta.w2solo.com/topics/6578</guid>
    </item>
    <item>
      <title>100% 用 AI 做完一个新项目，从 Plan 到 Finished 我学到了这些</title>
      <description>&lt;p&gt;大家好，我是 Immerse，一名独立开发者、内容创作者、AGI 实践者。&lt;/p&gt;

&lt;p&gt;关注公众号：&lt;a href="https://yaolifeng.com/other/wx_public_account.webp" rel="nofollow" target="_blank" title=""&gt;沉浸式趣谈&lt;/a&gt;，获取最新文章（更多内容只在公众号更新）&lt;/p&gt;

&lt;p&gt;个人网站：&lt;a href="https://yaolifeng.com" rel="nofollow" target="_blank" title=""&gt;https://yaolifeng.com&lt;/a&gt; 也同步更新。&lt;/p&gt;

&lt;p&gt;转载请在文章开头注明出处和版权信息。&lt;/p&gt;

&lt;p&gt;我会在这里分享关于&lt;code&gt;编程&lt;/code&gt;、&lt;code&gt;独立开发&lt;/code&gt;、&lt;code&gt;AI干货&lt;/code&gt;、&lt;code&gt;开源&lt;/code&gt;、&lt;code&gt;个人思考&lt;/code&gt;等内容。&lt;/p&gt;

&lt;p&gt;如果本文对您有所帮助，欢迎动动小手指一键三连 (&lt;code&gt;点赞&lt;/code&gt;、&lt;code&gt;评论&lt;/code&gt;、&lt;code&gt;转发&lt;/code&gt;)，给我一些支持和鼓励，谢谢！&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;女朋友一句话催生的 Chrome 插件，解决批量下载图片问题&lt;/p&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="https://qncdn.mopic.mozigu.net/work/143/25/0d5accca56ec406b/image.png" width="300"&gt;&lt;/p&gt;
&lt;h2 id="下载地址："&gt;下载地址：&lt;/h2&gt;
&lt;p&gt;GitHub:&lt;a href="https://github.com/yaolifeng0629/PickPic" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;https://github.com/yaolifeng0629/PickPic&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;谷歌浏览器商店：&lt;a href="https://chromewebstore.google.com/detail/pickpic-one-click-downloa/hfdohacifjijbgobekodafjpjghflemh" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;https://chromewebstore.google.com/detail/pickpic-one-click-downloa/hfdohacifjijbgobekodafjpjghflemh&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;压缩包：&lt;a href="https://github.com/yaolifeng0629/PickPic/releases/tag/v1.0.2" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;https://github.com/yaolifeng0629/PickPic/releases/tag/v1.0.2&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="一个很简单的需求"&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;/p&gt;

&lt;p&gt;我想要的很简单：打开网页，一键预览，选择下载，完事。&lt;/p&gt;

&lt;p&gt;所以决定自己做一个。&lt;/p&gt;
&lt;h2 id="这个插件能干啥"&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;/p&gt;

&lt;p&gt;单张图直接下载，多张图自动打包成 ZIP 文件。&lt;/p&gt;

&lt;p&gt;对微信公众号做了特殊优化。能看到文章标题、作者、描述这些信息。&lt;/p&gt;

&lt;p&gt;支持中英文切换。&lt;/p&gt;

&lt;p&gt;就这些，没有复杂的设置，打开就能用。&lt;/p&gt;
&lt;h2 id="开发过程还挺顺"&gt;开发过程还挺顺&lt;/h2&gt;
&lt;p&gt;技术栈用的是 Plasmo 框架，这玩意专门做浏览器插件的。&lt;/p&gt;

&lt;p&gt;配合 React、TypeScript、Tailwind CSS，开发体验很不错。&lt;/p&gt;

&lt;p&gt;状态管理用 Zustand，轻量好用。&lt;/p&gt;

&lt;p&gt;图片打包用 JSZip，生成 ZIP 文件很快。&lt;/p&gt;
&lt;h2 id="支持的网站挺多"&gt;支持的网站挺多&lt;/h2&gt;
&lt;p&gt;除了微信公众号，其他网站也都能用。&lt;/p&gt;

&lt;p&gt;我测试了掘金、知乎、InfoQ、简书、CSDN、博客园这些技术社区，都没问题。&lt;/p&gt;

&lt;p&gt;理论上任何网页都能用，因为我做的是通用提取逻辑。只要是 img 标签或者 video 标签，都能识别出来。（暂时没有处理防爬逻辑）&lt;/p&gt;

&lt;p&gt;对微信公众号做了额外优化，因为自己平时也会用到，所以多花了点心思。&lt;/p&gt;

&lt;p&gt;其他网站暂时没做特殊处理，但基本功能都是正常的。&lt;/p&gt;
&lt;h2 id="为啥又是一个工具"&gt;为啥又是一个工具&lt;/h2&gt;
&lt;p&gt;做这个插件的时候，我想起之前看 Marc Lou 的分享。&lt;/p&gt;

&lt;p&gt;他说最好的产品，往往是解决自己问题的产品。&lt;/p&gt;

&lt;p&gt;因为你就是第一个用户，最清楚哪里好用哪里不好用。&lt;/p&gt;

&lt;p&gt;不需要做市场调研，不需要猜用户想要什么。&lt;/p&gt;

&lt;p&gt;你自己用着舒服，产品就不会太差。&lt;/p&gt;

&lt;p&gt;做的过程中没想过能不能赚钱，会不会有很多人用。&lt;/p&gt;

&lt;p&gt;就是单纯想解决这个痒处。&lt;/p&gt;
&lt;h2 id="接下来想加点啥"&gt;接下来想加点啥&lt;/h2&gt;
&lt;p&gt;目前功能还比较基础，后面想加一些新东西。&lt;/p&gt;

&lt;p&gt;比如批量重命名，按文章标题、日期、序号这些规则自动命名文件。&lt;/p&gt;

&lt;p&gt;在考虑支持更多格式，不光是图片和视频，PDF、音频这些也能提取。&lt;/p&gt;

&lt;p&gt;不过这些都是想法，会不会做、什么时候做，还没确定。&lt;/p&gt;

&lt;p&gt;先把目前的问题解决了再说。&lt;/p&gt;
&lt;h2 id="如何使用"&gt;如何使用&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://qncdn.mopic.mozigu.net/work/143/25/0d5accca56ec406b/image-1.png" width="300"&gt;&lt;/p&gt;

&lt;p&gt;GitHub:&lt;a href="https://github.com/yaolifeng0629/PickPic" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;https://github.com/yaolifeng0629/PickPic&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;谷歌浏览器商店：&lt;a href="https://chromewebstore.google.com/detail/pickpic-one-click-downloa/hfdohacifjijbgobekodafjpjghflemh" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;https://chromewebstore.google.com/detail/pickpic-one-click-downloa/hfdohacifjijbgobekodafjpjghflemh&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;压缩包：&lt;a href="https://github.com/yaolifeng0629/PickPic/releases/tag/v1.0.2" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;https://github.com/yaolifeng0629/PickPic/releases/tag/v1.0.2&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;欢迎提 Issue 和 PR，有想法可以一起讨论。&lt;/p&gt;

&lt;p&gt;也欢迎 Star 支持一下。&lt;/p&gt;

&lt;p&gt;项目还在早期阶段，肯定有不完善的地方。&lt;/p&gt;

&lt;p&gt;但我会持续维护，遇到问题会尽快修复。&lt;/p&gt;
&lt;h2 id="开发过程开源"&gt;开发过程开源&lt;/h2&gt;
&lt;p&gt;对了，这个项目从 Plan 到 Task 再到 Implement，每个阶段我都开源出来了。&lt;/p&gt;

&lt;p&gt;包括最初的想法、任务拆解、具体实现，甚至原型设计都在 GitHub 仓库里。&lt;/p&gt;

&lt;p&gt;想看完整开发过程的小伙伴，可以去仓库翻一翻。&lt;/p&gt;

&lt;p&gt;说不定能给你自己做项目提供点思路。&lt;/p&gt;

&lt;p&gt;顺便点个 Star 支持一下，感谢！&lt;/p&gt;
&lt;h2 id="一点小感悟"&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;/p&gt;

&lt;p&gt;而且你真心解决了自己的问题，产品自然会有温度。&lt;/p&gt;

&lt;p&gt;别人用起来也能感受到这种真实。&lt;/p&gt;

&lt;p&gt;Marc Lou 说好奇心才是创业的起点，我觉得说得特别对。&lt;/p&gt;

&lt;p&gt;先把痒处挠了，至于能不能变成生意，那是后面的事。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;项目地址：&lt;a href="https://github.com/yaolifeng0629/PickPic" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;https://github.com/yaolifeng0629/PickPic&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;欢迎试用，欢迎反馈。&lt;/p&gt;</description>
      <author>Immerse</author>
      <pubDate>Mon, 10 Nov 2025 13:47:52 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6545</link>
      <guid>http://beta.w2solo.com/topics/6545</guid>
    </item>
    <item>
      <title>每天一个独立开发者工具</title>
      <description>&lt;p&gt;# 每天一个独立开发者工具&lt;/p&gt;

&lt;p&gt;✨ 今日分享：
一款面向服务器运维的图形化 Web 管理工具，集成了网站、数据库、FTP、文件、防火墙等核心功能&lt;/p&gt;

&lt;p&gt;👇 直达链接：
&lt;a href="https://www.indietools.work/product/baota" rel="nofollow" target="_blank"&gt;https://www.indietools.work/product/baota&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img title=":arrow_right:" alt="➡" src="https://twemoji.ruby-china.com/2/svg/27a1.svg" class="twemoji"&gt;️ Github: &lt;a href="https://github.com/yaolifeng0629/Awesome-independent-tools" rel="nofollow" target="_blank"&gt;https://github.com/yaolifeng0629/Awesome-independent-tools&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;#SaaS #BuildInPublic #IndieTools #IndieHackers #WebDev   &lt;/p&gt;</description>
      <author>Immerse</author>
      <pubDate>Fri, 07 Nov 2025 07:51:50 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6536</link>
      <guid>http://beta.w2solo.com/topics/6536</guid>
    </item>
    <item>
      <title>每天一个独立开发者工具</title>
      <description>&lt;p&gt;# 每天一个独立开发者工具&lt;/p&gt;

&lt;p&gt;✨ 今日分享：
一个现代化的 Serverless 平台，旨在简化从代码到全球部署的整个流程&lt;/p&gt;

&lt;p&gt;👇 直达链接：
&lt;a href="https://www.indietools.work/product/koyeb" rel="nofollow" target="_blank"&gt;https://www.indietools.work/product/koyeb&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img title=":arrow_right:" alt="➡" src="https://twemoji.ruby-china.com/2/svg/27a1.svg" class="twemoji"&gt;️ Github: &lt;a href="https://github.com/yaolifeng0629/Awesome-independent-tools" rel="nofollow" target="_blank"&gt;https://github.com/yaolifeng0629/Awesome-independent-tools&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;#SaaS #BuildInPublic #IndieTools #IndieHackers #WebDev   &lt;/p&gt;</description>
      <author>Immerse</author>
      <pubDate>Wed, 05 Nov 2025 07:50:31 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6529</link>
      <guid>http://beta.w2solo.com/topics/6529</guid>
    </item>
    <item>
      <title>每天一个独立开发者工具</title>
      <description>&lt;p&gt;# 每天一个独立开发者工具&lt;/p&gt;

&lt;p&gt;✨ 今日分享：
Told 是一款专注于用户体验和客户反馈的轻量级调查工具&lt;/p&gt;

&lt;p&gt;👇 直达链接：
&lt;a href="https://www.indietools.work/product/told" rel="nofollow" target="_blank"&gt;https://www.indietools.work/product/told&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img title=":arrow_right:" alt="➡" src="https://twemoji.ruby-china.com/2/svg/27a1.svg" class="twemoji"&gt;️ Github: &lt;a href="https://github.com/yaolifeng0629/Awesome-independent-tools" rel="nofollow" target="_blank"&gt;https://github.com/yaolifeng0629/Awesome-independent-tools&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;#SaaS #BuildInPublic #IndieTools #IndieHackers #WebDev   &lt;/p&gt;</description>
      <author>Immerse</author>
      <pubDate>Mon, 03 Nov 2025 07:52:08 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6520</link>
      <guid>http://beta.w2solo.com/topics/6520</guid>
    </item>
    <item>
      <title>每天一个独立开发者工具</title>
      <description>&lt;p&gt;# 每天一个独立开发者工具&lt;/p&gt;

&lt;p&gt;✨ 今日分享：
一款基于 Google Trends API 的批量数据分析工具，核心价值在于将单次关键词趋势查询扩展为高效的批量对比研究&lt;/p&gt;

&lt;p&gt;👇 直达链接：
&lt;a href="https://www.indietools.work/product/trendbatch" rel="nofollow" target="_blank"&gt;https://www.indietools.work/product/trendbatch&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img title=":arrow_right:" alt="➡" src="https://twemoji.ruby-china.com/2/svg/27a1.svg" class="twemoji"&gt;️ Github: &lt;a href="https://github.com/yaolifeng0629/Awesome-independent-tools" rel="nofollow" target="_blank"&gt;https://github.com/yaolifeng0629/Awesome-independent-tools&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;#SaaS #BuildInPublic #IndieTools #IndieHackers #WebDev   &lt;/p&gt;</description>
      <author>Immerse</author>
      <pubDate>Fri, 31 Oct 2025 07:55:05 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6473</link>
      <guid>http://beta.w2solo.com/topics/6473</guid>
    </item>
    <item>
      <title>每天一个独立开发者工具</title>
      <description>&lt;p&gt;# 每天一个独立开发者工具&lt;/p&gt;

&lt;p&gt;✨ 今日分享：
一个专注于为 AI 阅读优化的技术文档平台，提供多种技术栈的 LLM.txt 格式文档&lt;/p&gt;

&lt;p&gt;👇 直达链接：
&lt;a href="https://www.indietools.work/product/context7?type=ai-resources" rel="nofollow" target="_blank"&gt;https://www.indietools.work/product/context7?type=ai-resources&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img title=":arrow_right:" alt="➡" src="https://twemoji.ruby-china.com/2/svg/27a1.svg" class="twemoji"&gt;️ Github: &lt;a href="https://github.com/yaolifeng0629/Awesome-independent-tools" rel="nofollow" target="_blank"&gt;https://github.com/yaolifeng0629/Awesome-independent-tools&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;#SaaS #BuildInPublic #IndieTools #IndieHackers #WebDev   &lt;/p&gt;</description>
      <author>Immerse</author>
      <pubDate>Wed, 29 Oct 2025 07:53:39 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6467</link>
      <guid>http://beta.w2solo.com/topics/6467</guid>
    </item>
  </channel>
</rss>
