即刻App年轻人的同好社区
下载
App内打开
檀奕623
9关注325被关注0夸夸
🏠职场牛马
⚡️副业独立开发者
🚀专注 AI出海、工具变现、AI自媒体
👉欢迎链接https://tanyiai.site
檀奕623
21:40
还有就是网站下载的文件内容正常,但是下载后的中文文件名却乱码,建议先检查这个响应头👇

做 AI 工具站或 SaaS 时,导出 CSV、PDF、Excel 是很常见的功能

但有一种情况特别容易出错,文件内容完全正常但是下载后的名称却变成乱码,甚至直接显示成 download.csv

估计有的人会直接检查 UTF-8 编码,其实文件内容的编码和下载文件名是两回事

浏览器通常根据 HTTP 响应头 Content-Disposition 获取建议的下载名称

如果直接写 filename="订单报表.csv"

不同客户端的兼容性可能出现问题

HTTP 标准提供了更合适的参数,filename*,它支持按指定字符集编码文件名

我的建议是同时提供两个参数,filename 放英文备用名称,filename* 放 UTF-8 编码后的中文名称,兼顾新旧客户端
00
檀奕623
21:31
React 列表里的 key={index},居然比想象中还要坑

AI 生成 React 列表代码时经常能看到这种写法:

{tasks.map((task, index) => (
<TaskRow key={index} task={task} />
))}

代码能正常运行,页面也不一定报错

但只要列表支持删除、插入或者排序,就可能会出现很奇怪的状态错位

比如任务列表原本是 A、B、C,每个 TaskRow 都用 useState 保存输入框里的备注

你给 B 输入了一段备注,然后删除 A,此时 B、C 的位置都变了,但 React 仍可能按照原来的索引复用组件,导致 B 的备注丢失,原本属于 B 的内容却出现在 C 上

其实原因很简单,索引代表的是位置,不是任务本身的身份

这类问题往往不是输入框的 onChange 写错了,而是 React 没有正确识别哪一行对应哪条数据

让 AI 给你修复也很简单,但有两个细节也不能忽略

如果任务数据本身有稳定的 id,直接这样写:

{tasks.map(task => (
<TaskRow key={task.id} task={task} />
))}

React 就能在列表调整顺序时,通过 id 识别对应组件,尽量保留属于该任务的本地状态

如果数据没有 ID,建议在创建数据时生成并保存,而不是每次渲染时调用 Math.random() 或 crypto.randomUUID() 生成新的 key

否则组件可能反复重新挂载,输入内容也会丢失

可以这样验证修复后效果:

给 A、B 两行分别输入不同内容,然后删除 A、交换顺序,再检查输入内容是否仍跟着正确的任务走

当然,完全静态、不会增删或排序的列表,使用索引通常没有问题
00
檀奕623
21:22
不懂就问,你们的plus也不显示使用情况了吗?

想看个额度使用情况看了半天没看到菜单😂
00
檀奕623
20:45
不错不错~

分站也开始慢慢开张了,继续加油
00
檀奕623
20:29
我发现 Promise.all() 有个很容易影响网站页面体验的行为,只要其中一个 Promise 失败,整个 await 就会抛出异常

这对必须全部成功的操作很合适,但不一定适合所有数据面板

比如 AI 工具站同时加载用量统计、账单和任务列表,账单接口临时返回错误,整个 Promise.all() 就无法返回完整结果,即使另外两个请求已经成功

注意,其他请求不会因为这个异常自动取消,只是你拿不到 Promise.all() 的聚合结果

这种场景可以考虑 Promise.allSettled()

它会等所有请求都完成或失败,再分别返回每项的状态:

fulfilled:成功,结果在 value
rejected:失败,原因在 reason

这样就能让成功的模块继续展示,失败的模块单独提示,而不是让整个页面一起空白

但如果几个操作存在依赖,或者业务要求全部成功,就不要为了“部分可用”而强行换掉 Promise.all()
00
檀奕623
18:04
为什么你的DeepSeek,和别人不一样?实测揭秘!

① 同样使用 DeepSeek,为什么别人的 AI 能自己写代码、运行测试、修复报错,你的却总要反复提醒?

很多人遇到这种情况第一反应就是模型不够强,于是不断修改提示词甚至换模型。

但还有一个容易被忽略的因素:Harness(智能体运行框架)。

简单理解,DeepSeek 是负责理解和生成的“大脑”,Harness 则是它工作的环境。

比如项目文件怎么读取、能调用哪些工具、能否执行命令、报错后怎么处理、长任务如何保留进度,这些都会影响最终结果。

同一个模型,换一个 Harness,实际执行效果就可能不同。

DeepSeek 已经开源自己的 Harness,OpenCode、Claude Code、Codex 等也有相应的智能体执行机制。

我们可以用一个小项目,自己验证差别。

对了,最近刚好建了一个 AI 学习交流群,已经人数过百啦~
想把平时看到的 AI 工具、实操案例、Prompt、Agent、AI 编程和一些踩坑经验分享出来。

如果你也在学 ChatGPT、Claude Code,或者平时关注 AI 工具的欢迎进群一起交流,目前限时免费进~

第一步:准备测试环境

先安装兼容的 Node.js,建议使用官方支持的 Node.js 24 版本。

打开终端,执行:

`node -v`

`npm -v`

确认能够正常输出版本号。

然后到 DeepSeek 开放平台创建 API Key:platform.deepseek.com

为了防止误改现有代码,建议创建两个内容完全相同的测试目录:

`test-dsh`

`test-opencode`

不要直接用正在运营的真实项目测试。

第二步:启动 DeepSeek Harness

终端执行:`npx @deepseek-ai/dsh web`

这是官方 GitHub README 提供的启动命令,首次执行需要下载依赖。

正常启动后会打开 Web UI,默认本地端口为 3080。

进入 Settings → Models,配置 DeepSeek API Key,并选择模型。

然后指定 `test-dsh` 作为工作目录。

第三步:安装 OpenCode

终端执行:`npm install -g opencode-ai`

安装完成后,进入 `test-opencode` 目录并运行:`opencode`

打开界面,输入:`/connect`

选择 DeepSeek,填写 API Key。

再输入:`/models`

选择对应的 DeepSeek 模型。

这里有个关键细节。

2026 年 10 月 17 日 DeepSeek 将 V4.1 Flash 更新为 V4.1 Flash-1017,API 仍通过 `deepseek-flash` 调用。

测试前必须确认两边实际调用的模型版本一致。

不同工具可能使用不同的显示名称,不能只看界面写着 DeepSeek 就认为配置相同。

第四步:用相同需求进行测试

不建议新手一开始就测试复杂 3D 场景。

先做一个登录页面,更方便检查功能是否真正完成。

把下面的提示词分别发给两个工具:
```
> 请使用 HTML、CSS、JavaScript 开发一个响应式登录演示页面。
>
> 功能要求:
>
> 1. 支持邮箱格式校验。
> 2. 支持密码显示和隐藏。
> 3. 提交错误时显示明确提示。
> 4. 手机端不能出现布局溢出。
> 5. 不接入真实登录接口。
>
> 开发前先检查项目目录,只允许修改当前测试目录内的文件。
>
> 完成后运行或打开页面进行检查,说明实际验证过哪些功能、还有哪些问题。
>
> 没有验证的功能不能标记为通过。
```
注意,两边必须使用相同需求、相同初始文件,并尽可能统一工具权限。

不能一边允许执行命令,另一边只能生成文本,然后拿结果比较。

② 两个工具都生成了代码,接下来怎么判断哪个更适合自己?

建议从五个方面验收。

第五步:检查真实交付效果

1. 功能完整度

手动输入空邮箱、错误邮箱,检查有没有提示。

点击密码显示按钮,检查输入框状态是否正常切换。

不要把“AI 说已经完成”当成实际完成。

2. 运行与纠错

查看 AI 有没有真正执行检查。

如果运行报错,它是否会读取错误信息、定位代码并继续修改?

还是直接告诉你“项目已经完成”?

3. 页面兼容性

打开浏览器开发者工具,切换到手机尺寸。

检查输入框、按钮、错误提示有没有重叠或超出屏幕。

4. 文件操作

查看它修改了哪些文件。

有没有无故新增依赖,或者修改任务之外的代码?

涉及敏感配置、删除文件时,有没有触发必要的权限确认?

5. Token 与费用

记录任务耗时、调用次数及 Token 使用量。

费用优先以 API 服务商实际记录为准。

不同工具的统计口径可能不同,不要直接把界面显示的估算数字当成最终费用。

建议相同条件下各测试 3 次,记录每次通过的功能数量。

一次运行成功,不代表这个工具永远更好。

第六步:加入项目规则,再测试一轮

很多人使用 AI 编程工具,习惯一句话把任务扔给模型。

但如果项目有明确规范,最好让工具在执行前了解这些约束。

以 OpenCode 为例,它官方支持 `AGENTS.md` 项目规则。

在项目根目录创建 `AGENTS.md`,写入:
```
> 项目开发规则
>
> 1. 修改前先阅读相关文件。
> 2. 不确定的需求先询问。
> 3. 优先最小修改,不随意新增依赖。
> 4. 修改后运行可用的检查命令。
> 5. 未经验证的功能标记为待验证。
> 6. 删除文件或访问目录外内容前必须确认。
```
DeepSeek Harness 的默认指令组件也支持兼容的项目规则文件,但具体加载行为需要以当前配置为准。

接下来重新执行刚才的任务,比较加入规则前后的结果。

注意:规则文件并不能替代真实权限控制。

如果不希望 AI 删除重要文件必须通过工具权限和隔离目录限制操作,不能只靠一句“禁止删除”。

第七步:长任务不要一直聊到底

如果开发一个完整 SaaS,可能要连续修改几十个文件。

这时候还需要管理任务进度。

可以在项目中创建 `progress.md`,记录:

- 已经完成哪些功能。
- 哪些功能经过测试。
- 当前存在什么 Bug。
- 下一步准备做什么。

完成一个阶段后更新文件。

开启新会话时,明确告诉 AI:
```
> 先阅读项目规则和 `progress.md`,核对当前代码状态,再继续未完成任务。不要重复开发已经完成的功能。
```
这样可以减少长会话中上下文丢失带来的影响。

但也要注意,进度文件只是辅助工具,不能保证 AI 永远不会遗漏信息。

最后总结

如果 DeepSeek 生成的代码总是出问题,建议按这个顺序排查:模型版本 → 项目上下文 → 工具权限 → 实际执行记录 → 错误反馈 → 提示词。

先确认 AI 有没有读到正确的文件、执行过正确的命令,再考虑是不是模型能力不足。

模型决定能力基础,Harness 决定这些能力如何被组织和执行。

真正值得比较的,不是谁一次生成的代码更多,而是谁能在合理成本下更稳定地完成执行 → 检查 → 修复 → 验证。

对独立开发者来说,这比单纯追求一次生成几千行代码更有价值。
00
檀奕623
17:54
URL.createObjectURL(file)

做 AI 图片工具站时,这行代码挺方便的

用户选择本地图片就能生成一个 blob: 地址,直接用在 <img> 里预览

不需要先上传到服务器,也不用把文件转换成 Base64

但我觉得这里有个细节值得检查一下,就是生成出来的 Object URL会在什么时候释放?

MDN 官方明确说明每调用一次 createObjectURL() 都会生成一个新的 URL,哪怕传入的是同一个文件也不会自动复用之前的地址

如果每次切换图片都创建新 URL却从来不释放,相关 Blob 数据可能持续占用浏览器资源

尤其是 AI 图片处理、PDF 预览这类页面,用户可能连续选择很多大文件

这里要区分 React 组件重新渲染不等于浏览器自动清理了你创建的所有外部资源

我的建议是把 Object URL 当成需要管理生命周期的资源,而不是普通字符串
00
檀奕623
1天前
虽然注册的用户涨了不少,但不代表 AI 工具站真的在增长?

我更愿意先看一件事,用户有没有把最核心的功能用起来,而且愿不愿意再用第二次?

就拿 AI PDF 工具来说,注册成功、打开工作台、点击“开始分析”,都不代表用户真正完成了体验

至少要等报告成功生成并成功交付才能算完成一次核心的任务

所以,我更建议把「注册」和「成功完成分析」分开统计,再看同一批完成过分析的人,过了一段时间有没有回来处理第二份文档

PostHog 的 Retention 就能分析这类重复使用行为,不需要只盯着后台的总用户数

但有个地方要注意,别机械地追求七日留存

有些工具每天都会用,但有些可能一个月才需要用一次,产品的使用频率不同,观察周期也应该不同

比起每天新增多少账号,我更关心用户有没有真正把工具用进自己的工作流程里
10
檀奕623
1天前
我相信有很多做出海的兄弟们会有个疑问?

你在 X 上分享的出海工具站帖子有几千几万次的浏览,但工具站始终没人注册,就是不知道问题出在哪里?

打个比方,一篇介绍 AI 开发工具的帖子获得了不错的曝光,你把自己的产品链接放在评论区或个人主页

几天后后台显示注册了很多新用户,但问题来了,这些访问真的是那篇 X 帖子带来的吗?

进站之后又有多少人点体验了产品?

又有多少人最终留下来订阅使用?

如果只看 X 的浏览量就很难回答这些问题,帖子曝光、链接访问、网站访问和用户注册,本来就是四个不同指标

你真正应该关注的是内容有没有把合适的人带进产品,以及他们有没有完成你期望的关键动作

Google Analytics 支持使用 UTM 参数标记营销来源

哪怕暂时没有建立复杂的数据分析平台,也可以先用统一的链接命名方式做基础归因

不一定每篇帖子都要带货,但每篇用于获客的帖子都应该尽量能衡量实际效果
00
檀奕623
1天前
我发现自动化工作流最容易被忽略的不是能否触发,而是谁能触发?

比方做一个 GitHub 自动化工具

开发者提交代码后,GitHub Webhook 通知服务端,再由 Agent 总结代码变更,生成报告

AI写好了接口 ,接收到 JSON 就执行后续任务

本地测试没问题,GitHub 上也能正常触发

但接口没有验证请求来源,如果知道地址的人也可能自行构造请求,让你的服务端重复执行 AI 任务

这不仅会制造无效报告,还可能消耗模型调用额度

现在刚好 GitHub 官方支持为 Webhook 配置一个 Secret key,并使用它为消息正文生成 HMAC-SHA256 签名

签名通过请求头传递:X-Hub-Signature-256

服务端应该验证消息确实由持有 Secret 的发送方生成,而不是只看 URL 或请求体里写了什么

尤其是涉及自动部署、执行脚本、调用付费模型的工作流,签名验证应该放在真正执行业务逻辑之前
00