程序员 way to explore https:https://cdn.v2ex.com/navatar/94f6/d7e0/300_normal.png?m=1733731195 https:https://cdn.v2ex.com/navatar/94f6/d7e0/300_large.png?m=1733731195 2025-12-18T08:23:17Z Copyright © 2010-2018, V2EX 你们跟 AI 在一个话题里聊天能聊多少内容?我的一个 chatgpt 主题在 tab 页已经占了 1.1G 内存了 tag:www.v2ex.com,2025-12-18:/t/1179871 2025-12-18T14:24:17Z 2025-12-18T08:23:17Z red13 member/red13 求 langchain 发布 V1.0 后的最新测评 tag:www.v2ex.com,2025-12-18:/t/1179859 2025-12-18T13:34:41Z 2025-12-18T13:34:41Z unt member/unt
应用场景:集成到企业内部系统,功能不难,但是要求集成化程度非常高,非网上那种拿来即用的独立智能体小工具,涉及企业数据库的数据读取、数据处理,企业流程注入,用户复杂交互等。 ]]>
现在哪家 AI 生成 100 字以上的中文海报能不乱码? tag:www.v2ex.com,2025-12-18:/t/1179851 2025-12-18T12:33:16Z 2025-12-18T08:33:16Z HuPu member/HuPu 试了 gpt 和 banana 不太行

]]>
关于 AI 编辑器记忆和规则的问题 tag:www.v2ex.com,2025-12-18:/t/1179848 2025-12-18T12:20:45Z 2025-12-18T14:26:14Z manbudezhu member/manbudezhu 在使用 ai 编辑器编写项目时,以前端为例,我在项目 rules 中已经设定了 typescript 和项目的一些规则,规则设置为 always on 。具体规则如下:

## TypeScript 1. 避免使用 `any` 和 `unknown` 类型,应尽量定义明确的类型。 2. 避免使用 `as` 类型断言,优先使用类型守卫 (Type Guard) 或泛型。 3. 充分利用 TypeScript 的类型推导能力,减少冗余类型声明。 

但是很多时候依然会产生很多 any 类型的错误,很多时候编辑器都无视了项目的规则,每次在输入框中重复带入一些规则又特别不方便。
这里只是举了一个案例,感谢大家提出宝贵的意见.
大家如何解决类似的问题?
出现这种情况的原因是什么?

]]>
各位佬们,求一个 Cursor 的 vim 配置。 tag:www.v2ex.com,2025-12-18:/t/1179840 2025-12-18T11:03:59Z 2025-12-18T11:34:12Z wiirhan member/wiirhan 如题,公司给买了 Cursor 会员,之前一直用的 Neovim ,想求一份 Cursor 上的 vim 配置。

]]>
国内所有用蓝湖的团队,福利来了! tag:www.v2ex.com,2025-12-18:/t/1179810 2025-12-18T09:06:23Z 2025-12-18T05:06:23Z dsphper member/dsphper 做了个工具:让 AI 直接读蓝湖需求,团队所有 AI 共享知识库

解决两个痛点

痛点 1:看蓝湖需求还要手动截图、复制粘贴给 AI ?

现在: 直接给个 URL ,AI 自动提取 Axure 原型、字段规则、业务逻辑,支持开发/测试/探索三种分析模式。

痛点 2:每个人的 Cursor/Windsurf 都是孤岛,我的 AI 分析完需求,测试同学的 AI 又重新分析一遍。

现在: 所有 AI 连接同一个 MCP Server ,后端 AI 分析的结果,测试 AI 直接查询用。支持知识库、踩坑记录、 @提醒、飞书通知。

开源地址

与人 Star ⭐,手留余香 和提 Issue/PR !

]]> 想做一个文科类考试(法律考公 / 导游证)的题库小程序,程序员视角是否值得? tag:www.v2ex.com,2025-12-18:/t/1179786 2025-12-18T08:08:04Z 2025-12-18T12:59:41Z qianyidui5 member/qianyidui5 想做一个面向文科类考试的题库小程序,方向主要是:

想请教各位几个比较现实的问题:

1️⃣ 题库来源问题

2️⃣ 商业 & 价值

4️⃣ 踩坑经验

感谢各位指点 🙏

]]>
Kagi 搜索一个月使用体验 tag:www.v2ex.com,2025-12-18:/t/1179759 2025-12-18T06:50:42Z 2025-12-18T08:00:39Z cj323 member/cj323 喜欢的

  1. 无广告
  2. 隐私强,不收集信息;可虚拟货币;可 Tor 。甚至开发了个新协议插件避免浏览器 mitm
  3. 垃圾信息少,AI 模版的那种页面大幅下降。
  4. 结果精简,一般就 10-20 个结果。
  5. 可定制 widget ,比如我不喜欢视频和 AI 结果可以设置去除。
  6. 自带 filter ,block 了一些类似于 csdn 的垃圾站点干扰。无需插件
  7. 可定制 CSS ,很 web

不喜欢的

  1. 慢,平均 0.6s-2s 。如果习惯了谷歌的速度,会不适应。
  2. 自带地图远不如谷歌
  3. 没有数字翻页( paging )不习惯
]]>
程序员的危机感是不是很强烈?我这 0 基础的也能整个 BS 小程序了 tag:www.v2ex.com,2025-12-18:/t/1179748 2025-12-18T06:23:40Z 2025-12-18T07:21:40Z BelovedOne member/BelovedOne 一个多小时吧,迭代了近 20 个版本,基本达到了我预期的效果。

https://codepen.io/winsonwei/pen/ogxKXgo

]]>
为什么感觉 React 编写起来比 Vue 复杂很多? tag:www.v2ex.com,2025-12-18:/t/1179736 2025-12-18T05:56:32Z 2025-12-18T14:28:00Z PeiXyJ member/PeiXyJ 我在编写一个前端页面,在考虑使用 Vue 和 React 在尝试使用 React 后感觉 React 编写的页面非常的乱,因为太多太多的业务操作都感觉写在了 <Html/> 中而不是和 Vue 一样进行了 脚本 template style 进行拆分,不过我都是 AI 写的,是不是编写的习惯有问题?

]]>
发布 app,软件大家都用的什么授权服务 tag:www.v2ex.com,2025-12-18:/t/1179730 2025-12-18T05:41:31Z 2025-12-18T06:41:31Z feelapi member/feelapi 看过 keyauth.cc ,便宜,可以自己搭服务器或者用他们的服务。但是不知道有没有其他的选择?大家说说看。 先不考虑代码的混淆,代码保护这些,只需要服务端的。

]]>
有人用谷歌云 300 刀赠金的吗?在 cursor 使用 API 一会就提示上限了,但是在后台统计看完全没碰到限制 tag:www.v2ex.com,2025-12-18:/t/1179717 2025-12-18T04:33:23Z 2025-12-18T08:09:02Z blueslmj member/blueslmj 领了赠金后 aistudio 显示是付费层级 1 ,API 放到 cursor 里面可以使用 Gemini 3 pro ,但是经常提示 429 请求频繁,实际上后台用量显示离限额还有很远,而且 cursor 里面提示限额后,重试一下又好了,不知道是什么原因? 虽然重试可以用,但是每次思考很多步骤后,又得重新开始,很浪费时间啊

]]>
同志们,技术问题来了,大家讨论下, jwt 续签为什么要使用双 token tag:www.v2ex.com,2025-12-18:/t/1179704 2025-12-18T03:41:16Z 2025-12-18T14:25:52Z lusxh member/lusxh Gemini 学生 1 年优惠 弄不了了吗? tag:www.v2ex.com,2025-12-18:/t/1179678 2025-12-18T02:55:38Z 2025-12-18T02:55:38Z huyangq member/huyangq sheerid 验证的时候提示: 上传在读证明 您的文档必须包括 你在此表格中输入的全名 完整的或缩写的学术机构名称或标识 当前学年内或距今天不超过 90 天的日期

建议的文档: 带截止日期的学校身份证 课程表 学费收据 文档格式须为 .jpg 、.jpeg 、.png 、.pdf

]]>
现在大家如何管理提示词 tag:www.v2ex.com,2025-12-18:/t/1179674 2025-12-18T02:47:39Z 2025-12-18T04:48:52Z kehuduanbuxing member/kehuduanbuxing 项目里的提示词越来越多,用到的模型也越来越多。大家现在都如何管理项目的模型和提升词

Dify or Langfuse ?这种独立服务是不是又让 vibe coding 变得更加困难了。

]]>
请教一个实操问题, 白嫖的 Gemini Pro 学生号如何使用 3.0 API tag:www.v2ex.com,2025-12-18:/t/1179673 2025-12-18T02:47:32Z 2025-12-18T12:27:03Z Crawping member/Crawping 在 AI Studio 创建了 Key 后导入到 VS Code 发现只能使用 2.5Pro 的模型,无法使用 3.0
下载 Antigravity 一直提示"Not Eligible"登不上,TUN 模式把世界上的 IP 换了个遍都没用

嫖的 Gemini 如何才能使用 Agent 跑 3.0 API..请教下.. ]]>
大家最近使用元宝什么体验 tag:www.v2ex.com,2025-12-18:/t/1179661 2025-12-18T01:54:16Z 2025-12-18T09:37:57Z newInterface member/newInterface 之前挺好用的,最近感觉元宝开始喜欢打官腔,越来越圆滑

]]>
chatgpt 还是比豆包要聪明太多。。。 tag:www.v2ex.com,2025-12-18:/t/1179635 2025-12-18T00:05:45Z 2025-12-17T18:04:45Z red13 member/red13 我们做数据分析产品,想通过开发 excel 插件的方式依靠 excel 这颗大树进行推广,我把相同的问题同时提给了 chatgpt 和豆包,豆包给出的答案是如何具体执行:设计功能、搭建开发环境、上架 Microsoft AppSource 等步骤,而 chatgpt 则教我如何制造并传播焦虑。。。

]]>
分享一个 Vibe Coding 开发的 LeetCode 46. 全排列 的算法题解演示 tag:www.v2ex.com,2025-12-17:/t/1179630 2025-12-17T19:45:27Z 2025-12-17T02:50:15Z CC11001100 member/CC11001100 最近刷算法题总是遇到理解不清楚的点(脑子出厂配置太低细节总是想了忘忘了想。。。),发现让 AI 把算法给我绘制为一个可视化可交互的界面的话会更容易理解一些,比如这个 LeetCode 46. 全排列的算法在线演示: https://fuck-algorithm.github.io/leetcode-46-permutations/

代码仓库: https://github.com/fuck-algorithm/leetcode-46-permutations

效果演示:

46.gif

]]>
从已损坏的备份中拯救数据 tag:www.v2ex.com,2025-12-17:/t/1179616 2025-12-17T16:07:32Z 2025-12-18T02:35:56Z MagicCoder member/MagicCoder 999

前言

12 月 15 号早上,一觉醒来,拿起手机看到我的邮箱收到了内网服务无法访问的告警邮件,本以为只是简单的服务卡死,将服务器重启后就去上班了。

后来,陆续有好友联系我说网站挂了。

iPhone 镜像 2025-12-17 21.18.12

定位问题

晚上下班回家后,尝试将电脑断电重启,发现 pve 只能存活 2 分钟左右,然后整个系统卡死,无法进行任何操作。首先,我想到的是:会不会某个 vm 虚拟机或者 ct 容器影响到宿主机了。

因为系统只能存活几分钟,在执行禁用操作的时候,强制重启了好几次服务器。当所有的服务都停止启动后,卡死的问题依旧存在。

翻日志

没辙了,这已经不是简单的软件问题了,只好翻日志,看报错信息了。

nvme nvme0: I/O timeout, aborting 

如上所示,日志中出现了好几条 I/O 超时消息,顿感不妙,该不会硬盘坏了吧....

找到原因

找了一圈方案,大部分都说这个错误是 nvme 硬盘的通病,他有一个省电模式,在某些硬件+内核的组合下会导致控制器假死。

解决方案也很简单,找到 GRUB 的配置文件,关闭他的自动睡眠和省电模式,在 pve 中这个文件位于/etc/default/grub,打开这个文件后,找到 GRUB_CMDLINE_LINUX_DEFAULT 属性,添加两个值:

GRUB_CMDLINE_LINUX_DEFAULT="quiet nvme_core.default_ps_max_latency_us=0 pcie_aspm=off" 

保存文件后,执行:update-grub 命令,随后重启整个 pve 主机。

VM 无法启动

pve 启动卡死的问题解决了,现在又有了新的问题。启动我那台跑了整个网站服务的 vm 虚拟机时,出现了如下所示的错误:

mount: mounting /dev/sda3 /dev/sda3 on /sysroot failed: No error information Mounting root failed. initramfs emergency recovery shell launched. 

2222

这下坏事了,linux 的根分区无法挂载了😭,应该是刚才频繁的卡死,我不断的启动 pve ,容器不停的启动、强制终止导致盘里这块区域的数据受损了,处于半死不活状态了。

从备份中还原

幸好我之前设置了 vm 容器的整机备份,连续备份并存储 3 天,全部放在了内网另一台机器的机械硬盘中,通过网络挂载到 pve 上的。

image-20251217224605905

本以为一切都会很顺利,还原的时候出现了错误,zstd 解码时,发现压缩块损坏,导致还原失败。

_15-03_00_03.vma.zst : Decoding error (36) : Corrupted block detected vma: restore failed - short vma extent (2801635 < 3801600) /bin/bash: line 1: 2131 Exit 1 zstd -q -d -c /mnt/pve/nfs_usb_4t/dump/vzdump-qemu-100-2025_12_15-03_00_03.vma.zst 

image-20251217225055348

于是,我又尝试了另外两个备份,结果都无法还原,全部都是相同的错误。当初做备份的时候,想着我都整机备份了,而且保存了 3 天的备份,总不可能三个全坏吧。

progress 99% (read 318901321728 bytes, duration 722 sec) _13-03_00_02.vma.zst : Decoding error (36) : Restored data doesn't match checksum progress 100% (read 322122547200 bytes, duration 755 sec) total bytes read 322122547200, sparse bytes 196604751872 (61%) space reduction due to 4K zero blocks 0.414% temporary volume 'local:121/vm-121-disk-0.qcow2' sucessfuly removed no lock found trying to remove 'create' lock error before or during data restore, some or all disks were not completely restored. VM 121 state is NOT cleaned up. TASK ERROR: command 'set -o pipefail && zstd -q -d -c /mnt/pve/nfs_usb_4t/dump/vzdump-qemu-100-2025_12_13-03_00_02.vma.zst | vma extract -v -r /var/tmp/vzdumptmp10764.fifo - /var/tmp/vzdumptmp10764' failed: exit code 1 

现在狠狠的打脸了,我手里目前只有2023 年 11 月迁移技术栈时,那份 docker compose 的初始数据。相当于我丢失了 2 年的数据,这我是不能接受的。

毀滅吧我累了- 毀滅吧我累了 updated their profile picture.

折腾到这里,我一看时间,已经凌晨 1:30 了,明天还要上班,带着郁闷的心情去睡觉了。

强行提取数据

睡醒后,不愿接受这个现实,想到改造的那个练习英语单词的开源项目,这 1 年多时间下来,平均的日活跃人数已经有 40 多个了,数据库存储 8w 多条单词数据了😑,太难受了😭

实在是想不到什么好法子了,只好在 v 站和朋友圈都发了求助帖

IMG_0911

找到方案

在此,感谢 v 站老哥DylanC,给了我一组关键词。

image-20251217231654428

晚上回家后,开始找资料,问 GPT ,经过一番折腾总算是把数据提取出来了。

跳过校验

从上述的错误日志中能看出,我在还原的时候已经读了 99%的数据了,只是文件的完整性校验过不了,我的 vm 虚拟机里一整个全是 docker compose 编排的服务( mysql 、redis 、java 、nginx 等),理论上是比较好找回的。

pve 的定时备份采用的是 vzdump 服务,备份出来的产物是.vma.zst格式的,他的本质是:

知道这些后,我们先把网络存储中的备份文件拷贝到 pve 主机的/var/lib/vz/dump目录,执行下述命令,忽略校验,强行解压。

zstd -d -c --no-check vzdump-qemu-100-2025_12_13-03_00_02.vma.zst \ | vma extract -v - ./extract.partial 

等待一段时间后,程序执行结束,你会发现报错依然存在,但是这不影响已经读取的数据,cd 到./extract.partial 目录,你应该能看到xxx.confxxx.raw文件,然后看下.raw 后缀文件的空间占用,只要不是太小(占用<1GB),那么这份数据基本是没问题的,磁盘的 RAW 文件也算是被解出来了。

挂载 RAW 磁盘

为了防止数据遭到破坏,我们需要做只读挂载,命令如下:

losetup -fP /var/lib/vz/dump/extract.partial/disk-drive-scsi0.raw 

然后,执行命令查看结果。

losetup -a lsblk 

执行后,应该能看到类似loop0loop0p1loop0p2这样的数据,找到那块空间跟你在 extract.partial 目录下看到的空间差不多大小的盘。

image-20251217234910684

挂载分区

首先,我们通过下述命令来创建一个挂载点:

mkdir -p /mnt/rescue 

随后,尝试挂载分区( loop0p1 、loop0p2....等),找你的根分区,如果你运气好,p1 就挂载成功了,那就不需要挂载其他的了。

我的根分区是 p3 ,那么我挂载 p3 即可。

mount -o ro,norecovery /dev/loop0p3 /mnt/rescue 

image-20251217235136772

如果失败的话,代表它不是文件系统,需要继续尝试挂载其他分区,直到成功为止。

umount /mnt/rescue 2>/dev/null mount -o ro,norecovery /dev/loop0p2 /mnt/rescue 

最后,查看挂载点里是否有你的数据。

ls /mnt/rescue 

不出意外的话,你应该能看到类似下图所示的内容。

image-20251217235434358

文件成功恢复,接下来要做的就是把这些文件拷贝到安全的地方即可。

写在最后

至此,文章就分享完毕了。

我是神奇的程序员,一位前端开发工程师。

如果你对我感兴趣,请移步我的个人网站,进一步了解。

]]>
吃饱了撑的突发奇想: TypeScript 类型能不能作为跑业务逻辑的依据?(纯娱乐) tag:www.v2ex.com,2025-12-17:/t/1179606 2025-12-17T14:35:47Z 2025-12-18T08:22:39Z Branlice member/Branlice 吃饱撑的想发:TypeScript 类型能不能用来跑业务呢?(我纯娱乐)

昨天在做业务建模时,看着 TypeScript 的 interface 定义,想到一个问题。

TypeScript 的类型系统在编译后会被擦除( Type Erasure )。这意味着 age: number 这样的约束只存在于开发阶段,运行时完全不可见。

但实际上,这些元数据完整地存在于源码中。如果能写个脚本,在编译时分析源码 AST ,把这些类型信息提取并保存下来,是不是就能在运行时直接复用了?

吃饱了撑的尝试实现了个原型。


1. 从最简单的想法开始

其实最直观的例子,就写的代码里。

interface User { posts: Post[]; } 

这处理是类型约束,其实也顺便描述了业务关系:User 下面有多个 Post 。

如果不去引用那些额外的装饰器、配置文件,直接复用类型定义来描述关系,是不是也行得通?

顺着这个思路,既然显式的“模型关系”可以从 Post[] 这样的类型结构中直接读出来,那更隐晦的“校验规则”(比如字符串长度、格式限制)是不是也能想办法“寄生”在类型里?

如果能同时把“关系”和“规则”都收敛在类型定义中,并通过编译分析提取给运行时使用,那 interface 就不仅仅是静态检查的工具,而变成了完整的业务逻辑描述。

2. 顺手把关系读出来

既然决定要从类型里提取信息,那先试试最简单的“关系”。

比如 posts: Post[]

在 TypeScript 编译器的视角中,这行代码对应着一个结构严谨的 AST (抽象语法树)节点。

编译器通过 PropertySignature 识别属性名,利用 ArrayType 确定数组结构,并借助 TypeReference 锁定元素类型 Post。这些细粒度的结构化数据(可通过 TypeScript AST Viewer 直观查看)完整保留了代码的语义信息。

核心逻辑在于利用 [Compiler API](( https://github.com/microsoft/TypeScript/wiki/Using-the-Compiler-API)) (记录下,他是个强大的工具集,允许开发者像编译器一样“理解”代码。) 遍历 AST:一旦识别到数组类型的属性定义,便将其提取并映射为“一对多”的关系描述。经过转换,源码中的类型定义就被标准化为一份配置 JSON:

"relations": { "posts": { "type": "hasMany", "target": "Post" } } 

这样,模型关系配置就可以直接复用类型定义。

3. 那规则呢?先找个地方藏

关系搞定了,接下来是更复杂的校验规则(如 minLenemail)。TypeScript 本身没有地方直接写 minLen 这种东西,所以好像需要一个载体。

在 TypeScript 的泛型可以是实现一种 Phantom Type (幽灵类型):

// T 是实际运行时的类型 // Config 是仅编译期存在的元数据 type Field<T, Config> = T; 

Field<string, ...> 在运行时就是普通的 string。泛型参数 Config 虽然会被编译擦除,但在 AST 中是可以读取到的。

这样好像就可以在不影响运行时逻辑的前提下嵌入元数据。

看起来像是:

// src/domain/models.ts // 引入我定义的“幽灵类型” import type { Str, Num } from '@bizmod/core'; import type { MinLen, Email, BlockList } from '@bizmod/rules'; export interface User { id: Str; // 多个规则一起用:最少 2 个字 + 违禁词过滤 name: Str<[ MinLen<2>, BlockList<["admin", "root"]> ]>; email: Str<[Email]>; } 

在编辑器里,name 依然是字符串,该怎么用怎么用,完全不影响开发。但在代码文本里,那个 MinLenBlockList 的标记就留在那儿了。

4. 把规则也读出来

定义好类型载体,下一步就是把这些规则信息也读出来。我查了一下,这里正好可以用 TypeScript 的 Compiler API 来实现。

简单来说,它能把 .ts 文件变成一棵可以遍历的树( AST )。我们写个脚本,遍历所有的 interface。当发现属性使用了 Field 类型时,读取其泛型参数(比如 MinLenadmin),并保存下来。

核心逻辑大概是这样(简化版):

// analyzer.ts (伪代码) function visit(node: ts.Node) { // 1. 找到所有 Interface if (ts.isInterfaceDeclaration(node)) { const modelName = node.name.text; // 拿到 "User" // 2. 遍历它的属性 node.members.forEach(member => { const fieldName = member.name.text; // 拿到 "name" // 3. 重点:解析泛型参数! // 这里能拿到 "MinLen", "BlockList" 甚至里面的 ["admin", "root"] const rules = extractRulesFromGeneric(member.type); schema[modelName][fieldName] = rules; }); } } 

运行脚本后,生成了一个完整的 schema.json,包含了关系和校验规则:

{ "User": { "name": "User", "fields": { "name": { "type": "string", "required": true, "rules": { "minLen": 2, "blockList": ["admin", "root"] } }, "email": { "type": "string", "rules": { "email": true } } }, "relations": { "posts": { "type": "hasMany", "target": "Post" } } } } 

代码里的信息就被提取出来了存成了清单。

5. 运行时怎么用?

前面的脚本跑完以后,所有这些信息(校验规则 + 模型关系)就都存进了 schema.json 里。

--

有了这个文件,运行时要做的事情就很简单了。

--

程序启动时读取这个 JSON 。当 API 接收到数据时,根据 JSON 里的规则自动执行校验逻辑。

这样就实现了把 TypeScript 的静态类型信息带到运行时使用。

以后新增业务模型,只需要维护一份 interface 定义,校验规则和关系定义都会自动同步生成。

--

6. 简单的验证 Demo

为了验证可行性,写个测试。

1. 类型定义

利用 Phantom Type 携带元数据:

// types.ts // T 是真实类型,Rules 是元数据 export type Field<T, Rules extends any[]> = T; // 定义一个规则类型 export type MinLen<N extends number> = { _tag: 'MinLen', val: N }; // 业务代码 export interface User { name: Field<string, [MinLen<2>]>; } 

2. 编译器分析 (Analyzer)

使用 TS Compiler API 提取元数据(简化版):

// analyzer.ts import * as ts from "typescript"; function analyze(fileName: string) { const program = ts.createProgram([fileName], {}); const sourceFile = program.getSourceFile(fileName)!; ts.forEachChild(sourceFile, node => { // 1. 找到 Interface if (!ts.isInterfaceDeclaration(node)) return; node.members.forEach(member => { // 2. 获取属性名 "name" const name = member.name.getText(); // 3. 获取类型节点 Field<...> if (ts.isTypeReferenceNode(member.type)) { // 4. 提取第二个泛型参数 [MinLen<2>] const rulesArg = member.type.typeArguments?.[1]; // 5. 这里就可以解析出 "MinLen" 和 2 了 console.log(`Field: ${name}, Rules: ${rulesArg.getText()}`); } }); }); } 

3. 运行时消费

生成的 JSON 元数据可以直接在运行时使用:

// runtime.ts const schema = { User: { name: { rules: { minLen: 2 } } } }; function validate(data: any) { const rules = schema.User.name.rules; if (rules.minLen && data.name.length < rules.minLen) { throw new Error("Validation Failed: Too short"); } } 

最后扯犊子

这次尝试的核心逻辑其实很简单:用脚本把代码里的类型“抄”出来,存成 JSON ,然后程序运行的时候照着 JSON 执行。

--

本质上,就是把 TypeScript 代码当成配置文件来用。

我只是纯无聊玩玩,如果有大佬想写个小工具什么的。可以放在下面(我懒)。

--

最后,你们在玩 TypeScript 的时候有哪些骚想法?

]]>
有人收到 AppsCloud .pro 的邮件吗? 说代上架每周给 50$ tag:www.v2ex.com,2025-12-17:/t/1179601 2025-12-17T14:00:34Z 2025-12-17T13:59:34Z sofukwird member/sofukwird 我收到了一个示例应用,想看看它是如何做诈骗的, 但看权限申请也没啥奇怪的 应用是一个很简单的记事本, 把 aab 下载链接放这了: https://www.123865.com/s/3ulGvd-wMxMd ,有兴趣的话可以看看它是怎么做热更新诈骗, 小弟非常好奇了

这下面要求了哪些权限(问了 GPT 都是一些很普通的权限, 没有涉及高危权限) package: com.rbombanza.suga uses-permission: name='android.permission.INTERNET' permission: com.rbombanza.suga.permission.C2D_MESSAGE uses-permission: name='com.rbombanza.suga.permission.C2D_MESSAGE' uses-permission: name='android.permission.POST_NOTIFICATIONS' uses-permission: name='android.permission.WAKE_LOCK' uses-permission: name='com.google.android.c2dm.permission.RECEIVE' uses-permission: name='android.permission.VIBRATE' uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' uses-permission: name='com.sec.android.provider.badge.permission.READ' uses-permission: name='com.sec.android.provider.badge.permission.WRITE' uses-permission: name='com.htc.launcher.permission.READ_SETTINGS' uses-permission: name='com.htc.launcher.permission.UPDATE_SHORTCUT' uses-permission: name='com.huawei.android.launcher.permission.CHANGE_BADGE' uses-permission: name='com.huawei.android.launcher.permission.READ_SETTINGS' uses-permission: name='com.huawei.android.launcher.permission.WRITE_SETTINGS' uses-permission: name='me.everything.badger.permission.BADGE_COUNT_READ' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' uses-permission: name='android.permission.FOREGROUND_SERVICE' permission: com.rbombanza.suga.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION uses-permission: name='com.rbombanza.suga.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION' uses-permission: name='android.permission.ACCESS_ADSERVICES_ATTRIBUTION' uses-permission: name='com.google.android.gms.permission.AD_ID' uses-permission: name='com.samsung.android.mapsagent.permission.READ_APP_INFO' uses-permission: name='com.huawei.appmarket.service.commondata.permission.GET_COMMON_DATA' uses-permission: name='com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE' 
]]>
吐槽下,感觉国产模型/Agent 不靠谱 tag:www.v2ex.com,2025-12-17:/t/1179580 2025-12-17T11:56:38Z 2025-12-17T20:49:32Z asd999cxcx member/asd999cxcx 用的 trae 、roo code 、kilo code ,trae 一直这样,roo code 、kilo code 勉强好点,ERROR 数量在下降。
话说国产模型应该对鸿蒙一类的支持更好才对吧,为啥会这样? ]]>
NetProxy-Magisk —基于 Xray 核心 的系统级透明代理模块 tag:www.v2ex.com,2025-12-17:/t/1179573 2025-12-17T11:25:14Z 2025-12-17T14:18:58Z fanju745 member/fanju745 NetProxy-Magisk

NetProxy-Magisk 基于 Xray 核心 实现系统级透明代理,提供统一的全局流量转发能力,适合需要深度代理控制的用户。


🔧 主要特性


🖼 界面预览

NetProxy UI 1 NetProxy UI 2 NetProxy UI 3

📦 安装方式

使用 Magisk Manager 刷入 ZIP → 重启即可使用


📘 配置说明


📂 GitHub

👉 https://github.com/Fanju6/NetProxy-Magisk

如果你想在 Android 上获得真正意义的 系统级 Xray 透明代理体验,欢迎试用,也欢迎提交 Issue / PR


📢 Telegram 群组

欢迎加入讨论、交流与反馈:

👉 https://t.me/NetProxy_Magisk

]]>
腾讯的开发平台是不是每个平台都得认证一遍审核一次资质 tag:www.v2ex.com,2025-12-17:/t/1179561 2025-12-17T09:50:49Z 2025-12-17T15:52:40Z victimsss member/victimsss 你们 codex 一般都开啥等级? tag:www.v2ex.com,2025-12-17:/t/1179513 2025-12-17T07:52:39Z 2025-12-17T16:40:00Z asd999cxcx member/asd999cxcx Bitwarden 重复提示更新现有的登录 tag:www.v2ex.com,2025-12-17:/t/1179512 2025-12-17T07:52:21Z 2025-12-17T17:47:57Z haukuen member/haukuen 填充密码登录后必定出现 更新现有的登录 的弹窗,实际并未修改密码,初步测试好像是同一个网站有多个账号的时候会触发

以前只有密码不一致的时候才会弹窗,用的是自建的 vaultwarden 1.34.3-alpine ,没有修改过版本,有一样情况的人吗?

]]>
go 选手的第二语言选择 tag:www.v2ex.com,2025-12-17:/t/1179503 2025-12-17T07:39:31Z 2025-12-17T20:02:23Z YanSeven member/YanSeven 目前主力是 go ,python 。想增进一门第二语言。

java, c++, rust 哪个更合适一点呢。

ps:楼主不认同有了 ai 就不需要学习的论调,除非 ai 能彻底取代了我让我没活儿干,不然只要我盯在岗位上,那么无论是 ai 还是系统需求,都要求我有一定的熟练技能。

所以,说不用学的朋友可以暂时不表达啦。 ]]>
AI 时代大家都变了 tag:www.v2ex.com,2025-12-17:/t/1179498 2025-12-17T07:20:17Z 2025-12-17T04:20:17Z dsphper member/dsphper 为什么这么好的项目没人 star !!! https://v2ex.com/t/1179453?p=1#reply1

]]>
有什么技术改造建议 tag:www.v2ex.com,2025-12-17:/t/1179489 2025-12-17T07:03:09Z 2025-12-17T07:46:29Z shutting member/shutting 目前在做 SAAS 项目,基建比较垃圾但是平台提供的功能也都有 目前需求较少,想做一些技术改造来充实工作量 技术栈为 Java 目前的想法有接入 Pinpoint ,火焰图,租户隔离器这些 不知道还有什么好的建议

]]>
Gemini 3 Flash 要来了 tag:www.v2ex.com,2025-12-17:/t/1179482 2025-12-17T06:44:57Z 2025-12-16T15:47:06Z XR843 member/XR843 让 AI 一键读取蓝湖产品文档 tag:www.v2ex.com,2025-12-17:/t/1179480 2025-12-17T06:39:26Z 2025-12-17T05:39:26Z dsphper member/dsphper 做了个工具:让 AI 直接读蓝湖需求,团队所有 AI 共享知识库

解决两个痛点

痛点 1: 看蓝湖需求还要手动截图、复制粘贴给 AI ?

现在: 直接给个 URL ,AI 自动提取 Axure 原型、字段规则、业务逻辑,支持开发/测试/探索三种分析模式。

痛点 2: 每个人的 Cursor/Windsurf 都是孤岛,我的 AI 分析完需求,测试同学的 AI 又重新分析一遍。

现在: 所有 AI 连接同一个 MCP Server ,后端 AI 分析的结果,测试 AI 直接查询用。支持知识库、踩坑记录、 @提醒、飞书通知。

开源地址

GitHub: https://github.com/dsphper/lanhu-mcp
License: MIT

欢迎 Star ⭐ 和提 Issue/PR 。

]]>
小米这个 MiMo-V2-Flash 好像有点东西 tag:www.v2ex.com,2025-12-17:/t/1179472 2025-12-17T06:28:57Z 2025-12-17T08:28:57Z KIRAYOMATO member/KIRAYOMATO https://leetcode.cn/problems/maximum-profit-from-trading-stocks-with-discounts

还测试其他几家,都是网页版开思考直接对话,结果如下

小米 > 元宝 >> deepseek > glm4.6 > 豆包 >>> kimi

这上面只有小米和元宝能一次 AC ,deepseek ,glm4.6 和豆包都是超时,排名是相对的程序运行速度,kimi 直接写出来的没法运行 ]]>
美区账号开了 Tun 还是无法使用 antigravity tag:www.v2ex.com,2025-12-17:/t/1179461 2025-12-17T06:03:16Z 2025-12-17T20:25:17Z danshan member/danshan


已经明确的点是

1. 和网络无关,我的另一个账号登录正常,两个都是美区,像一个电脑的相同网络环境。美区 ip ,tun 模式

2. 做了年龄验证。

3. 无法登陆的账号 aistudio ,gemini 都能正常使用,甚至使用美区 paypal 开了 google ai pro 的 20 美金的 gemini 一样无法正常打开。



还有什么可能呢? ]]>
怎么看新发布的编程语言“SUI” tag:www.v2ex.com,2025-12-17:/t/1179459 2025-12-17T05:59:13Z 2025-12-17T06:02:27Z Pbe2RsrnVcPrF member/Pbe2RsrnVcPrF Sui 的目标是在革命性地解决大语言模型(LLM)编写代码的准确性问题,并宣称能让 LLM 以 100% 的准确率生成代码。

]]>
⚡ 需求分析效率提升 183%!首个为 AI 编程时代设计的团队协作 MCP 开源啦! AI 一键阅读蓝湖文档。 tag:www.v2ex.com,2025-12-17:/t/1179453 2025-12-17T05:34:26Z 2025-12-17T02:34:26Z dsphper member/dsphper ⚡ 需求分析效率提升 183%! AI 自动读取蓝湖文档、团队协作功能打破 Cursor/Windsurf/等 AI IDE 上下文孤岛,让所有 AI 共享知识库

TL;DR

做了个工具解决两个痛点:

  1. AI 直接读蓝湖:给个 URL ,AI 自动提取 Axure 原型并分析(不用复制粘贴了)
  2. 打破 AI 孤岛:团队所有人的 AI ( Cursor/Windsurf/Claude )共享知识库,不再重复劳动

GitHub: https://github.com/dsphper/lanhu-mcp
基于 Model Context Protocol (MCP)


背景:AI 时代的两个新痛点

痛点 1:需求文档还要手动复制粘贴?

以前看蓝湖需求文档的流程:

  1. 打开蓝湖链接
  2. 一页一页截图/复制文字
  3. 粘贴给 AI
  4. 重复 10 次...

都 AI 时代了,为啥还要手动复制粘贴?直接给个 URL 让 AI 自己去读不香吗?

痛点 2:每个人的 AI 都是孤岛

我的 Cursor AI 分析完需求,花了 5 分钟理清字段规则。

结果:

每个人的 Cursor/Windsurf 是独立的,AI 之间完全不共享上下文。


解决方案

核心功能 1:AI 直接读蓝湖文档

不需要复制粘贴,直接对 AI 说:

@AI 帮我看下这个需求文档 https://lanhuapp.com/web/#/item/project/product?tid=xxx&pid=xxx&docId=xxx 

AI 自动完成:

支持 3 种分析模式:

还支持 UI 设计:

@AI 帮我下载"首页设计"的所有切图到 src/assets/ 

AI 自动识别项目类型( React/Vue ),生成语义化文件名,批量下载。

核心功能 2:团队留言板(这是最爽的功能)

后端 AI 分析完需求后:

@测试小李 @前端小张 我分析了"用户登录"需求: - 手机号必填,11 位数字 - 密码 6-20 位,必须包含字母+数字 - 验证码 4 位纯数字,5 分钟有效 - 错误 3 次锁定 30 分钟 [类型:knowledge] // 保存到知识库 

测试同学的 AI 直接查询:

@AI 查看所有关于"登录"的知识库 → 立即获取后端 AI 的分析结果! 

架构图:

 ┌─────────────────────────────┐ │ Lanhu MCP Server │ │ (统一知识中枢) │ │ │ │ 📊 需求分析结果 │ │ 🐛 开发踩坑记录 │ │ 📋 测试用例模板 │ │ 💡 技术决策文档 │ └──────────┬──────────────────┘ │ ┌────────────┼────────────┐ │ │ │ ┌────▼───┐ ┌───▼────┐ ┌──▼─────┐ │后端 AI │ │前端 AI │ │测试 AI │ │(小王) │ │(小张) │ │(小李) │ └────────┘ └────────┘ └────────┘ Cursor Windsurf Claude 

支持的留言类型:

还能:


实际效果

以前:

现在:

保守估计,每周能节省团队 5-10 小时。


技术实现

核心代码 3800+ 行,单文件部署。

安装和配置

最简单方式(让 AI 帮你):

在 Cursor 中对 AI 说:

"帮我克隆并安装 https://github.com/dsphper/lanhu-mcp 项目" 

AI 会引导你完成所有步骤。

手动安装:

git clone https://github.com/dsphper/lanhu-mcp.git cd lanhu-mcp # Docker 部署(推荐) bash setup-env.sh # 交互式配置 Cookie docker-compose up -d # 或源码运行 bash easy-install.sh # 一键安装并配置 

配置 Cursor:

{ "mcpServers": { "lanhu": { "url": "http://localhost:8000/mcp?role=后端&name=张三" } } } 

适用场景

适合你,如果:

不适合你,如果:


开源地址

GitHub: https://github.com/dsphper/lanhu-mcp
License: MIT
文档: 挺详细的,有快速开始、部署指南、Cookie 获取教程

欢迎提 Issue 、PR ,或者在下面讨论。


想听听大家的意见

  1. 你们团队的 AI 协作有遇到类似问题吗?
  2. 除了需求分析和团队协作,还有什么场景适合"AI 共享知识"?
  3. 有没有人用过类似的工具?效果如何?
  4. 如果支持 Figma/墨刀/其他原型工具,有人用吗?

最后

如果你认可这个想法,或者觉得对你有帮助,给个 Star ⭐ 就是对我最大的鼓励!

GitHub: https://github.com/dsphper/lanhu-mcp


P.S. 代码可能不够优雅( 3800 行单文件),欢迎拍砖和提 PR 。

P.P.S 项目对小白友好,不懂技术也能让 AI 帮你安装,详见 README 。

]]>
各位大佬,你们公司内部的代码库有 PR 吗? tag:www.v2ex.com,2025-12-17:/t/1179443 2025-12-17T04:26:00Z 2025-12-17T13:36:44Z zenfsharp member/zenfsharp 我司一共才四五个后端,现在是各玩各的,各人熟悉自己的一摊逻辑,很少碰其他人的。

这导致有些底层逻辑明明可以共用同一个函数,也几乎人手一个实现;另外这个人 A 改动的东西,可能也影响了另一个人 B 的逻辑却不知道,导致程序 bug 了,B 寻思着明明我最近没改这块怎么忽然出 bug 了,找半天发现是 A 动了底层,而 A 又不知道 B 也在用这个。

所以我们老板想在公司内的代码库里开 PR ,自己的分支合并到 Dev 分支时要走 PR ,让另一个人 review 一下,这样能不能提升代码质量另说,起码能增加内部交流。

各位大佬你们公司内部有 PR 吗?

]]>
你愿意阅读同事用 AI 生成的代码吗? tag:www.v2ex.com,2025-12-17:/t/1179436 2025-12-17T03:53:20Z 2025-12-17T21:16:03Z stinkytofux member/stinkytofux 正在审阅代码的我突然不想看了, 让 AI 审核扫一遍没问题就行. 功能能跑就行.

所有人都在用 AI, 建造屎山的速度越来越快. 你还能静得下心去分析日志吗? 还愿意仔细推敲每一行代码的逻辑吗?

就像一篇文章, 如果知道是 AI 写的, 我会瞬间失去阅读的兴趣. 感觉自己的时间都被浪费了.

]]>
ChatGPT, Claude, Gemini 会员三选一 应该买哪一个? tag:www.v2ex.com,2025-12-17:/t/1179389 2025-12-17T02:05:45Z 2025-12-18T12:42:53Z lovelyxiaod member/lovelyxiaod 如果预算有限,在 ChatGPT, Claude, Gemini 中只选择一个开会员的话,你会选哪一个?

]]>
新手问问大佬们, AI IDE 或 大模型数据安全问题 tag:www.v2ex.com,2025-12-17:/t/1179354 2025-12-17T00:33:45Z 2025-12-17T10:37:23Z lixuda member/lixuda 虽然很多他们写的隐私告知 代码会参与训练或不训练,那么完整代码泄露风险有多大?有这个被爆出来的案例吗?

]]>
实现一个流式 Json 解析器,解决既要求结构化数据又需要实时流式输出的一种思路 tag:www.v2ex.com,2025-12-16:/t/1179289 2025-12-16T09:29:39Z 2025-12-16T19:44:00Z wantDoraemon member/wantDoraemon 为什么需要流式 JSON 解析?

AI 模型的输出通常是逐字生成的流式数据,尤其是在实时对话交互的场景中,用户希望能即时看到 AI 输出内容的过程。而另一方面,我们在很多场景下需要 AI 模型输出结构化的内容,方便我们后续处理和展示。我们可以通过 markdown 的标题格式来组织 AI 的输出,但是 markdown 的无法做到强约束。如果需要保证强结构化,那么我们一般会采用 JSON 格式,对此很多模型都有强制约束输出 Json 的参数。 这其中有两大问题:

  1. 高延迟 :如果使用 Json 格式,传统的 Json.Parse 方法必须等待整个字符串接收完毕才能解析,这会导致高延迟问题。用户无法实时看到 AI 的思考过程,体验大打折扣。
  2. 交互不稳定 :如果使用 Markdown 格式,AI 输出可能不符合预期,导致前端展示异常。

因此,我们需要一种能够边接收数据边解析的方案,确保用户实时看到 AI 的输出,同时保证解析的健壮性。


场景

例如我们在理解用户问题这个场景时,既想要结构化的数据,又想要实时的将结果反馈到前端 preview

设计目标

为了解决上述问题,我们设计了一款流式 JSON 解析器,目标包括:

  1. 实时性:支持逐字符解析,边接收边触发回调。
  2. 路径订阅:允许用户按需订阅 JSON 中的特定路径(如 $.nodes[*].title),减少无效数据处理。
  3. 增量输出:针对字符串值,仅发送新增部分,避免重复传递完整值。
  4. 健壮性:即使 JSON 格式不完整或后续部分有错误,已解析的数据也能正常使用。

核心实现

我们的解析器基于手写的有限状态机( FSM ),逐字符处理流式数据。以下是实现的关键组件和流程:

1. StreamingJsonParser (流式解析器)

状态机的核心逻辑如下: 状态机

2. SimplePathMatcher (路径匹配器)


增量与实时模式

解析器支持两种模式:

  1. 实时模式( realtime=true ):在值尚未最终确定时,依据当前缓冲区内容触发回调,适合逐字生成的场景。
  2. 增量模式( incremental=true ):针对字符串值,仅发送新增部分,避免重复传递完整值。

以下是增量解析的示例:

matcher := utils.NewSimplePathMatcher() matcher.On("$.choices[0].delta", func(value interface{}, path []interface{}) { fmt.Printf("path=%v, value=%v\n", path, value) }) parser := utils.NewStreamingJsonParser(matcher, true, true) _ = parser.Write("{\"choices\":[{\"delta\":\"") _ = parser.Write("Hel") // 增量触发回调:"Hel" _ = parser.Write("lo\"}]}\n") // 增量触发回调:"lo",结束后不再发送整串 _ = parser.End() 

性能与内存优化


常见问题与改进方向

  1. 字符串转义:支持常见转义 \n, \t, \r, \\, \", \/, \b, \f;当前未支持 \uXXXX Unicode 转义序列,可按需扩展。
  2. 路径匹配:目前为精确匹配,可考虑支持前缀匹配或更完整的 JsonPath 语法。
  3. 增量支持:目前仅支持字符串值的增量输出,未来可扩展至对象和数组。

文档&代码实现

代码使用 Golang 实现,如果需要使用其他语言,可以让 AI 翻译一下即可。

通过自研流式 JSON 解析器,成功解决了 AI 应用中实时性和结构化输出的难题。希望这次分享能为有类似需求的开发者提供参考。

]]>
国内公司内部考虑 AI 编程工具的话,会选哪家? tag:www.v2ex.com,2025-12-16:/t/1179259 2025-12-16T07:39:48Z 2025-12-17T03:35:39Z Jony4Fun member/Jony4Fun Kiro VS Trae VS Qoder

选哪家

最近 ai ide 研究得少了,想听听大家用过的一家?

]]>
请教一下 Copilot 有没有节约 token / request 的技巧? tag:www.v2ex.com,2025-12-16:/t/1179227 2025-12-16T05:29:52Z 2025-12-15T22:21:54Z daishankeke member/daishankeke
然后项目中有一些约定,比如不能用 xx 语法之类的。有没有一个通用的“默认提示词”可以不用我每次输入,但是可以生效的? ]]>
为了解决 AI 流式输出的重复解析问题,我发布了 incremark:普通情况下 AI 流式渲染也能提速 2-10 倍以上 tag:www.v2ex.com,2025-12-16:/t/1179201 2025-12-16T03:57:08Z 2025-12-17T01:57:00Z 1244943563 member/1244943563 昨天,我发布了周末开发的 incremark。实际性能远超预期——在 AI 流式场景中通常实现了 2-10 倍的速度提升,对于更长的文档提升更大。虽然最初打算作为自己产品的内部工具,但我意识到开源可能是一个更好的方向。

问题所在

每次 AI 流式输出新的文本块时,传统的 markdown 解析器都会从头开始重新解析整个文档——在已经渲染的内容上浪费 CPU 资源。Incremark 通过只解析新增内容来解决这个问题。

基准测试结果

较短的 Markdown 文档:

image.png

较长的 Markdown 文档:

image.png

说明:由于分块策略的影响,每次基准测试的性能提升倍数可能有所不同。演示页面使用随机块长度:const chunks = content.match(/[\s\S]{1,20}/g) || []。这种分块方式会影响稳定块的生成,更好地模拟真实场景(一个块可能包含前一个或后一个块的内容)。无论如何分块,性能提升都是有保证的。演示网站没有使用任何有利于偏向自身性能展示的分块策略来夸大结果。

在线演示:

对于超长的 markdown 文档,性能提升更加惊人。20KB 的 markdown 基准测试实现了令人难以置信的 46 倍速度提升。内容越长,提速越显著——理论上没有上限。

核心优势

通常 2-10 倍提速 - 针对 AI 流式场景
🚀 更大的提速 - 对于更长的文档(测试最高达 46 倍)
🎯 零冗余解析 - 每个字符最多只解析一次
完美适配 AI 流式 - 专为增量更新优化
💪 也适用于普通 markdown - 不仅限于 AI 场景
🔧 框架支持 - 包含 React 和 Vue 组件

为什么这么快?

传统解析器的问题

开发过 AI 聊天应用的小伙伴都知道,AI 流式输出会将内容分成小块传输到前端。每次接收到新块后,整个 markdown 字符串都必须喂给 markdown 解析器(无论是 remark 、marked.js 还是 markdown-it )。这些解析器每次都会重新解析整个 markdown 文档,即使是那些已经渲染且稳定的部分。这造成了很多不必要的的性能浪费。

像 vue-stream-markdown 这样的工具在渲染层做了努力,将稳定的 token 渲染为稳定的组件,只更新不稳定的组件,从而在 UI 层实现流畅的流式输出。

然而,这仍然无法解决根本的性能问题:markdown 文本的重复解析。这才是真正吞噬 CPU 性能的元凶。输出文档越长,性能浪费越严重。

Incremark 的核心性能优化

除了在 UI 渲染层实现组件复用和流畅更新外,incremark 的关键创新在于 markdown 解析只解析不稳定的 markdown 块,永不重新解析稳定的块。这将解析复杂度从 **O(n²) 降低到 O(n)**。理论上,输出越长,性能提升越大。

1. 增量解析:从 O(n²) 到 O(n)

传统解析器每次都重新解析整个文档,导致解析工作量呈二次方增长。Incremark 的 IncremarkParser 类采用增量解析策略(参见 IncremarkParser.ts):

// 设计思路: // 1. 维护一个文本缓冲区来接收流式输入 // 2. 识别"稳定边界"并将已完成的块标记为 'completed' // 3. 对于正在接收的块,只重新解析该块的内容 // 4. 复杂的嵌套节点作为一个整体处理,直到确认完成 

2. 智能边界检测

append 函数中的 findStableBoundary() 方法是关键优化点:

append(chunk: string): IncrementalUpdate { this.buffer += chunk this.updateLines() const { line: stableBoundary, contextAtLine } = this.findStableBoundary() if (stableBoundary >= this.pendingStartLine && stableBoundary >= 0) { // 只解析新完成的块,永不重新解析已完成的内容 const stableText = this.lines.slice(this.pendingStartLine, stableBoundary + 1).join('\n') const ast = this.parse(stableText) // ... } } 

3. 状态管理避免冗余计算

解析器维护几个关键状态来消除重复工作:

4. 增量行更新优化

updateLines() 方法只处理新内容,避免全量 split 操作:

private updateLines(): void { // 找到最后一个不完整的行(可能被新块续上) const lastLineStart = this.lineOffsets[prevLineCount - 1] const textFromLastLine = this.buffer.slice(lastLineStart) // 只重新 split 最后一行及其后续内容 const newLines = textFromLastLine.split('\n') // 只更新变化的部分 } 

性能对比

这种设计在实际测试中表现卓越:

文档大小 传统解析器(字符数) Incremark (字符数) 减少比例
1KB 1,010,000 20,000 98%
5KB 25,050,000 100,000 99.6%
20KB 400,200,000 400,000 99.9%

关键不变量

Incremark 的性能优势源于一个关键不变量:一旦块被标记为 completed ,就永远不会被重新解析。这确保了每个字符最多只被解析一次,实现了 O(n) 的时间复杂度。


🚀 立即开始

停止在冗余解析上浪费 CPU 资源。立即尝试 incremark:

快速安装

npm install @incremark/core # React 版本 npm install @incremark/react # Vue 版本 npm install @incremark/vue 

资源链接

使用场景

完美适用于:

无论你是在构建 AI 界面还是只是想要更快的 markdown 渲染,incremark 都能提供你需要的性能。


欢迎体验与支持

非常欢迎尝试与体验,在线演示是感受速度提升最直观的方式:

如果你觉得 incremark 有用并想要参与改进,也欢迎提交 issue 与独特想法!GitHub Issues

]]>
自动化生成报表有没有什么好的方案 tag:www.v2ex.com,2025-12-16:/t/1179189 2025-12-16T03:30:16Z 2025-12-16T08:45:06Z dadadadaadada member/dadadadaadada 银行内网环境,数据都在数据库里,需要按业务人员给的业务逻辑生成各种报表并定期更新,各位大佬们有什么好的做法吗

]]>
vibe coding 练手做的,来玩玩吗 🐶 tag:www.v2ex.com,2025-12-16:/t/1179186 2025-12-16T03:24:06Z 2025-12-16T06:24:06Z hello267015 member/hello267015 Claude4.5,GPT5.2,Gemini3 pro 感官对比 tag:www.v2ex.com,2025-12-16:/t/1179182 2025-12-16T03:20:27Z 2025-12-16T22:44:20Z YanSeven member/YanSeven
claude4.5 免费版
gemini3 pro 是 ai studio 的免费版
gpt5.2 是开通的 plus 会员的 thinking

对比下来,感官上,gpt5.2 生成的文档,在文章结构和逻辑条理上会更加丰富一点。

所以,仅就八股类的知识来说:
我个感官上的排序就是:gpt5.2 >= gemini3 pro >= claude4.5

仅作一点个人的小分享。 ]]>
OJK 审核流程 tag:www.v2ex.com,2025-12-16:/t/1179166 2025-12-16T02:43:29Z 2025-12-16T02:42:29Z airtee member/airtee 公司是做跨境高炮的,经常会弄一些合规的流程,这些流程整理出来有价值吗,有大佬知道相关类似的群吗

]]>
想搞个 AI 电商客服,求 V 友们给建议 tag:www.v2ex.com,2025-12-16:/t/1179160 2025-12-16T02:18:56Z 2025-12-16T15:05:30Z Jack66 member/Jack66 1.不想自己训练模型,打算直接采用付费模型。 2.文档清晰 3.上手快 4.稳定可靠

]]>
2 年的数据丢了...还有机会还原吗😭 tag:www.v2ex.com,2025-12-16:/t/1179127 2025-12-16T01:00:49Z 2025-12-16T17:37:54Z MagicCoder member/MagicCoder pve 的 vma.zst 格式结尾的备份文件,还原的时候提示不完整,还有概率修复吗,他能读 99%,我这个 vm 里是个 docker compose 编排的容器以及产生的数据,里面有 java 服务、mysql 、redis

图一是备份时的日志,图二是还原时的报错。

也试着跑了下文件的完整性检验,检验也是失败的

cdf785513fc9909818c27d998b67871e

e4acb598b664a94eb5b6fd116e3aaff6

]]>
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86