为了拯救我的腰椎和颈椎,我做了款浏览器插件!

写在前面

你的腰部和颈椎还好吗?

我现在基本上每天对着屏幕的时间在 8 小时以上,脖子酸、腰疼已经是家常便饭X﹏X

某天早上起来,脖子突然不能动了,一动就疼,去医院拍了片......

医生看一眼就问:咱俩是同行吧?

我:我是做计算机的。

医生:这就对了,都是长时间坐的工作,可不就是同行?

诊断结果说这是典型久坐导致的颈椎曲度变直和腰肌劳损!建议每隔一段时间站起来活动活动 。其实道理都懂,难的是做到。不是不想站起来,是真的每次都忘。一忙起来,等回过神两三个小时已经过去了.....

真的需要一个工具来提醒做这件"想做但总是忘记"的事

那到底用什么来提醒?想过手机闹钟、智能手表,但都有弊端,手机静音放桌上根本听不见,手表也不经常戴。

后来某天加班,盯着屏幕发呆的时候突然灵光一现:每天跟电脑待在一起的时间比谁都长,上班第一件事开电脑、下班最后一件事合电脑,这玩意儿不就是一直在陪着我的那个家伙嘛?与其再找个新工具来提醒我,不如直接让电脑自己来干这件事。

为什么是浏览器插件?

  • 不是人人都有智能手表,工作时也未必戴
  • 公司电脑装软件有些要审批,麻烦
  • 浏览器经常用,插件加载即用
  • 门槛最低、最快能跑起来

只要工作时开着浏览器,它就能默默守护我的腰椎和颈椎。

反复讨论产品需求

说实话,这个插件不是一上来就长这样的。

我跟好几个同样久坐的朋友聊需求,把他们的真实办公习惯都了解一下,然后讨论用户习惯,产品形态,交互模式,反复改了好多版,才慢慢有了现在的形态。

最后聊下来才发现,"提醒"这件事根本不是定个时那么简单------锁屏、开会、赶 deadline、休息.....每种场景背后都是不同的需求。"忙时免打扰""锁屏即休息""超时连续计时"这几个核心功能,都是慢慢加上去的。


它和普通计时器有什么不同?

一句话:它知道你有没有真的离开过座位。

想想你的工作习惯------上厕所会锁屏 、接水会锁屏 、吃饭会锁屏 。即使忘了锁屏 ,离开后电脑也会自然进入空闲 。扩展就是抓住这两个信号来判断你是否站起来了:

场景 普通计时器 久坐提醒
上厕所锁屏 1 分钟 ❌ 不感知,到点照弹 ✅ 锁屏即休息,计次 +1,倒计时归零
接水 20 秒回来 ❌ 到点照弹 ✅ 不够阈值,继续累计
去开会锁屏离开 ❌ 时间照跑 ✅ 空闲即休息,回来后从 0 重新开始
电脑放着没动 5 分钟 ❌ 时间照跑 ✅ 检测到空闲 → 视为已休息,计次 +1
正在赶 deadline ❌ 强制弹窗打断 ✅ "现在很忙"模式,不打扰但持续警示
电脑关机过夜 ❌ 第二天显示 1440 分钟 ✅ 自动修正,重新开始
修改工作间隔 ❌ 从头来过 ✅ 保留已累计时长,新间隔即时生效

简单说:电脑一进入空闲状态就视为你站起来了------锁屏、无操作超时都算。检测到空闲的那一刻,休息次数自动 +1,倒计时归零;直到你回来重新活跃,才开始新一轮计时。两个阈值都可以自己调整。


功能一览

📊 工具栏弹窗(Popup)

点开图标就能看到全貌:

  • 实时坐立计时 + 进度条
  • 距下次提醒的精确倒计时
  • 连续使用天数("告别久坐 · 第 X 天")
  • 分段文案:刚起步 → 专注中 → 准备活动 → 超时 → 严重超时
  • 今日统计卡片
  • 暂停 / 立即休息 / 重置 一键操作
  • 亮色 / 暗色主题切换
  • 菜单按钮

今日统计:四个核心数据一目了然

Popup 底部有四张统计卡片,实时反映你今天的久坐状态:

指标 含义 怎么来的
🕐 今日工作 当日累计在电脑前的时间 每个工作周期的坐立时长自动累加,空闲期间不计入
🔄 休息次数 今天站起来活动了几次 电脑进入空闲/锁屏自动 +1,或手动点"开始休息" +1
📏 最长久坐 今天最长一次连续坐了多久 每次进入空闲时,将本次坐立时长与历史最大值取 max
💯 健康评分 0-100 分的综合评估 基于休息次数和最长久坐实时计算(详见下文)

这四个数据互相关联:工作时长 决定你"应该站几次"的期望值,休息次数 看你做到了多少,最长久坐 反映你最差的一次表现,三者共同喂给健康评分算法产出最终分数。

关键实现细节------休息次数和最长久坐的更新时机:

js 复制代码
// chrome.idle.onStateChanged 监听到空闲/锁屏时
let currentSitDuration = runtimeState.accumulatedWork || 0
if (runtimeState.workStartTime) {
  currentSitDuration += Math.floor((Date.now() - runtimeState.workStartTime) / 1000)
}

// 更新今日最长坐立(取历史最大值)
const newMaxSitDuration = Math.max(runtimeState.todayMaxSitDuration || 0, currentSitDuration)
// 累加今日总工时
const newTodayWorkTotal = (runtimeState.todayWorkTotal || 0) + currentSitDuration
// 休息次数 +1
const newRestCount = runtimeState.todayRestCount + 1

await updateRuntimeState({
  accumulatedWork: 0, // 倒计时归零
  todayRestCount: newRestCount,
  todayWorkTotal: newTodayWorkTotal,
  todayMaxSitDuration: newMaxSitDuration,
})

所有数据存在 chrome.storage.local,每天零点自动清零,开始新一天的统计。

🧘 到点提醒:不是闹钟,是对话

到时间后同时弹出一个居中窗口和系统通知(可在设置里选只要哪一种)。

浏览器弹窗

系统提示

按钮 效果
🛋️ 开始休息 进入休息倒计时,关闭弹窗
⏰ 再等 10 分钟 延迟提醒,10 分钟后再弹(可调)
✅ 刚才休息过了 标记误提醒,重置计时
📌 现在很忙,继续工作 免打扰模式,不再弹但保留超时警示

重点 :正在赶 deadline 的时候,你不想被打断,但也不想假装健康问题不存在。点了"现在很忙"后:

  • 弹窗不再出现
  • 计时不中断,持续累计超时时长
  • 工具栏 badge 变红显示 !
  • 进度条变红 + 实时显示"已超时 X 分钟"
  • 直到你真正站起来(锁屏/空闲超过阈值)或主动休息才清除

这样你随时知道自己超时了多久,做完手头的事就能马上去活动。

🖥️ 说到这个全屏提醒弹窗------它的配色也调了挺久 🫥

提醒窗是深底配红色警告条、蓝色"开始休息"按钮,在原来的屏上深色背景看着发闷,换到 RD270Q 上才看清是屏幕色准的问题------它出厂校过色,还有编程模式(带个彩纸模式)和分区对比度,深色主题下颜色层次一下拉升了,调 CSS 不用再反复开 DevTools 吸色对照。面板带抗反射涂层这点也好用------白天工位旁有人开窗、晚上台灯打过来,深色弹窗不会糊成一片反光✌️✌️✌️。

📈 健康评分

每天自动计算一个 0-100 的健康评分,加权双维度模型,以当日实际工作时长为基准(下午才开始也公平):

  • 休息频率得分(满分 60)------ 休息越多分越高,正向激励权重更大
  • 久坐惩罚得分(满分 40)------ 超时越久扣分越多(线性比例:超时 1 分钟就能看到分数下降)

设计理念:鼓励多站 > 惩罚久坐。 多站一次就能看到分数明显上升,正向反馈感很强。

特殊处理:

  • 宽限期:第一个完整工作周期内(如 < 45 分钟),提醒还没触发过 → 直接 100 分,不提前焦虑
  • 今天刚开始:当日尚无工作数据 → 显示"🕐 今天刚开始",不误判为休息日
  • 休息日:历史记录中工作不足半个周期 → 标记为"😴 休息日",不参与评分

评分等级:🏆≥90 优秀 | 💚≥80 良好 | 💛≥60 一般 | 🟠≥40 较差 | 🔴<40 需改善

📊 健康日志

每天零点自动保存当日快照:

  • 近 7 天趋势折线图(站立次数 + 工作时长 + 健康评分三线并行)
  • 历史记录分页表格(休息日自动标记为"😴 休息日",不显示无意义的 0 分)
  • 每日评级 + 个性化改善建议

📦 数据导出 / 导入

换电脑不丢数据,一键备份全部健康记录:

导出内容 说明
健康日志 所有历史 dailyLog 数据(最多 90 天)
用户设置 工作间隔、休息时长、提醒方式、主题等全部配置
使用天数 「告别久坐 · 第 X 天」的起始时间戳

导入时的安全策略:

  • 日志数据:不覆盖本地已有记录(以本地为准)
  • 配置:覆盖写入(导入 = 恢复偏好)
  • 使用天数:取更早的日期(保护你的连续纪录)

导出为标准 JSON 文件,可读很强,随时备份随时恢复。

⚙️ 灵活配置

配置项 说明
工作间隔 1-120 分钟,默认 45
休息时长 1-30 分钟,默认 5
空闲阈值 1-20 分钟,默认 5
提醒方式 系统通知 / 全屏弹窗 / 两者都要
锁屏重置阈值 锁屏超过多少秒视为站立,默认 30 秒
主题 亮色 / 暗色
语言 中文 / English
延迟提醒 5-30 分钟可调,默认 10

🖥️ 题外话:盯了一天屏幕眼睛干涩?可能不只是久坐的问题ಠಿ_ಠ

我写这个插件的时候换了一块明基 RD270Q 编程屏,本来只是想要大一点的屏幕,结果发现长时间看代码居然不怎么累眼了(⊙o⊙)。特别是赶项目深夜连轴转的时候,切到夜间模式,配合自动智慧调光和低蓝光,眼睛不会像以前那样干涩发酸。

全景图

夜间模式

低蓝光


技术特点

完全基于原生技术,零构建、零依赖、零服务器

  • Chrome Manifest V3 --- 最新扩展架构
  • 空闲即休息 --- 检测到空闲立即计为一次休息,倒计时归零;活跃后才开始新周期
  • 多信号融合检测 --- 锁屏 + 空闲双通道判断,任一触发即视为站立
  • 精确一次性闹钟 --- 到点即弹,不靠轮询,短时间差用 setTimeout 补偿保证秒级精度
  • 平台适配 --- macOS系统通知兼容(自动跳过不支持的 buttons/priority/requireInteraction 字段)+ Dock 图标弹跳提示
  • 弹窗防重复 --- tick 与 alarm 竞态双重防护,不会出现两个提醒窗
  • 时间戳差值计时 --- 不怕 Service Worker 被挂起
  • 唤醒修正 --- 关机过夜不会显示"已坐 840 分钟"
  • 配置热更新 --- 修改工作间隔不中断当前计时,新时长即时生效
  • 健康评分 --- 60/40 加权模型 + 线性超时惩罚,超时即可感知,正向激励为主
  • 休息日智能识别 --- 区分"今天刚开始"与"确认休息日",零工时历史天数自动标记为休息日,不污染评分趋势
  • 超时连续计时 --- 提醒弹出后计时不中断,实时显示超时时长
  • 全量数据导出/导入 --- 日志 + 配置 + 使用天数一键备份,换设备无缝迁移
  • 完全离线 --- 所有数据只存本地,不联网

下面挑几个核心技术点展开讲讲。


核心 1:空闲即休息 ------ 不用你手动点"开始休息"

大多数久坐提醒工具只管计时和弹窗,不管你有没有真的站起来过。我的做法是监听系统空闲状态,一旦检测到你离开了,立即算作一次休息:

js 复制代码
// 监听系统空闲/锁屏事件
chrome.idle.onStateChanged.addListener(async (newState) => {
  const runtimeState = await getRuntimeState()
  if (runtimeState.state === STATE.PAUSED) return
  if (runtimeState.state === STATE.RESTING) return

  if (newState === 'active') {
    // 用户回来了:直接开始新的倒计时周期(休息已在进入 idle 时计过)
    if (runtimeState.state === STATE.IDLE) {
      await updateRuntimeState({
        state: STATE.WORKING,
        accumulatedWork: 0, // 从 0 开始新周期
        workStartTime: Date.now(),
        restCountedInCurrentCycle: false,
      })
      await scheduleReminderAlarm()
    }
  } else {
    // idle 或锁屏:视为休息,休息次数+1,倒计时归零
    if (runtimeState.state !== STATE.IDLE) {
      let currentSitDuration = runtimeState.accumulatedWork || 0
      // 把 workStartTime 至今未保存的时间也算进去
      if (runtimeState.state === STATE.WORKING && runtimeState.workStartTime) {
        currentSitDuration += Math.floor((Date.now() - runtimeState.workStartTime) / 1000)
      }

      const newRestCount = runtimeState.restCountedInCurrentCycle
        ? runtimeState.todayRestCount
        : runtimeState.todayRestCount + 1

      await updateRuntimeState({
        state: STATE.IDLE,
        accumulatedWork: 0, // 倒计时归零
        todayRestCount: newRestCount, // 休息次数 +1
        lastStandTime: Date.now(),
        restCountedInCurrentCycle: true,
      })
      await chrome.alarms.clear(ALARM_REMINDER_FIRE)
    }
  }
})

状态流转就是一句话:空闲 → 计休息 + 归零 → 活跃 → 重新开始计时。

上厕所锁屏、去接水、开会离开------只要电脑进入空闲,就自动算你站起来了。回来解锁后,从 0 开始新一轮倒计时。


核心 2:精确一次性闹钟 ------ 到点即弹,不靠轮询

MV3 的 Service Worker 随时可能被挂起,靠 setInterval 轮询根本不靠谱。我的做法是直接算出还差多少秒到点,创建一次性闹钟

js 复制代码
async function scheduleReminderAlarm() {
  await chrome.alarms.clear(ALARM_REMINDER_FIRE)
  const [runtimeState, config] = await Promise.all([getRuntimeState(), getConfig()])

  // 忙时免打扰模式:不再自动弹
  if (runtimeState.reminderDismissed) return
  // 仅在工作状态下排程(空闲状态已在休息,无需提醒)
  if (runtimeState.state !== STATE.WORKING) return

  const workDurationSeconds = config.workDuration * 60
  const accumulated = runtimeState.accumulatedWork || 0
  const elapsed = runtimeState.workStartTime ? Math.floor((Date.now() - runtimeState.workStartTime) / 1000) : 0

  const remainingSeconds = workDurationSeconds - accumulated - elapsed

  if (remainingSeconds <= 0) {
    await fireReminderNow(config) // 已到点:立即触发
    return
  }

  // chrome.alarms 最小延迟 30 秒,超过按计算延迟设置
  const delayInMinutes = Math.max(remainingSeconds / 60, 0.5)
  chrome.alarms.create(ALARM_REMINDER_FIRE, { delayInMinutes })

  // 剩余 < 30 秒时 alarm 会被 clamp,用 setTimeout 作为即时补偿
  if (remainingSeconds < 30) {
    setTimeout(() => fireReminderNow(), remainingSeconds * 1000)
  }
}

任何会改变剩余时长的操作(休息、暂停、恢复、配置修改)都会调用这个函数重新排程,确保到点精确触发。


核心 3:忙时免打扰 ------ "现在很忙,继续工作!"

赶 deadline 的时候不想被打断,但也不想假装健康问题不存在。点了"现在很忙"后,计时不中断,持续累计超时

js 复制代码
case 'DISMISS_REMINDER': {
  const dismissState = await getRuntimeState();

  // 计算真实坐立时长(含超时部分)
  let currentSitDuration = dismissState.accumulatedWork || 0;
  if (dismissState.state === STATE.WORKING && dismissState.workStartTime) {
    currentSitDuration += Math.floor((Date.now() - dismissState.workStartTime) / 1000);
  }

  await chrome.alarms.clear(ALARM_REMINDER_FIRE);
  await updateRuntimeState({
    reminderDismissed: true,
    accumulatedWork: currentSitDuration, // 不清零!保留真实累计时长
    workStartTime: Date.now(),
  });
  // 注意:不增加 todayRestCount,不更新 lastStandTime(用户没真正站起来)
}

dismissed 期间的表现:

  • 弹窗不再出现
  • 工具栏 badge 变红显示 !
  • 进度条变红 + 实时显示"已超时 X 分钟"
  • 直到你真正站起来(系统检测到空闲)或主动点击休息才清除

开发花絮:从"一个计时器"到 1100+ 行状态机

说实话一开始我以为就是这个计时器------setTimeout 45 分钟,弹个通知,完事。

然后我发现了一个又一个边界情况:

  • 锁屏了时间怎么算?
  • Service Worker 被挂起了 setInterval 还跑吗?
  • 关机过夜第二天显示"已坐 1440 分钟"怎么办?
  • 用户正忙的时候弹窗是不是很烦?
  • 修改设置后倒计时从头来过用户会不会骂人?

每解决一个问题就引入两个新问题,最后 service-worker.js 写到了 1100+ 行,本质上是一个完整的有限状态机WORKING → IDLE → WORKING(正常循环)、WORKING → RESTING → WORKING(主动休息)、WORKING → PAUSED → WORKING(暂停恢复)......每个状态转换都要处理计时、通知、图标、存储同步。

🖥️ 写到第 800 行的时候我开始怀疑人生,然后抬头看一眼代码------还好屏幕够大(●'◡'●)~

那段时间我也在折腾显示器。之前用笔记本屏写代码,看长文件来回滚、反复切换页面,赶上赶项目深夜连轴转,真是考验眼力。后来换了明基 RD270Q 编程显示器,长时间编码对眼睛和颈椎的考验才小了一些。

RD270Q 是 27 寸 2K 3:2 生产力方屏(实际可用分辨率很高),可以用自带的配套软件把编辑器分成左右两栏,一边写 service-worker.js 一边看 popup.js,终于不用来回 Cmd+Tab 切文件了。之前用笔记本屏幕写这种跨文件的状态同步逻辑,光切窗口就要切到头晕(◎﹏◎)..... 看长代码更爽^o^/!单手就可以操作旋转,直接竖过来,一屏能看上百行代码,再也不用疯狂滚鼠标滚轮了QAQ~

核心 4:健康评分算法 ------ 鼓励多站 > 惩罚久坐

健康评分基于当日实际工作时长计算(下午才开始也公平),采用 60/40 加权模型:

js 复制代码
function calcHealthScore(todayWorkTotalSeconds, restCount, maxSitDuration, workDurationMinutes) {
  const workDurationSeconds = (workDurationMinutes || 45) * 60

  // 宽限期:第一个完整工作周期内,提醒尚未触发,不做评判
  if (todayWorkTotalSeconds < workDurationSeconds) return 100

  // 维度1:休息频率得分(满分60)--- 当前周期免评,只对过去的周期要求休息
  const completedCycles = Math.floor(todayWorkTotalSeconds / workDurationSeconds)
  const expectedRests = Math.max(1, completedCycles - 1)
  const restRatio = Math.min(1, restCount / expectedRests)
  const restScore = restRatio * 60

  // 维度2:最长久坐惩罚(满分40)--- 超时越多扣分加速
  let sitScore = 40
  if (maxSitDuration > workDurationSeconds) {
    const overRatio = Math.min(1, (maxSitDuration - workDurationSeconds) / workDurationSeconds)
    // 线性惩罚:超时比例直接映射为扣分
    sitScore = 40 * (1 - overRatio)
  }

  return Math.min(100, Math.max(0, Math.round(restScore + sitScore)))
}

为什么用线性而不是非线性?

  • 超时 1 分钟 → 扣 ~1 分(立刻可感知,分数不再纹丝不动)
  • 超时 5 分钟 → 扣 ~5 分(该注意了)
  • 超时 10 分钟 → 扣 ~10 分(明显下降)
  • 超时一整个周期 → 扣 40 分(全扣光,严重超标)

正向激励的效果:多站一次就能看到分数明显上升,比"你又坐太久了"的负面提示更能改变行为。


核心 5:唤醒修正 ------ 关机过夜不误报

Service Worker 被挂起或电脑关机后,workStartTime 可能指向几小时前甚至昨天。不处理的话,第二天打开会显示"已连续坐了 840 分钟"。

js 复制代码
async function sanitizeStateOnWakeup(runtimeState, config) {
  const workDurationSeconds = (config.workDuration || 45) * 60
  const abnormalThresholdSeconds = workDurationSeconds * 2 // 超过 2 倍工作时长 = 异常

  const updates = {}

  // 距上次站立超过 2 倍工作时长 → 视为刚站立过(关机/午休了)
  if (runtimeState.lastStandTime) {
    const sinceLastStand = Math.floor((Date.now() - runtimeState.lastStandTime) / 1000)
    if (sinceLastStand >= abnormalThresholdSeconds) {
      updates.lastStandTime = Date.now()
    }
  }

  // workStartTime 超过 5 分钟前 → 重置(防止 tick 计算出异常大的 elapsed)
  if (runtimeState.workStartTime) {
    const sinceWorkStart = Math.floor((Date.now() - runtimeState.workStartTime) / 1000)
    if (sinceWorkStart > 300) {
      updates.workStartTime = Date.now()
    }
  }

  if (Object.keys(updates).length > 0) {
    await updateRuntimeState(updates)
  }
}

每次 Service Worker 激活、每次 tick 心跳都会调用这个函数,确保不管你是关机过夜还是午休回来,计时都是合理的。


核心 6:配置热更新 ------ 改了设置不丢进度

改了工作间隔(比如 45 分钟改成 40 分钟),已经坐了 20 分钟的进度不会丢掉:

js 复制代码
case 'UPDATE_CONFIG': {
  await chrome.storage.sync.set(payload);
  if (payload.workDuration !== undefined) {
    // 不重置 accumulatedWork,让正在走的倒计时继续
    await updateRuntimeState({ reminderDismissed: false });
    await initAlarms(); // 按新时长重排提醒闹钟
  }
}

已经坐了 20 分钟 + 新间隔 40 分钟 = 还剩 20 分钟就提醒。如果已坐的时间超过新间隔,闹钟会立即触发。


隐私说明

这个扩展不联网

  • ❌ 没有后端服务器
  • ❌ 没有数据上传
  • ❌ 没有第三方 SDK
  • ✅ 所有数据只存在本地

断网使用,效果一模一样。


写在最后

说实话,做这个插件的起因不是因为技术兴趣,而是因为我的身体已经亮起了红灯。

颈椎曲度变直、腰肌劳损...这些词以前觉得离自己很远,直到拿到检查报告的那一刻才意识到:久坐的伤害是不可逆的,而且它在我毫无察觉的时候就已经发生了。

健康是 1,其他所有的东西都是后面的 0。 没有了身体,写再多代码、做再多项目也没有意义。我们总是觉得"写完这点就站起来",然后一晃两三个小时就过去了。日复一日,等身体发出警报时已经晚了。

🖥️ 最后认真说一句:如果你每天对着屏幕超过 8 小时,除了定时站起来活动,眼睛也要保护好哦~不如选一款专门为程序员打造的显示屏( •̀ ω •́ )y。

写这个插件的几个星期里,都是在 RD270Q 前面坐着,又被自己的插件提醒后站起来。颈椎问题只靠站起来活动是解决不的,屏幕高度、角度、光线这些都有影响(⊙o⊙)。这块屏支架能升降、能旋转(看长文件我会竖过来,一屏上百行不用来回滚),自带环境光感应自动调亮度,还有专门的编码模式,有为黑色背景设计的深色主题和彩纸模式,也有为白色背景设计的亮色主题。我比较喜欢这个彩纸模式,打开之后字符特别清晰,看时间久了也不会感觉难受。再搭配上抗反射面板,真的特别舒服。可以很大程度上帮我们缓解颈椎和眼睛长时间紧盯屏幕的带来酸涩感的问题~通过热键一键切换,OSD 摇杆设置入口很方便 ,不用层层翻菜单😭;五项莱茵护眼认证,长时间盯代码的疲劳感确实轻不少呢╰(°▽° )╯! 还有配套软件 Display Pilot 2 的 Flow 功能 ,说白了就是让显示器自动跟着你的节奏切换模式 ,不用老去按显示器按键。

几个我觉得挺香的点:

  1. 自动切场景 :打开 Trae 写代码,显示器自动跳到「编码-亮色主题」;切到浏览器看设计稿,又自动换成 True Color......不用手动调,无缝切换,省心。
  2. 常用模式一键选 :Focus Max、Work、True Color、Game、Movie 这些,点一下就切过去。
  3. 定时启动 :比如我设个工作时段 10:00--19:00,到点自动生效,下班自动退出,超级适合搬砖人的。

这个工具做的事情很简单------在你忘记站起来的时候,提醒一下。不会在正忙的时候强行打断,也不会在已经站起来的情况下多此一举地弹窗。它只是安静地守在那里,在你需要的时候轻轻提醒一句:该站起来活动一下喽~

希望每一个和我一样每天长时间坐在电脑前的人,都能重视自己的健康。别等到身体发出警报才开始行动。

回过头看这几个星期,插件从一个 setTimeout 计时器长成 1100+ 行的状态机,RD270Q 陪着我熬过了每一个调不通的凌晨。明基做这块编程显示器的思路我挺认同------不是单纯堆参数,而是从开发者坐下来写代码那一刻起,把编码显示、护眼、人体工学都考虑进去了。赋能开发者、一起把代码写得久一点稳一点,这事儿它是认真的。

这个插件我已经用大概三周了,体验下来,觉得有很大改善,其实起来上个厕所大概就 1-2分钟,时间虽然不长,但是站立本身就对身体很有益,不用一直保持一个姿势。

这个插件后续会开源,感兴趣的可以先关注一下。

目前还在测试、优化阶段,在那之前欢迎大家留言交流------有什么需要优化的地方、想要的功能,都可以在评论区提出来,我会一条条看,一起把它做得更好。


如果这篇文章对你有帮助,别忘了点个 👍 和 ⭐~

文中使用的明基 RD270Q 为 27 英寸 2K 编程显示器,3:2 生产力方屏,144Hz 高刷新率,支持编程模式(彩纸模式)、分区对比度、猫头鹰模式、MoonHalo 智慧光环、五项莱茵护眼认证、人体工学支架,适合长时间编码的开发者使用。

相关推荐
闲猫1 小时前
Python FastAPI + SQLAlchemy 入门教程:从零搭建你的第一个 Web 应用
前端·python·fastapi
林小帅2 小时前
NestJS v11 + Prisma v7 ESM 迁移配置解析
前端·javascript·后端
IT_陈寒2 小时前
React的setState竟然不是立刻生效的,害我调试半天
前端·人工智能·后端
简简单单就是我_hehe2 小时前
前端埋点日志解决方案:完整 User-Agent 解析工具实现,爬虫识别、设备品牌、操作系统、浏览器版本全解析(附完整源码)
前端·爬虫
William_Xu3 小时前
Vue 2 与 Vue 3 生命周期对比
前端
Hilaku3 小时前
为什么你的大文件断点续传,一遇到弱网就崩溃?
前端·javascript·程序员
胡哈4 小时前
React Compiler:让开发者忘掉 memo 这件事
前端·react.js
xiyueyezibile4 小时前
“自迭代” Skill 的 team-pitfalls 的演进
前端·后端·ai编程
林恒smileZAZ4 小时前
`Array(100).map(() => 1)` 为什么全为空?
前端·javascript