ZengLiangYi avatar
ZengLiangYi

博客

技术思考、实践总结与开源分享

01
订阅2026-06-081 min read

版本管理:npm 发布 + Electron 打包 + CI/CD

本文介绍了如何为同时提供npm CLI和Electron桌面端的开源项目搭建自动化发布流水线。主要内容包括: 双版本号管理:遵循SemVer规范,独立管理npm和Electron版本号,支持灵活发布模式。 一键发版脚本:通过release.mjs实现版本号更新、提交、打标签和推送,支持全量、仅npm或仅Electron发布。 npm发布优化:利用Trusted Publisher和--provenance参数确保安全发布,精简files字段控制发布内容。 Electron打包配置:通过electron-bu

02
订阅2026-06-081 min read

测试策略:单元测试 + 集成测试怎么写

本文介绍了如何为全栈TypeScript项目建立测试体系,通过测试金字塔模型(单元测试70%、集成测试适量、少量E2E测试)分层实施。以ChatCrystal项目为例,使用Node.js内置的node:test模块实现零依赖测试方案,涵盖纯函数单元测试(如正则清洗、文本分块、路径解析)、集成测试(sql.js内存数据库与Fastify路由测试)以及CI自动化。文章强调单元测试应快速验证函数输入输出,集成测试需关注模块协作,所有代码示例可在GitHub仓库查看。该方案适合追求轻量级、原生ESM支持的TypeS

03
订阅2026-06-061 min read

困扰我多年的“今天写啥“,被这个选题功能解决了大半

这篇文章测评了CSDN「AI数字营销平台」的「选题发现」和「热点洞察创作」功能。作者作为技术博主,认为选题是最痛苦的环节,而该功能通过实时热点推荐和结构化创作流程(选题→策略→大纲→内容)大幅提升了效率。亮点包括:AI领域热点精准且实时,四步流程保留创作者对大纲的掌控,默认优化SEO/GEO。但生成内容仍需人工润色,AI味较浓。建议扩展非AI领域热点、丰富策略选项、优化内容自然度。总体评价该功能能解决选题难题,值得一试。

04
订阅2026-06-061 min read

用了一周 CSDN 的 AI 数字营销平台,我把它从头到尾摸了个遍

CSDN推出的「AI数字营销平台」并非简单的AI写作工具,而是覆盖了从选题到发布的全链路内容营销解决方案。体验一周后发现,其亮点在于实时热点追踪(尤其AI领域)、SEO/GEO自动优化及多平台一键分发功能,大幅节省内容创作的前后期精力。但存在生成内容稳定性待提升、批量额度有限等问题。该平台更适合需要持续产出的技术博主或内容运营团队,对低频创作者可能过重。后续将分模块深入测评其选题、批量生产等核心功能。

05
订阅2026-06-061 min read

代码规范:ESLint + Prettier 配置实战

本文介绍了在TypeScript + React monorepo项目中落地Lint工具链的完整方案。重点内容包括: 采用ESLint Flat Config新格式配置客户端React/TS专项检查,整合TypeScript ESLint和React插件; 通过Biome(全仓库通用检查)和ESLint(客户端专项检查)双层架构实现职责分离; 处理Prettier与ESLint的规则冲突,建议使用eslint-config-prettier关闭冲突规则; 配置编辑器即时反馈和pre-commit hooks

06
订阅2026-06-061 min read

TypeScript 项目配置:tsconfig、ESM、路径别名

本文针对TypeScript工程化配置需求,详细讲解了在monorepo环境下管理多包编译的最佳实践。以ChatCrystal项目为例,展示了一个包含shared、server、client和electron四个子项目的配置方案。重点内容包括: 通过tsconfig.base.json实现基础配置共享 shared包采用零构建方案直接导出TS源文件 server包使用tsx实时转译的开发模式 client包采用Vite+Project References的三文件配置方案 关键配置项详解:target、mo

07
订阅2026-06-052 min read

AI Agent 时代的知识库应该长什么样

AI Agent时代知识库的六大核心能力 传统知识库依赖人工检索,而AI Agent需要具备自主记忆与知识调用能力。本文提出下一代知识库应具备的六大能力: 主动调用接口:通过MCP协议提供任务导向的语义搜索与结构化记忆工具; 自动写入与质量门控:LLM驱动的相关性、信息密度和重复性检测确保知识质量; 双向记忆循环:任务启动时自动关联历史知识,结束时沉淀新经验; 多源数据融合:整合不同AI工具产生的碎片化知识形成统一网络; 结构化知识图谱:建立笔记间的逻辑关系,支持深度推理; 离线可用性:本地化存储与计算保障

08
订阅2026-06-051 min read

从 RAG 到知识图谱:个人知识管理的演进

本文梳理了信息检索技术的四代演进:从关键词搜索(直接匹配但忽视同义和上下文)、全文搜索(引入分词和权重仍缺乏语义理解)、RAG与向量搜索(通过向量距离衡量语义相似性但无法表达结构化关系),到知识图谱(构建实体间关系网络实现关联推理)。作者提出混合架构解决方案——ChatCrystal结合向量搜索的语义召回、知识图谱的关系连接和LLM的推理能力,形成三层检索流程,并实现从被动搜索到AI主动记忆的转变。该架构通过自动化知识沉淀和智能关联,正在缩短信息与知识间的距离。

09
订阅2026-06-042 min read

本地优先 vs 云端:AI 工具的隐私之争

本文探讨了开发者在使用AI编程工具时面临的本地与云端方案选择问题。云端工具(如GitHub Copilot)提供开箱即用的强大模型能力和零运维成本,但存在数据隐私、合规风险及供应商锁定等问题。本地优先方案(如ChatCrystal)通过将数据保留在用户设备上,保障数据主权和低延迟,但受限于模型能力和硬件门槛。文章提出分层混合架构的折中方案:高频隐私敏感操作(如语义搜索)默认本地处理,复杂任务可选云端模型,同时保持核心数据本地存储。最终建议开发者根据自身场景(如行业合规要求、代码敏感度等)权衡选择,并始终明确

10
订阅2026-06-041 min read

AI 编程工具的数据格式为什么不能统一

不同AI编程工具(Claude Code、Codex CLI、Cursor、Trae、GitHub Copilot)采用差异化的数据存储格式(JSONL、事件流、SQLite等),根源在于各自的技术起点和设计优先级。ChatCrystal通过适配器模式(SourceAdapter接口)统一处理这些差异,将格式转换逻辑隔离在系统边界,实现多工具对话数据的标准化导入。该方案包含detect()检测数据源、scan()扫描元数据、parse()解析内容三个关键步骤,最终输出结构一致的ParsedConver

11
订阅2026-06-031 min read

MCP 协议到底解决了什么问题

MCP Server 通过});},return {},参数用 Zod schema 定义,MCP SDK 自动转换为 JSON Schema 发送给 Host。Host 的 LLM 看到工具描述和参数 schema,就能在对话中决定何时调用、传什么参数。MCP 是跨进程、跨应用的标准协议,而 Function Calling 是单次 API 调用内的工具定义。

12
订阅2026-06-031 min read

Vercel AI SDK 多 Provider 统一抽象

本文介绍了面向AI应用开发者的多模型服务商统一解决方案,重点分析了Vercel AI SDK和ChatCrystal的Provider工厂模式。文章首先指出开发者切换不同LLM/Embedding服务商时面临的接口不统一问题,随后展示了ChatCrystal支持的6种Provider类型及其特性。核心解决方案是通过Provider工厂模式(Map)实现模型创建的抽象化,并结合AI SDK的generateText、generateObject和embed等统一A

13
订阅2026-06-021 min read

vectra 本地向量搜索的实现原理

Vectra是一个轻量级本地向量数据库,采用纯TypeScript实现,无需外部依赖。它通过单文件JSON存储所有向量和元数据,支持内存内线性扫描和余弦相似度计算,提供事务式写入保障数据一致性。Vectra适合小规模应用场景,具有部署简单、透明可调试的特点,但存在全量加载、无近似检索等局限。在ChatCrystal中,Vectra与SQLite协同完成从向量搜索到结果展示的完整流程,满足个人知识库管理需求,但在大规模场景下可能需要迁移到专业解决方案。

14
订阅2026-06-021 min read

sql.js WASM 深度解析

本文介绍了如何在Node.js/Electron应用中使用纯WASM版本的SQLite(sql.js)替代原生编译方案。主要优点包括免编译安装、跨平台兼容性,虽然性能略低但足够应对单用户本地数据库场景。文章详细解析了sql.js的核心使用方案:内存模型(全量加载+手动持久化)、自动保存机制(定时30秒保存)、查询结果标准化转换、嵌套事务实现(通过SAVEPOINT),以及无ORM的Schema迁移策略。特别说明了处理外键约束重置的陷阱和开发/生产环境下的WASM文件定位方案,为开发者提供了完整的WASM S

15
订阅2026-06-011 min read

React Query + REST API 最佳实践

本文介绍了如何利用React Query构建React应用的REST API数据层。主要内容包括: React Query解决了传统useState+useEffect方案存在的缓存缺失、状态同步困难和竞态风险等问题 详细说明了QueryClient的配置参数(staleTime、retry等)及其最佳实践 设计了统一的API请求层,包括错误处理和开发环境代理配置 通过自定义Hook封装查询逻辑,实现代码复用和集中管理 介绍了queryKey的设计原则和条件查询的使用 展示了useMutation的写操作实

16
订阅2026-06-012 min read

Fastify 加 Electron:把 Web 服务嵌进桌面应用

本文介绍了将Web服务嵌入Electron桌面应用的完整方案,包括以下关键技术点: 通过Function()构造器绕过CJS限制,实现主进程动态导入ESM模块 端口检测机制优先使用3721端口,失败时自动降级到随机端口 生产环境注入严格CSP安全头防止XSS攻击,开发环境保持宽松 生命周期管理实现: 分步骤启动流程(数据目录、环境变量、端口检测等) 窗口关闭隐藏到系统托盘 优雅关闭流程(服务器关闭→数据库保存→资源释放) 窗口状态持久化存储,并自动适配多显示器环境 该方案实现了Web服务在独立运行和嵌入El

17
订阅2026-05-311 min read

如何解析 5 种完全不同格式的 AI 对话

本文针对开发者解析5种AI对话格式的策略:1) Claude Code采用JSONL流式日志,需过滤噪音类型和清理XML标签;2) Codex CLI的事件流结构需处理多源数据去重;3) Cursor跨SQLite数据库查询,需关联workspace与global数据;4) Trae采用单key存储,需解析嵌套的agentTaskContent;5) Copilot的JSONL快照仅需读取首行完整会话。每种格式的数据组织方式和解析难点各异,开发者需针对性地设计处理逻辑。

18
订阅2026-05-311 min read

SourceAdapter 插件架构详解

本文介绍了ChatCrystal插件式数据源架构的设计细节,核心是通过SourceAdapter接口统一不同AI编程工具的对话数据格式处理。该接口定义三个方法契约:detect()用于轻量级探测数据源,scan()扫描对话文件元数据,parse()解析为统一格式。采用注册表模式管理适配器,通过Map实现"导入即注册"机制。导入服务通过编排适配器完成去重、解析和原子化入库,最终输出标准化的对话数据结构。文章还对比了五种适配器的实现差异,并说明扩展新数据源只需实现接口并注册即可。该设计有效解决了多源数据格式差异

19
订阅2026-05-301 min read

语义搜索 + 知识图谱:发现代码重构的隐藏依赖

本文介绍如何利用ChatCrystal的语义搜索和知识图谱功能发现代码重构中的隐藏依赖关系。通过语义搜索可找到直接相关的技术笔记,再通过知识图谱扩展搜索范围,沿8种预定义关系类型(如DEPENDS_ON、LEADS_TO等)发现间接关联的模块。文章提供了具体操作步骤,包括直接搜索、关系扩展、图谱可视化等方法,并解释了不同关系类型在重构场景中的含义。这种组合方法能有效识别传统代码搜索工具无法发现的逻辑依赖,帮助开发者在重构前全面评估影响范围,避免遗漏关键关联模块。

20
订阅2026-05-301 min read

多格式文件解析:JSONL / SQLite / Event Stream

本文介绍了处理多种AI工具对话记录的统一解析方案。针对JSONL、SQLite和事件流三种存储格式,提出SourceAdapter统一接口,分离检测、扫描和解析三层逻辑。JSONL采用流式读取优化内存,过滤Claude Code的流式增量噪音;SQLite通过WASM内存副本绕过文件锁;事件流则需重建完整对话。设计上强调格式无关性,通过适配器模式统一不同工具的解析差异,避免代码重复。

21
工具2026-03-143 min read

用 1300 行原生 JS 做了一个 Chrome DevTools 扩展

让前后端不再为接口报错截图扯皮——一个实用的 DevTools 面板扩展的设计与实现过程。

22
工具2026-03-112 min read

PPT Timer:一个置顶于PPT全屏放映之上的LCD倒计时器

如何用 Electron 实现一个始终置顶于 PPT 放映之上的透明计时器,解决演讲超时问题。

23
前端2026-03-102 min read

用 AudioContext.suspend()/resume() 作为流式音视频的同步门控

深入 Web Audio API,探讨如何用 AudioContext 的暂停/恢复机制实现流式音视频的精确同步。

24
前端2026-03-053 min read

React 事件订阅的稳定引用问题:从 useEffect 到 useEffectEvent

分析 React 中事件订阅的闭包陷阱,以及 useEffectEvent 如何优雅地解决稳定引用问题。

25
开源2026-03-022 min read

Git 仓库批量迁移:从 Gitee/GitLab 到 GitHub 的自动化方案

一键批量迁移数十个仓库,保留完整 commit 历史,支持双向迁移。

26
思考2026-02-203 min read

前端工程师的 AI 产品思维:从 Prompt Engineering 到产品设计

作为前端工程师,如何将 AI 能力融入产品设计,从提示词工程到用户体验的完整思考。