< BACK_TO_ROOT// REPORT// 2025-12-08

优化了网站的一些功能

Cover

对的,我又熬了一晚,这次对网站一些内容做了优化

一、移动端

之前导航栏会黏在一起,还有按钮被标题覆盖的问题解决了


二、后台

由于网站是没有数据库的,是直接读取仓库下的内容,每次在后台提交新内容就会触发重新部署,等个30秒左右,太浪费时间了,就想着能不能暂存起来,然后再一并提交上传,然后花了点时间优化了这个玩意!

1、拦截 (Interception)

整个流程完全在你的浏览器(客户端)和服务器(Next.js API)之间流转:

当你在编辑器点击 + ADD TO BUFFER 或者在列表点击 [DEL_STAGE] 时:

程序阻止了表单的默认提交行为(不再直接发请求给服务器)。

程序把你的操作意图打包成一个 JSON 对象(Action Object)。

比如:{ type: "DELETE", file: "post-1.md" }

2、通信与存储 (Event & Storage)

因为“编辑器组件”和“底部的暂存条组件”在代码里隔得很远,它们怎么由通信?

自定义事件 (Custom Event):编辑器发出一个名为 add-to-staging 的广播信号。

监听器:底部的 StagingManager 组件一直在监听这个信号。一旦听到,就把数据抓过来。

去重逻辑:StagingManager 会检查:“这个文件之前操作过吗?”

如果之前是“修改A”,现在是“修改B”,它会把A删掉,只保留B(只保留最后一次状态)。

如果之前是“修改”,现在是“删除”,它会直接变成“删除”。

持久化:将整理好的数组存入浏览器的 localStorage。

作用:即使你不小心刷新了页面,或者关掉了浏览器再打开,暂存区的数据依然还在,不会丢失。

3、批量提交 (Batch Execution)

当你点击底部的 PUSH TO CLOUD 按钮时:

前端把 localStorage 里存的那一堆操作数组(比如里面有3个修改,2个删除),一次性打包发给服务器。

Server Action (batch.ts) 接收到这个大数组。

服务器开始 for 循环,依次执行每一个操作(调用 GitHub API)。

所有操作执行完毕后,通知 Vercel:“数据变了,请重新构建网站”。

三、代码层面

1、在 src/components/AdminPostForm.tsx 中:

const event = new CustomEvent("add-to-staging", { detail: newItem });
window.dispatchEvent(event);

编辑器不需要知道暂存条存不存在,它只管广播“我要存东西”。底部暂存条也不需要知道是谁发的,它只管接收。这让代码结构很清晰。

2、在 src/components/StagingManager.tsx 中:

localStorage.setItem("nebula_staging_buffer", JSON.stringify(next));

这是为了防丢。React 的 state (useState) 在刷新页面后会清空。如果不用 LocalStorage,你辛辛苦苦暂存了10篇文章,手抖刷新一下就全没了。

3、在 src/app/actions/batch.ts 中:

for (const op of operations) {
  switch (op.type) {
    case "DELETE_POST": await deleteGithubFile(...); break;
    case "SAVE_POST": await saveGithubFile(...); break;
    // ...
  }
}

服务器其实比较“笨”,它只是机械地把发过来的清单执行一遍。真正的智能逻辑(去重、覆盖、撤销)都在前端做完了。

具体图片:

LOG_END_OF_FILE
OPERATOR_SIGNATURE_VERIFIED

// COMMS_CHANNEL