news 2026/9/7 13:20:44

开源VibeCoding平台EasyMint:部署实战、功能验证与API调用指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
开源VibeCoding平台EasyMint:部署实战、功能验证与API调用指南

这次我们来看一个开源 VibeCoding 平台:EasyMint。如果你最近在关注 AI 编程,大概率听过 Vibe Coding 这个词——开发者用自然语言描述需求,AI 负责生成、修改、重构代码,人负责审查和最终决策。EasyMint 的定位,就是把这条链路工程化:对话会话、代码文件操作、模型切换、任务执行,都放进一个可部署、可二次开发的开源平台里。对于经常在“AI 聊天窗口复制代码”和“手动粘回项目”之间来回切换的人来说,这类项目最大的价值不是“能写代码”,而是把整个工作流接起来。

先说结论:EasyMint 值得关注,但当前公开资料里关于版本号、显存占用、默认端口和官方仓库地址的信息并不完整,所以这篇文章不会编造具体参数。更稳妥的写法是:把它当作一个开源 VibeCoding 平台的技术评估清单。文章会按照“先看能不能用,再决定怎么用”的顺序,拆解这类平台的核心能力、部署路径、功能验证、API 调用和批量任务设计。如果你正在做技术选型,或者准备把 AI 辅助编码接入自己的工程流,可以直接照着本文的流程走一遍。

这篇文章适合三类读者:想搭个人 AI 编码助手的开发者、需要在团队里落地 AI 辅助开发的工程负责人、对开源 Agent 平台做二次开发的技术爱好者。下面直接进入主题。

1. EasyMint 核心能力速览

由于 EasyMint 的完整文档尚未在公开渠道统一汇总,下面的速览表采用“通用 VibeCoding 平台能力 + 实测验证项”的方式列出。真正的落地参数,要以你拉取到的项目 README 和实际运行环境为准。

能力项说明
项目类型开源 VibeCoding 平台
核心理念用自然语言描述功能需求,AI 生成、修改、审查代码,人工负责集成和上线
主要功能对话式编码、多模型接入、代码文件读写、批量任务、API 服务等,具体以仓库说明为准
推荐硬件轻量模型可纯 CPU 运行;本地加载大模型建议独立显卡,具体显存需求需按模型版本测试
显存占用不确定,需按模型、上下文长度和并发数实测
支持平台Linux、macOS、Windows 均可用通用部署流程参考,服务器部署优先 Linux
启动方式源码启动 / Docker Compose / 一键脚本,不同分支差异较大,以下给出通用模板
是否支持 API开源 VibeCoding 平台一般会提供 HTTP API,具体端点需查看项目文档
是否支持批量任务取决于任务队列实现,可以在部署后直接验证
适合场景个人 AI 编程助手、团队内部工具、Agent 二次开发、Code Review 辅助

从这张表也能看出一个关键点:EasyMint 这类项目的核心能力不是某一个模型,而是“把模型接进工程流程”的壳。壳做得好不好,直接影响你愿不愿意每天都用它。

2. VibeCoding 不是玄学,是交互方式变了

在聊 EasyMint 之前,需要先对齐一个概念:Vibe Coding 到底是什么。

传统开发是“人写代码,机器执行”。Vibe Coding 改变了交互层——开发者用自然语言描述意图,AI 生成初版代码,再由人工 review、测试和修改。这里的“意图”可以很粗,比如“写一个解析 CSV 的工具类”,也可以很细,比如“把这段代码改成异步并发”。它不要求每次生成都完美,而是要求平台能承接多轮迭代:第一轮生成,第二轮纠错,第三轮优化,第四轮补测试。

EasyMint 这类开源平台要解决的,就是让这个过程不散落在聊天窗口和编辑器之间。它通常需要把以下能力串起来:

  • 会话上下文管理:AI 要记得前面说过什么,模型才能给出连续修改建议。
  • 代码文件读写:AI 生成的不只是“回答”,而是能直接落到项目文件里的真实改动。
  • 模型路由切换:同一个任务可以切换不同模型,对比效果和成本。
  • 任务状态持久化:长时间运行的任务不会因为页面刷新而丢失。

换句话说,如果你只想要“一个能聊天的代码生成器”,直接用在线工具就够了。你需要 EasyMint,说明你希望有一套自己的、可控的、能接 API 的工作流。这也是开源项目的核心吸引力:数据不出内网、逻辑可改、能力可扩展。

3. 适用场景与使用边界

3.1 适合谁用

EasyMint 比较适合以下场景:

  • 原型快速验证。需求还没定型,先用自然语言生成一版功能代码,人工确认后再继续。
  • 脚手架生成。生成项目结构、配置文件、测试样例、数据库模型定义。
  • 代码重构辅助。把一段长函数拆成多个方法,或者把同步接口改成异步。
  • 团队内部 AI 工具。多个开发者共享一个平台,通过 API 接入自己的编辑器或命令行工具。
  • Agent 二次开发。基于平台的任务队列和模型路由,做更复杂的自动化。

3.2 不适合什么场景

它不适合拿来直接做“无人值守生产系统”。AI 生成的代码可能包含逻辑漏洞、依赖缺失、安全风险,如果跳过 review 直接上线,问题会非常隐蔽。对性能有极致要求的底层模块,也别指望 AI 一次生成到位,成本和时间往往比人工写还高。

3.3 合规与安全边界

这个部分必须单独强调。EasyMint 这类平台如果接入了云端模型 API,你的代码、注释、业务逻辑都会被发送到模型服务方。内部项目、客户数据、涉密代码,一定要先做脱敏,或者直接切换到本地模型。涉及人脸、声音、版权素材等敏感能力时,必须确认授权链路合规。开源项目本身有许可证约束,二次开发和商用前要检查开源协议、模型权重协议和训练数据的出处,避免把限制性数据带进产品线。

4. 本地部署环境准备

EasyMint 的部署方式没有统一版本,但我们可以按照大多数开源 VibeCoding 平台的通用结构来准备环境。下面这份清单适合在拿到代码后逐项核对。

4.1 操作系统

服务器部署优先选择 Ubuntu 22.04 或 24.04。本地开发可以选择 Windows 11、macOS 或任意 Linux 发行版。Windows 上跑服务时注意路径分隔符和 shell 命令差异,很多启动脚本默认按 Linux 编写,遇到bash命令需要借助 Git Bash 或 WSL。

4.2 运行时与包管理

从常见技术栈看,VibeCoding 平台的前端多使用 Node.js,后端多使用 Python 或 Node.js。建议至少准备:

# Python 环境 python3 --version pip --version # Node 环境 node -v npm -v

如果项目使用 Python,建议创建独立虚拟环境;如果使用 Node,建议用 pnpm 管理依赖,安装速度更快。

4.3 数据库与缓存

会话记录、任务状态、API Key 配置一般需要持久化。轻量项目常用 SQLite,团队部署可能用 PostgreSQL 或 MySQL。如果平台设计中有任务队列,大概率还依赖 Redis。这些服务在docker-compose.yml里通常会有单独容器,不用提前安装到宿主机。

4.4 GPU 与驱动

如果只是调用远程模型 API,不需要 GPU,普通 CPU 服务器就够了。如果要加载本地模型,最好准备一张显存足够大的显卡。显存需求取决于模型参数量、量化精度和上下文长度,比如 7B 量化模型可能只需要 6GB 到 8GB,14B 或更高参数模型通常需要更多显存。这里的数字只是参考,必须在部署后看nvidia-smi实测。

4.5 磁盘与端口

代码工程本身可能只有几百 MB,但模型缓存、日志和 Docker 镜像会占用额外空间,部署前至少预留 10GB 以上。默认端口需要占用一个,常见有 3000、8000、7860。检查端口是否冲突:

# Linux / macOS lsof -i :8000 # Windows PowerShell netstat -ano | findstr :8000

如果端口被占用,可以换一个高位端口,但要同步修改前端访问地址和 API 基础地址。

5. 安装部署与启动方式

EasyMint 的具体启动命令还没有统一收录到公开材料,但你可以按照下面的通用流程反向验证。整个流程主要用于判断:这个项目是不是能拉下来、能不能跑起来、卡点在哪里。

5.1 获取源码

先从官方仓库克隆代码。仓库地址以 EasyMint 官方发布为准,下面是通用写法:

git clone <easy-mint-repo-url> cd easy-mint

如果项目有子模块,比如依赖某个前端构建仓库,还要拉取子模块:

git submodule update --init --recursive

5.2 安装依赖

后端如果是 Python:

python -m venv .venv source .venv/bin/activate pip install -r requirements.txt

前端如果是 Node:

npm install # 或者 pnpm install

如果项目同时包含前后端,根目录通常有Makefilepackage.json,先看 README 推荐的命令。

5.3 配置环境变量

开源平台一般会提供.env.example模板:

cp .env.example .env

编辑.env,重点确认以下几项:

# 模型 API 配置,按实际服务商填写 LLM_API_KEY=sk-xxxx LLM_BASE_URL=https://api.example.com LLM_MODEL_NAME=gpt-4o-mini # 本地模型服务,如果使用 Ollama 或 vLLM LOCAL_MODEL_BASE_URL=http://localhost:11434 # 服务监听地址 HOST=127.0.0.1 PORT=8000

注意,不要用示例里的变量名直接硬套,实际项目可能叫OPENAI_API_KEYDASHSCOPE_API_KEY。以 README 为准。

5.4 启动服务

先启动后端,再启动前端,或者使用一键启动脚本:

# 伪命令模板,实际启动脚本按仓库名称调整 python app.py --host 127.0.0.1 --port 8000

如果项目自带 Docker Compose:

docker compose up -d

启动后打开浏览器访问http://127.0.0.1:8000。如果页面正常加载,说明基础服务已经跑通。

5.5 接入模型

EasyMint 的核心是模型接入。无论平台 UI 怎么设计,你都需要配置至少一个可用的模型服务。在线 API 和本地模型二选一即可。

本地模型推荐先用 Ollama 跑通链路。这种方式不依赖外网 API Key,显存压力可控,而且配置过程能帮你把平台的能力边界摸清楚:

ollama pull qwen2.5:7b ollama serve

然后在平台后台把 LLM Base URL 指向http://localhost:11434,模型名填qwen2.5:7b。如果平台支持自定义 OpenAI 兼容端点,这一步会比较顺利。如果文档里没有这个选项,就要确认平台是否内置特定 SDK,再决定是否需要改代码。

6. 功能测试与效果验证

部署完成之后,不要急着接业务,先做一轮功能验证。下面这些测试用例是我建议的“最小验证集”,覆盖了 VibeCoding 平台最核心的几条链路。

6.1 测试 1:对话式编码

测试目的:确认平台能接收自然语言指令,并返回可用的代码内容。

输入示例:

请用 Python 写一个函数,接收 CSV 文件路径,返回按列名读取的数据列表。

操作步骤:

  1. 在平台对话界面新建会话。
  2. 输入上述提示词。
  3. 点击发送,观察响应。
  4. 把生成的代码复制到本地文件,实际运行一次。

预期结果:AI 返回一段结构清晰的 Python 代码,包含csv模块导入、函数定义和异常处理。如果代码能直接运行,说明基本链路正常。

判断成功的标准:生成代码不是空模板,函数逻辑能处理简单 CSV 文件。如果平台只是返回纯文本,不能操作文件,也属于“可以对话,但不能文件级编码”,后续要重点验证文件操作能力。

6.2 测试 2:多轮修改

测试目的:确认平台是否具备上下文记忆,能否在上一轮代码基础上继续修改。

输入示例(接上一条):

把函数改成异步,并添加类型注解。

操作步骤:

  1. 在同一会话中继续提问。
  2. 观察 AI 输出是否基于上一轮生成的函数,而不是重新造一个。
  3. 检查代码差异是否只集中在你要求的部分。

预期结果:AI 保留原函数签名,增加async def-> list[dict]等类型注解,不引入无关改动。

常见失败原因:上下文窗口过短、平台没有把历史消息传给模型、会话切换导致状态丢失。如果出现这种情况,需要检查服务端是否启用了持久化存储。

6.3 测试 3:代码文件操作

测试目的:VibeCoding 平台的关键能力,是能不能直接读取和修改项目文件,而不是只生成回答。

输入示例:

在 ./src/utils.py 中添加一个 calculate_average 函数,并在文件末尾注释写明用法。

操作步骤:

  1. 在平台中指定项目目录,或者通过对话引用文件路径。
  2. 提交指令。
  3. 到文件系统里查看src/utils.py是否被修改。

预期结果:目标文件出现新函数,注释格式与原文件保持一致。

判断成功的标准:文件内容真实发生变化,且 AI 没有破坏原有代码。如果平台无法访问文件系统,说明它是一个“纯对话式”工具,适合生成代码片段,不适合直接管理项目文件。

6.4 测试 4:多模型切换

测试目的:确认平台对多家模型可选,并能对比效果和速度。

操作步骤:

  1. 在配置中添加至少两个模型,比如一个在线 API 模型和一个本地 Ollama 模型。
  2. 同一个问题分别切换模型生成。
  3. 记录响应时间、输出质量和上下文记忆情况。

预期结果:不同模型给出的代码风格和准确度不同,但平台都能正常调用。如果你发现某个模型频繁超时,可能是网络延迟或服务端并发设置过低。

6.5 测试 5:批量任务

测试目的:验证平台能否处理多个编码任务,而不是每次只能手动操作一条。

输入示例,可以准备一个任务清单:

{ "tasks": [ { "name": "generate-date-util", "prompt": "写一个日期格式化工具函数,支持 yyyy-MM-dd" }, { "name": "generate-test", "prompt": "为日期格式化工具函数写单元测试" } ] }

操作步骤:

  1. 将任务清单导入平台批量任务界面,或通过 API 提交。
  2. 观察任务队列是否顺序执行。
  3. 检查每个任务的结果文件和日志。

预期结果:多个任务按队列顺序执行,失败任务有明确错误信息,不会阻塞后续任务。

如果平台没有批量任务界面,可以在下一节的 API 调用基础上自己写一个循环调度器。这也是很多团队选择 EasyMint 的原因——批量能力可以自己补。

7. 接口 API 调用示例

VibeCoding 平台如果要做工程集成,API 是必考题。下面给出两种通用调用方式。注意:下面代码中的地址、请求路径、参数字段都是模板,务必替换为你部署后实际抓到的请求结构。

7.1 curl 调用

假设平台提供一个生成代码的接口:

curl -X POST http://127.0.0.1:8000/api/generate \ -H "Content-Type: application/json" \ -d '{ "prompt": "写一个二分查找函数" }'

如果接口需要鉴权,加上请求头:

curl -X POST http://127.0.0.1:8000/api/generate \ -H "Content-Type: application/json" \ -H "Authorization: Bearer <your-token>" \ -d '{ "prompt": "写一个二分查找函数" }'

7.2 Python 调用

import requests url = "http://127.0.0.1:8000/api/generate" headers = { "Content-Type": "application/json", "Authorization": "Bearer <your-token>" } payload = { "prompt": "写一个二分查找函数", "max_tokens": 1024 } response = requests.post(url, json=payload, headers=headers, timeout=120) result = response.json() print(result)

如果返回结果包含代码文本,直接抽取对应字段写入本地文件。批量任务场景可以做成循环:

import requests import time import json api_url = "http://127.0.0.1:8000/api/generate" headers = { "Content-Type": "application/json", "Authorization": "Bearer <your-token>" } tasks = [ {"name": "task-1", "prompt": "写一个函数解析 JSON 文件"}, {"name": "task-2", "prompt": "写一个函数统计目录下所有 Python 文件行数"} ] for task in tasks: try: resp = requests.post(api_url, json={"prompt": task["prompt"]}, headers=headers, timeout=120) data = resp.json() output_file = f"./outputs/{task['name']}.py" with open(output_file, "w", encoding="utf-8") as f: f.write(data.get("text", "")) print(f"{task['name']} 完成") except Exception as e: print(f"{task['name']} 失败: {e}")

这个循环可以继续扩展:加入重试机制、并发控制、结果哈希对比、失败任务自动记录日志。

7.3 批量任务队列设计

如果平台自带任务队列,直接把任务清单丢进去即可。如果没有,可以用最简单的目录扫描方式:

inputs/ # 存放任务描述文件,每个文件一个任务 task1.json task2.json outputs/ # 存放生成结果 task1.py task2.py logs/ # 存放运行日志 task1.log task2.log

批量任务最容易出现的问题不是“任务跑不动”,而是“失败后不知道卡在哪”。所以每个任务都要记录状态,包括 pending、running、success、failed、timeout。批量跑完之后,优先检查 failed 数量。

8. 资源占用与性能观察

开源 VibeCoding 平台的资源占用,主要取决于模型策略。调用云端 API 时,本地资源消耗很低,重点观察网络延迟和 API 并发限制。加载本地模型时,资源占用会明显上升。

8.1 显存观察

Linux 下用nvidia-smi实时看:

watch -n 1 nvidia-smi

重点看每一个进程的显存占用。如果推理时显存接近上限,考虑降低上下文长度、减小批量数或切换更小的量化版本。Windows 下可以用任务管理器或者nvidia-smi命令。

8.2 CPU 与内存观察

top -c

在 top 输出中按M可按内存排序,能快速定位内存占用较高的进程。如果 CPU 持续 100% 且响应变慢,大概率是模型推理没有走 GPU,而是回退到了 CPU。

8.3 影响性能的因素

  • 模型参数量。参数量越大,生成速度越慢,显存占用越高。
  • 上下文长度。历史消息越多,首 token 延迟越大。
  • 并发请求数。同一时间多个任务同时推理时,模型服务会成为瓶颈。
  • 磁盘读写。代码文件操作频繁时,磁盘慢也会拖慢整体体验。

8.4 降低资源占用的方法

  • 优先使用量化模型,比如 Q4、Q8 版本。
  • 设置单次对话的最大上下文长度。
  • 批量任务增加并发限制,避免瞬时打爆显存或 API 额度。
  • 对不常用的模型使用“按需加载”,而不是启动时全部加载到显存。

这些优化点不是 EasyMint 特有,所有大模型应用都适用。部署完先用小任务压测,再逐步加并发。

9. 常见问题与排查方法

下面是 VibeCoding 平台部署和使用中最常见的几类问题。很多不是 EasyMint 本身的问题,而是模型接入和环境配置引发的连锁反应。

问题现象可能原因排查方式解决方案
依赖安装失败Python 或 Node 版本不兼容查看错误日志中的版本要求切换指定版本,重新安装依赖
启动后页面打不开端口被占用或服务未启动检查日志和端口监听状态更换端口或重启服务
页面能打开,但发送消息没反应模型 API Key 未配置或配置错误查看后端日志,检查.env文件填写正确的 Key 和 Base URL
请求第三方模型 API 超时网络不稳定或并发超限用 curl 直接测试模型接口降低并发,增加超时时间
本地模型推理速度极慢模型没有走 GPUnvidia-smi查看显存占用安装 CUDA 版依赖,确认驱动版本
批量任务部分失败单个任务 prompt 格式错误查看对应任务日志校验输入 JSON,增加失败重试
生成代码质量不稳定模型太弱或上下文被截断切换更强模型,短化历史消息按任务类型配置不同模型
代码文件操作不生效平台没有目录写权限检查运行用户和目录权限给工作目录授权,或改用容器挂载目录

排查时有一个通用原则:先看日志,再查配置,最后猜代码。很多问题会同时出现在前端、后端、模型服务三层,你需要逐层定位。比如页面报 500,先看后端接口日志;接口日志正常,再看模型服务是否返回异常。

10. 最佳实践与使用建议

把 EasyMint 这类开源 VibeCoding 平台落地到团队中,有几点建议是从实际工程经验里总结出来的。

第一,第一次部署先小参数测试。不要一上来就接业务代码,先用一个临时目录跑通生成、修改、批量三个动作,确认平台能稳定运行。

第二,保留一套最小可运行配置。把.env模板、启动命令、依赖版本写进 README,方便换机器时快速恢复。很多开源项目默认配置文件不完整,自己维护一份能少踩很多坑。

第三,模型文件、输入素材、输出结果分目录管理。不要一股脑堆在项目根目录,建议按下面的结构组织:

models/ # 本地模型文件或模型缓存 inputs/ # 批量任务输入 outputs/ # 生成结果 logs/ # 运行日志 configs/ # 环境配置和模型配置

第四,批量任务必须有日志和失败重试。一次任务队列跑 50 条,如果中间断了没有日志,排查成本极高。至少记录任务 ID、开始时间、结束时间、状态、错误信息。

第五,接口服务要限制访问范围。不要让平台服务默认监听0.0.0.0并暴露到公网。如果必须远程访问,加上 API Token 或者网络白名单。

第六,遵守数据合规要求。内部代码不要直接送进第三方模型 API,必要时先脱敏或切换到本地模型。AI 生成的代码必须经过 review 和测试才能进入生产分支。涉及版权、开源许可证和肖像授权的内容,千万不能想当然。

第七,不要在公开场合拆解别人的代码和目录结构用于非法用途。开源项目的使用边界始终是“合法授权 + 测试环境验证 + 人工复核”。

11. 总结与下一步

EasyMint 这个开源 VibeCoding 平台最值得尝试的点,是把“AI 聊天生成代码”升级为“可持续维护的工程工作流”。你不需要像以前那样在聊天窗口和文件编辑器之间来回切换,而是可以在一个平台上完成对话、文件操作、批量任务和 API 集成。

最先应该验证的功能有三个:对话式编码是否稳定、代码文件操作是否真实生效、API 和批量任务能不能跑通。这三个点决定了它能不能被接入到你自己的工具链里。最容易踩的坑是模型配置不完整、端口冲突、上下文长度控制不好,以及本地模型没有走 GPU 导致的响应缓慢。

后续可以继续扩展的方向包括:把平台接入 CI/CD 流水线,让 AI 在代码提交前自动生成测试用例;接入内部知识库,让模型在生成代码时参考团队规范;或者基于它的任务队列写一个更复杂的 Agent,自动完成需求拆解、代码生成、单测执行和结果汇总。

如果你也准备部署这个项目,建议先按文章里的最小验证集跑通一遍,再决定要不要接入真实业务。部署过程中遇到问题,优先看日志,然后逐项排查模型配置、端口、显存和权限。这套流程不仅适用于 EasyMint,对大多数开源 VibeCoding 平台同样有效。建议收藏备用,动手部署时照着做会省不少时间。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/7 13:19:54

SPH流体模拟入门:粒子水花效果原理与实现

简介&#xff1a;这份基于 Visual Studio 2010 与 OpenSceneGraph 3.4.1 的 SPH&#xff08;平滑粒子流体动力学&#xff09;流体仿真项目&#xff0c;面向图形学、物理模拟方向的开发者和学生&#xff0c;用于学习无网格流体的数值计算与三维可视化。它通过将流体离散为有质量…

作者头像 李华
网站建设 2026/9/7 13:19:08

物流数据降维实战:主成分分析(PCA)原理与Python实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/7 13:18:49

STM32C5驱动LSM6D3TR-C:陀螺仪轮询读取与校准实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/7 13:18:19

Hy4 770B MoE 开源部署实战:从架构原理到 WorkBuddy 工作流落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/7 13:18:11

嵌入式固件进阶:启动流程、故障定位与OTA升级全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华