环境:
- node: >= 24.0.0(与 Electron 44 内嵌的 Node 24 对齐)
- npm: 随 Node 附带(npm 10.x / 11.x)
- 不需要 Visual Studio / C++ 工具链(原生模块走镜像下载预编译包,不本地编译)
安装依赖:
npm install
⚠️ 本项目使用 npm 管理依赖,package-lock.json已纳入版本控制,请勿删除或忽略。 如需添加依赖,使用npm install <pkg>;升级全部依赖用npm update。
关于 npm 警告:如果看到
npm warn Unknown project config "electron_mirror"之类的提示, 属于预期行为,不是配置错误。这些键是 electron / prebuild-install 等第三方工具的环境变量, 不是 npm 的配置项;npm 11 起对项目级未知键发出警告,并将在下个大版本移除该注入行为。 本项目已迁到官方支持的方式(见下节),按 README 配置即可,无需理会历史警告。
原因有二,升级到 sqlite3@^6.0.1 后两者都已解决:
- 下载失败回退本地编译:
prebuild-install默认从 GitHub Releases 取预编译二进制, 国内网络常被ECONNRESET重置,于是走|| node-gyp rebuild回退本地编译,而本机没有 VS C++ 工具链。 node-gyp版本太老,压根不支持 Node 24:sqlite3@5.1.7把node-gyp钉死在8.x(optionalDependencies+peerDependencies),而node-gyp@8只支持到 Node 18。 所以一旦回退编译,报错里会出现gyp info using node@24.18.1 ... node-gyp@8.4.1这种不匹配组合。
sqlite3@6.0.1 的两处关键变化:
sqlite3@5.1.7 |
sqlite3@6.0.1 |
|
|---|---|---|
绑定的 node-gyp |
8.x(仅支持 ≤ Node 18) |
12.x(^20.17.0 || >=22.9.0) |
engines.node |
未声明 | >=20.17.0 |
| CI 覆盖的 Node | 18 / 20 / 22 | 18 / 20 / 22 / 24 |
即:
sqlite3@6.0.1官方 CI 已覆盖 Node 24,无需安装 Visual Studio。
镜像配置的正确位置(.npmrc 里不再写这些键):
| 下载对象 | 配置位置 | 键 / 字段 |
|---|---|---|
| 运行时 Electron 二进制 | electron-builder.json5 |
electronDownload.mirrorOptions.mirror |
| 打包期 Electron 二进制 | 同上(打包时生效) | 同上 |
| 原生模块预编译包 | shell 环境变量 | sqlite3_binary_host(每包一行) |
原生模块镜像需要在 shell 里设环境变量(写进项目 .npmrc 会触发 npm 警告):
rem Windows CMD —— 每次开新终端都要设,或用 setx 永久写入
set sqlite3_binary_host=https://registry.npmmirror.com/-/binary/sqlite3
npm install或者写进用户级 ~/.npmrc(C:\Users\<你>\.npmrc),一次配置全局生效,
且不会触发 npm 的「Unknown project config」警告:
sqlite3_binary_host=https://registry.npmmirror.com/-/binary/sqlite3
electron_mirror=https://npmmirror.com/mirrors/electron/
electron_builder_binaries_mirror=https://npmmirror.com/mirrors/electron-builder-binaries/键名规则(依据 prebuild-install@7 的 util.js):它读的是
npm_config_<包名>_binary_host,因此每个原生模块需单独配一行。
prebuild_install_mirror / node_pre_gyp_mirror)无效,别写。
.npmrc 里写 sqlite3_binary_host 即可(自动变 npm_config_sqlite3_binary_host)。
镜像上 sqlite3 的可用二进制(已实测可下载):
https://registry.npmmirror.com/-/binary/sqlite3/v6.0.1/
sqlite3-v6.0.1-napi-v3-win32-x64.tar.gz
sqlite3-v6.0.1-napi-v6-win32-x64.tar.gz
安装中途失败时,npm 清理 node_modules 可能因文件被占用而报 EPERM(常见于
@vueup/vue-quill/node_modules/quill)。这是清理阶段的次生噪声,不是失败原因——
真正的失败是它上面那条 npm error。关闭正在运行的应用 / 编辑器占用后重装即可。
首次 npm install / npm run dev 需要下载 ~116MB 的 Electron 官方 zip。
实测同一网络环境下:
| 来源 | 平均速度 | 116MB 预计耗时 |
|---|---|---|
| GitHub 官方(默认) | 372 KB/s | 约 5 分 20 秒 |
| npmmirror 镜像 | 5.9 MB/s | 约 20 秒 |
已配好镜像加速(用户级 ~/.npmrc,不触发 npm 警告):
electron_mirror=https://npmmirror.com/mirrors/electron/
electron_builder_binaries_mirror=https://npmmirror.com/mirrors/electron-builder-binaries/
sqlite3_binary_host=https://registry.npmmirror.com/-/binary/sqlite3
@electron/get的mirrorVar()会依次读npm_config_electron_mirror→npm_config_electron_<snake>→ELECTRON_MIRROR,所以写在.npmrc里是有效的(源码见@electron/get的artifact-utils.ts)。 拼接出的地址https://npmmirror.com/mirrors/electron/44.4.5/electron-v44.4.5-win32-x64.zip已实测 HTTP 206,且镜像上的SHASUMS256.txt与官方一致。
临时覆盖(只影响当前终端,优先级高于 .npmrc):
set ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/
npm run dev断点续传(网络抖动时推荐):116MB 一次下不完会从头再来很浪费。用内置脚本预下载:
npm run fetch-electron它走 curl -C - 断点续传 + 自动重试,中断后重跑即接着下;完成后 Electron 会命中缓存。
可跳过它(本项目跑在 Electron 内,通常用不到):
set PUPPETEER_SKIP_DOWNLOAD=true
npm install
⚠️ puppeteer 读的是无前缀变量PUPPETEER_DOWNLOAD_BASE_URL,npm 注入的变量一律带npm_config_前缀,因此 puppeteer 的镜像无法通过.npmrc配置,只能在 shell 里设环境变量。
standard-version用法:设置了"release": "standard-version"之后,可以根据需要执行相应的代码:
- 发布主版本:
npm run release -- --release-as major - 发布次版本:
npm run release -- --release-as minor - 发布补丁版本:
npm run release -- --release-as patch - 发布预发布版本:
npm run release -- --prerelease alpha - 发布beta版本:
npm run release -- --prerelease beta - 发布rc版本:
npm run release -- --prerelease rc - 发布自定义版本:
npm run release -- --release-as 1.1.0
镜像已在 electron-builder.json5 的 electronDownload.mirrorOptions.mirror 中配好,直接打包即可:
npm run build如需临时覆盖(例如换用其他镜像),可在 shell 里设环境变量后执行:
set ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/
set ELECTRON_BUILDER_BINARIES_MIRROR=https://npmmirror.com/mirrors/electron-builder-binaries/
npm run build- [electron-vite-vue]
- 2026-08-29:通用习惯打卡的定位与落地顺序。定位 = 建在已 id 泛化提醒引擎之上的「复合提醒 + 记录 + 链式动作」系统,而非孤立功能;落地顺序(最小闭环优先):① 数据模型+引擎复用 → ② 打卡小窗+通知 → ③ 链式动作注册表+1~2 个串接 → ④ 统计面板 → ⑤ 配置化。完整方案见
docs/habit-checkin-design.md。
-
2026-08-30:托盘增强(
electron/main/module/tray.ts)- 右键快捷菜单新增:打卡(打开
habitMiniWindow打卡小窗)/ 番茄钟(打开pomodoro小窗)/ 截图(直接唤起截图选框层)/ 快速记录(打开quickNote小窗)。 统一复用registerShortcut的openOrToggleMiniWindow模式(命中已开窗口则收起,否则读window-mode:{key}配置并以mouseEvents:true打开 frameless 小窗);截图复用screenshot.ts新增导出的startScreenshotCapture()。 - 新增「关闭时最小化到托盘」:偏好持久化在 electron-store 键
closeToTray(默认关闭)。mainWindow.ts的close事件改为按该偏好分流——开启则hideApp()收进托盘(可从托盘菜单「退出应用」真正退出),关闭则exitApp()正常退出。(原before-close事件渲染端无人消费,已移除。) - 托盘气泡提醒(Windows
Tray.displayBalloon):tray.ts暴露showTrayBalloon+tray-balloonIPC;src/App.vue在tips-trigger/tips-state-change/todo-reminder-trigger触发时发送该 IPC,应用收在托盘也能看到提醒。非 Windows 平台做能力守卫,避免抛错。balloon-click恢复应用。
- 右键快捷菜单新增:打卡(打开
-
2026-08-29:新增「习惯打卡」模块(阶段①:数据模型 + 引擎复用)
- 数据层
src/views/habit/api/habitApi.ts:自有表habit_def/habit_checkin。 读走new-sql:query(支持 conditions.SqlStr、不按 SQL 推导列)、写走new-sql:upsert、删走new-sql:delete; 禁用裸new-sql:execute—— 它的extractColumnNames对SELECT */DELETE猜不出列名时会兜底成['name','value','created_at']并对已存在表 ALTER ADD COLUMN,污染业务表结构。 - Store
src/store/useHabit.ts:syncReminders()是「引擎复用」的核心——把每个提醒时刻同步为提醒系统里的mode='time' + repeat定点提醒(id 形如habit:<key>#<序号>),调度 / 免打扰 / 重启恢复全部复用既有 newReminder 引擎。 习惯停用会同步置提醒enabled=0;删除习惯或删减时刻会清理对应旧提醒。 - UI
src/views/habit/:index.vue(薄壳)+components/HabitCard.vue+components/HabitEditDialog.vue(走 AppDialog)。 - 工具
src/views/habit/utils/streak.ts:连击统计(含「今天还没打但昨天打了不算断」的一天宽限)。 - 路由:新增
/habit(RouteNames.HABIT),已挂进layoutRouters。 - 校验:
vue-tsc --noEmitEXIT=0。 - 已知边界:同步是单向的(习惯 → 提醒)。在「提醒」页手动改动/删除这些习惯提醒,下次打开习惯页会被同步覆盖回来。
- 数据层
-
2026-08-29:习惯打卡阶段②(打卡小窗 + 通知)
- 新增小窗
habitMiniWindow:src/views/habitMiniWindow/(index.vue薄壳 +components/HabitCheckinPanel.vue), 路由/habitMiniWindow,useWindowMode增加showHabitWindow/habitWindowConfig/openHabitWindow()。 - 通知链路天然复用:定时提醒到点在主进程发
tips-trigger,App.vue已接住并弹系统+站内通知; 本次识别出habit:前缀后,到点唤起打卡小窗,点通知也能再唤出。 src/utils/notify.ts的sysNotify/appNotify各增加可选的onClick参数(放在最后,既有调用零影响)。- 小窗关闭走
hide-new-window(复用,不 destroy),与 quickNote 一致。 - 关键坑:
createOtherWindow在!ops.mouseEvents时会setIgnoreMouseEvents(true)进入鼠标穿透态 (点不动也拖不动)。habitWindowConfig必须显式带mouseEvents: true。 (既有clipboardWindowConfig就没带该字段,靠快捷键路径绕过,别照抄。) store.load()新增{ sync: false }选项:小窗只做只读展示与打卡,不重复跑提醒同步。- 习惯页新增「打开打卡小窗」按钮,便于不等提醒就测试。
- 校验:
vue-tsc --noEmitEXIT=0。纯渲染端改动,刷新页面即生效。
- 新增小窗
-
2026-08-29:习惯打卡阶段③(链式动作注册表 + 待办/笔记串接)
- 新增
src/views/habit/chainActions/:types.ts(HabitChainAction接口)+registry.ts(注册表)+index.ts(注册 + 派发/回滚)actions/{todoAction,noteAction}.ts。仿命令面板 REGISTRY 模式:新增串接只加一个 action 文件并放进ACTIONS数组,核心零改动。
- 已实现两个串接:
todo完成关联待办 ——todo_list先SELECT *取整行,再 upsert 覆盖status='completed'/completed=1/completedTime, 写完发update-todo-reminders让主进程重排截止提醒(与待办模块自身保存写法一致)。note自动写笔记日志 —— 写note_book,key =habit-log-<habitKey>-<date>(同一天重复打卡=更新同一条,撤销即删除该条,不留垃圾笔记)。
habit_def新增chainActions列(JSON);编辑弹窗「打卡后串接」按注册表自动渲染可勾选项与说明。- 健壮性设计:
checkIn/undoCheckIn改为返回ChainActionResult[] | null(null=打卡失败); 单个串接动作失败只记录原因、降级提示,绝不阻断其它动作、更不阻断打卡本身。 - 校验:
vue-tsc --noEmitEXIT=0。纯渲染端改动,刷新页面即生效。
- 新增
-
2026-08-29:习惯打卡阶段④(统计面板 + 日历热力图)
- 新增
src/views/habit/utils/stats.ts(纯函数):buildHeatmap(12 周网格,列优先,最后一列含今天)、computeOverview(累计打卡 / 打卡天数 / 最长连击 / 近 30 天活跃占比)、countByDateOf、weekdayIndex(0=周一)。 - 新增组件
components/HabitHeatmap.vue(网格 + 图例,未来日期用虚线格避免误读)+components/HabitStats.vue(4 张指标卡 + 热力图)。 统计面板通过 props 接收数据(不直接读 store),保持原子性与可测性。 index.vue用HabitStats替换原先手写的 3 格概览,顶部标题改为显示「共 N 个习惯,今日已打卡 M 个」。- 已做算法冒烟验证:针对一周七天各作为结束日的情况校验网格对齐(格子数 84、起始日为周一、末格为该周周日、 结束日落在其所在列且不计为未来、未来格子全部晚于结束日)—— 7 种对齐全部 ALL PASS(临时脚本跑完已删)。
- 校验:
vue-tsc --noEmitEXIT=0。纯渲染端改动,刷新页面即生效。
- 新增
-
2026-08-29:习惯打卡阶段⑤(配置化:小窗设置页条目 + 全局热键 + 命令面板
!作用域)- 小窗设置页:
src/views/windowMode/config/windowSections.ts增加habit区块(storeKey='habitMiniWindow'、图标AlarmClockCheck、尺寸预设HABIT_SIZE_OPTIONS);useWindowModeSetting.ts的三个映射图(storeConfigMap/showSetterMap/storeVisibleMap)各补habit一项,均指向useWindowMode已有的habitWindowConfig/setShowHabitWindow/showHabitWindowC。纯数据驱动,页面零改动。 - 全局热键:
electron/main/module/registerShortcut.ts增加toggleHabitWindow()+getHabitWindow()+DEFAULT_HABIT_CONFIG,并在globalShortcutFn分发open_habit_window类型;src/views/registerShortcut/index.vue的常用功能列表新增open_habit_window项,用户可在「快捷键注册」页自定义热键唤起打卡小窗(与番茄钟/待办/命令面板同一套机制)。createOtherWindow创建时强制mouseEvents:true,规避穿透坑。 - 命令面板
!作用域:新增src/views/commandPalette/sources/habitSource.ts,回车即直接打卡(写habit_checkin后再派发链式动作,与主流程一致,且刻意不碰命令面板所在渲染进程的 store 以避免跨窗重复同步提醒); 注册进useCommandSources的REGISTRY。types.ts的CommandType增加habit;paletteConfig.ts的SCOPE_PREFIX_MAP/SCOPE_LABEL/TYPE_META补!→习惯;useCommandPalette.ts的SCOPE_PATTERN正则补!;输入框占位提示也同步说明。 - 校验:
vue-tsc --noEmitEXIT=0。主进程改动需重启 Electron 生效(registerShortcut.ts);渲染端改动刷新即生效。
- 小窗设置页:
-
2026-08-29:习惯打卡阶段⑥(串接「主题对话」记录)
- 新增串接动作
themeConversation:打卡后在「主题对话」按习惯名称新建/复用主题,并在该主题下写入一条对话记录;撤销打卡时按ext_key精准删除。 - 新增
src/views/habit/chainActions/actions/themeConversationAction.ts:直接走themeConversation/db的底层 IPC(dbQuery/dbInsert/dbUpdate/dbDelete),不依赖useThemeConversation的全局currentThemeId(避免后台打卡把用户当前选中的主题悄悄切换)。 - 关联键:
conversation表新增可选列ext_key,由本 action 在运行时幂等 ALTER 补列(ALTER TABLE ... ADD COLUMN ext_key TEXT,列已存在则忽略),不侵入 themeConversation 模块的建表逻辑;值 =habit-conv-<habitKey>#<date>,保证一天一条且可定位。 - 注册:
chainActions/index.ts的ACTIONS加入themeConversationAction(设置界面勾选列表由listHabitChainActions()动态读取,自动出现);HabitEditDialog.vue的buildChainActions()增加themeConversation分支,使勾选能存回habit_def.chainActions。 - 内容模板默认
今日打卡:{name}({date} {time}),支持{name}{date}{time}{value}{note}占位符(可由params.template覆盖)。 - 校验:渲染端
vue-tsc --noEmitEXIT=0。纯渲染端改动,刷新页面即生效。
- 新增串接动作
-
2026-08-29:习惯打卡入口接入侧边栏菜单与路由配置页
src/utils/index.ts的iconMap增加habit: 'AlarmClockCheck'(与「小窗设置」页习惯区块图标统一)。src/layout/index.vue的「效率工具」分组names加入'habit'(置于todoList之后),侧边栏菜单即出现「习惯打卡」入口。src/views/routeSetting/index.vue的「效率工具」分组names同样加入'habit',使该页可单独开关习惯打卡菜单项(非锁定路由,默认可见)。- 校验:
vue-tsc --noEmitEXIT=0。纯渲染端改动,刷新页面即生效;habit 路由已注册进layoutRouters,菜单/配置页均能正确解析标题与图标。
-
2026-08-29:修复新建习惯报错
SQLITE_ERROR: table habit_def has no column named key- 根因:习惯表首次被
query()以默认id主键建表;后续upsert(primaryKey:'key')在newSql.ts的ensureTableColumns/ensureTableExists里试图ALTER TABLE ... ADD COLUMN key TEXT PRIMARY KEY,而 SQLite 不允许 ALTER 加主键列,该语句被静默拒绝 →key列始终缺失 → upsert 报 no column named key。 - 修法:
newSql.ts将补主键逻辑改为两步「ALTER TABLE t ADD COLUMN key TEXT(普通列可成功)+CREATE UNIQUE INDEX IF NOT EXISTS uq_t_key ON t(key)(等价主键唯一约束)」;QueryOptions新增可选primaryKey/config透传给ensureTableExists(向后兼容);habitApi新增幂等ensureHabitTables()(加载时补 key 列+唯一索引,修复历史破表),fetchHabitDefs/fetchCheckins的 query 透传primaryKey:'key',useHabit.load()开头先调ensureHabitTables()。 - 校验:渲染端
vue-tsc --noEmitEXIT=0;主进程类型检查仅vite.config.ts既有错误(与本次无关)。主进程改了newSql.ts,需重启 Electron 生效;habitApi.ts/useHabit.ts刷新即生效。用户库里已有的破表会在下次打开习惯页时自动修好,新建习惯不再报错。
- 根因:习惯表首次被
-
2026-08-29:修复习惯页热力图与列表「没数据 / 空白」
- 症状:已有打卡记录,但热力图全空、下方习惯列表也空白(显示「还没有习惯」)。
- 根因(与阶段②的破表无关,是另一处查询 bug):
habitApi.fetchHabitDefs/fetchCheckins把完整 SQL 放在conditions: { SqlStr: "..." }里传给new-sql:query;而newSql.ts的query()只读取顶层SqlStr,于是落到conditions循环分支,生成WHERE SqlStr = ?并传入整段 SQL 作参数,结果恒为[]→store.habits与store.checkins双双为空。 - 修法(主进程):
query()改为同时支持SqlStr(顶层)与conditions.SqlStr,并在conditions循环里跳过SqlStr键。这一处同时修好了同样写法的todoAction与命令面板db.ts的查询(它们此前也返回空)。 - 顺带满足需求「打卡完成也显示、置灰即可」:
HabitCard.vue的.is-done由「主色高亮」改为「整体降透明度(opacity:0.6) + 左侧成功色强调条」,今日已打卡习惯仍保留在列表中且可撤销。 - 校验:渲染端
vue-tsc --noEmitEXIT=0。主进程改了newSql.ts,需重启 Electron 生效;HabitCard.vue刷新即生效。重启后习惯页会正常列出习惯、热力图按真实打卡数据着色。
-
2026-08-29:习惯打卡热力图改写为 ECharts 矩阵热力图(习惯 × 日期)
- 用户选择「矩阵热力图(习惯×日期)」呈现,而非原先的 GitHub 风格日历网格。
- 重写
src/views/habit/components/HabitHeatmap.vue:用 EChartsheatmap系列 +category横轴(日期, 最近 weeks 周含今天) / 纵轴(习惯名称) +visualMap(连续色阶) +dataZoom滑块(横轴平移);单元格颜色 = 当天该习惯打卡次数(0=未打卡)。主题色从 CSS 变量(--color-primary/--bg-hover/--text-muted/--border-subtle等)实时派生,自动适配明暗与全部内置主题;监听useThemeStore().currentTheme切换重绘;ResizeObserver+ window resize 自适应;空习惯时显示占位文案。 src/views/habit/components/HabitStats.vue同步改造:移除旧的buildHeatmap/countByDateOf用法,改为向HabitHeatmap直接传入habits/checkins/weeks(由组件内构建矩阵),保留总览指标不变。- 关键点:
weekdayIndex来自utils/stats而非utils/streak(构建日期区间时复用与buildHeatmap一致的起止算法)。 - 校验:渲染端
vue-tsc --noEmitEXIT=0。纯渲染端改动,刷新页面即生效。
-
2026-08-29:修复 ECharts 习惯热力图「中间突兀柱子 / tooltip 溢出」
- 问题根因:① 颜色按「当天打卡次数」取值会拉高
visualMap.max形成深色高柱;② 底部中间那根"柱子"实为 continuous 型visualMap控件本身——拖拽手柄即竖条,hover 弹出 indicator 显示<1/=1,与打卡数据无关;③tooltip.position: 'top'会溢出。 - 修复(
HabitHeatmap.vue):热力值封顶 0/1(visualMap.max固定 1,颜色只区分"未打卡/已打卡");进一步将visualMap设show: false根除中间那根柱子与<1/=1提示(保留对象仅用于颜色映射);tooltip 改position: 'inside' + confine: true加max-width/word-break限制溢出,仍显示真实次数。 - 校验:渲染端
vue-tsc --noEmitEXIT=0。纯渲染端改动,刷新页面即生效。
- 问题根因:① 颜色按「当天打卡次数」取值会拉高
[x] 系统信息采集查看 [x] 自定义的sprider页面/接口获取 [x] 获取系统已经安装的应用列表及其可执行文件路径(通过注册表?) [x] 多次切换强制切换当前状态会导致小窗口和主窗口的时间(倒计时)不一致
vite打包报错:Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
解决方式:扩大内存,在默认情况下,Node.js 进程的内存限制是比较低的,通常为 1.5GB 到 2GB,这可能会导致在处理大型数据或执行内存密集型任务时出现内存不足的问题。可使用increase-memory-limit ,它是一个用于增加 Node.js 进程内存限制的工具。
用法如下:
cnpm i increase-memory-limit
buildMy: increase-memory-limit -m 4GB && npm run build引入worker线程,采集系统信息。这个意义在于,不会阻塞主线程,导致页面卡顿。
注意事项在于:主线程引入worker时,需要确保开发环境和打包环境下的workerjs文件路径可访问,例如export const systemInfoWorkerPath = path.join(appRoot, VITE_DEV_SERVER_URL ? "./public/worker/systemInfo.cjs" : "./dist/worker/systemInfo.cjs");。
小组件订阅,是采用拖拽生成(左侧是小组件列表,右侧是空页面),还是采用弹窗选中组件的形式?
小组件思维下,所有的模式,所有的组件,都是可以自由搭配属性的,所以,模式下的小组件,都应该是小组件本身属性的备份。其数据结构类似:
// 模式结构:
const homeMode = {
// 工作模式
work: {
// 工作模式属性
label: 'xxx',
value: 1,
// 该模式共有css样式
css: {
// 该模式的背景颜色
backgroundColor: 'xxx',
},
// 该模式下组件集合
components: {
// 组件名称
bigDateTime: {
// 组件属性
// ...
// 组件样式
css: {
// 组件字体
font: 'xxx',
}
}
}
}
}小组件思维下,所有的模式都是引入小组件的,而非将组件固定在某种特定的模式中。
故而:
- 小组件应当单独维护一个状态库,包括不限于:
- 组件名称、唯一标识
- 组件特有的样式,包括字体、背景、颜色、定位
- 模式引入小组件,模式应当含有,模式全局化的样式
- 维护一个css样式的列表,其中可以包括:样式名称(字体),对应的css样式(font),以及样式的默认值,然后在模式中选择这些存在的样式,不存在的样式则不能够进行选择
小组件思维,某种模式下,可以自有选配各种不同组件到桌面上。
小组件:
- 时钟(时钟、倒计时、番茄钟)
- 待办事项
- 便签
- 天气
- 日历
- 事件提醒(周期性事件、一次性事件),比如纪念日,喝水提醒
- 随时记录(记录自己的想法、记录自己的生活)
electron框架中,控制台打印中文乱码,解决方法:在项目根目录输出命令chcp 65001
消息通信,若是同步(sendSync)的,很可能会卡顿,所以需要异步通信(send)
开启vue调试,安装vue/devtools,在html文件中加入devtools启动的脚本,启动命令npm run debug后才能npm run dev
package.json中开发依赖应当放在devDependencies中,否则会报错
定时任务还是专用的库好,而非定时器