资讯动态

一人工作室微信小游戏开发实战:Canvas+AI高效闭环

发布时间:2026/9/18 0:21:47 来源:尧图企业网站定制
1. 项目概述为什么一个“一人工作室”能靠微信小游戏跑通闭环“Vibe Gaming 一人工作室微信小游戏开发实战”这个标题里藏着三重现实信号轻量启动、真实交付、个体可行。它不是“从零开始学微信小程序”的教学课也不是大厂标准化流水线的复刻而是一个真实存在的独立开发者——用不到20平米的书房、一台MacBook Pro、每天4小时有效时间在6个月内上线3款DAU稳定在8000的小游戏并实现单月流水破5万的真实路径。我试过这条路也踩过所有坑所以今天不讲概念只拆解动作。核心关键词“微信小游戏”在这里不是泛指微信生态里的H5或小程序而是特指基于微信原生渲染引擎WebGL Canvas 2D构建、通过微信开发者工具打包上传、运行于微信客户端内、支持离线加载与本地存储、具备完整支付与分享链路的轻量级互动产品。它和“微信小程序”有本质区别小程序主攻服务与信息流小游戏主攻即时反馈与行为闭环小程序依赖WebView兼容性小游戏直通微信底层渲染管线帧率更稳、触控延迟更低、资源加载更可控。这也是为什么《羊了个羊》《海盗来了》这类爆款选择小游戏而非小程序——它们需要毫秒级响应和确定性性能。“Vibe Coding”不是某个神秘组织而是指一种以节奏感、即时反馈、最小可行验证为驱动的编码方式写10行代码 → 立即真机预览 → 调整参数 → 再预览 → 记录效果差异。它反对“先写完再调试”的瀑布模式强调“每15分钟必须看到一次画面变化”。这种工作流天然适配微信开发者工具的热重载机制也和当前AI编程工具如Claude、Cursor、GitHub Copilot形成强耦合——AI不是替代你写逻辑而是帮你把“调整按钮颜色→改CSS→预览→再调”这个循环压缩到3秒内完成。至于“AI编程”它在这类项目中绝不是噱头。我统计过自己第3款游戏《弹珠叠叠乐》的代码产出72%的UI组件模板按钮、计分板、动效遮罩、89%的配置文件游戏关卡JSON、音效映射表、100%的运营文案新手引导、成就提示、分享话术均由AI生成初稿我只做三件事校验逻辑边界、调整数值手感、注入人格化语气。AI没写一行核心游戏循环update/draw但把非核心重复劳动压缩了83%的时间。这才是真实的一人工作室效率杠杆。适合谁参考如果你是有1~2年前端/Unity基础但没做过商业小游戏的独立开发者想用副业验证产品想法拒绝外包成本与沟通损耗的创业者正在评估AI是否值得投入日常开发流程的技术人或单纯好奇“一个人怎么扛起策划、程序、美术、测试、运营全链条”的实践者——那么这篇内容就是为你写的。它不承诺“月入十万”但保证给你一套可逐行复现、带血带汗的实操地图。2. 整体架构设计为什么放弃Unity坚持原生CanvasJS方案2.1 技术选型背后的硬约束包体积、审核周期与热更新自由度很多人看到“微信小游戏”第一反应是Unity——毕竟Unity有成熟的游戏管线、物理引擎和跨平台能力。但我上线前做了三轮压测结论很明确对单人工作室而言Unity是豪华跑车而CanvasJS是改装摩托后者在小巷子里更快。关键数据如下维度Unity打包方案原生CanvasJS方案差异说明首包体积8.2MB含Unity Runtime1.3MB纯JS资源微信要求首屏资源≤2MBUnity需分包远程加载首屏白屏超3秒Canvas方案首屏1.2秒内渲染完毕审核通过率67%2023年Q4数据94%同周期3款游戏Unity打包易触发“未声明第三方SDK”误判Canvas方案无黑盒模块所有代码可审计热更新成本需配置CDN版本管理资源校验平均耗时2.5小时/次直接替换CDN上JS文件37秒完成全量更新小游戏运营依赖快速迭代如节日活动Unity热更失败率12%Canvas为0提示Unity微信小游戏打包的“视频播放方案”热搜背后其实是开发者被逼无奈的选择——Unity默认VideoPlayer组件在微信环境失效必须用wx.createVideoContext绕过但该API在iOS 15以下存在兼容问题。而Canvas方案直接用video标签微信提供的wx.getFileSystemManager()读取本地缓存稳定性提升4倍。我最终采用的架构是LayaAir引擎轻量版 TypeScript Webpack打包 自研资源懒加载器。LayaAir不是必须但它解决了两个致命痛点一是提供Canvas/WebGL双后端自动切换低端机降级Canvas高端机启用WebGL二是内置ECS架构雏形让我能用150行代码实现“弹珠碰撞系统”——比手写Box2D精简60%代码量且性能无损。2.2 Vibe Coding工作流如何嵌入技术栈Vibe Coding的核心是“节奏感”这要求开发环境必须满足修改即生效、错误即定位、效果即所见。我搭建的环境链路如下编辑器层VS Code 插件组合ESLint Prettier TypeScript Hero Live Server关键配置typescript.preferences.includePackageJsonAutoImports: auto开启智能导入避免手动补全路径Live Server插件监听dist/目录每次保存自动刷新浏览器预览页模拟微信WebView环境。构建层Webpack 5 自定义Loader编写res-loader.js当代码中出现import bg from ./assets/bg.jpg时自动将图片转为Base64内联减少HTTP请求数并生成resMap.json记录资源哈希值用于CDN缓存控制webpack.config.js中设置devtool: source-map确保真机调试时断点精准到TS源码行而非编译后JS。真机调试层微信开发者工具 自研vibe-debug面板在游戏初始化时注入window.vibeDebug { fps: 0, memory: 0, network: [] }全局对象开发者工具控制台输入vibeDebug.fps实时查看帧率vibeDebug.network查看资源加载瀑布流——这比微信自带调试器快3倍定位网络瓶颈。这套环境让我的典型开发循环变成修改按钮点击音效路径 → 保存 → 浏览器自动刷新 → 听音效 → 不满意 → 打开vibe-debug面板 → 发现音频文件加载耗时420ms → 切换为Web Audio API预加载 → 再保存 → 3秒后真机验证成功。整个过程无需重启工具、无需重新编译、无需等待审核这就是Vibe Coding的呼吸感。2.3 AI编程工具如何成为“第二双手”而非“替代大脑”当前AI编程工具Claude、Cursor、GitHub Copilot在小游戏开发中存在明显能力边界✅强项生成结构化数据JSON关卡配置、模板化UI排行榜列表渲染、重复逻辑用户登录态校验、文案润色成就描述❌弱项理解游戏物理规则如“弹珠碰撞后按反射角飞出”、处理微信特有APIwx.onShow与wx.onHide生命周期冲突、优化Canvas渲染性能requestAnimationFrame节流策略。我的使用原则是AI负责“已知世界的复制”我负责“未知世界的创造”。具体分工如下AI承担的模块占代码量68%config/level_01.ts输入提示词“生成10关弹珠叠叠乐关卡配置每关目标分数递增15%障碍物数量线性增长最后一关加入移动平台”Claude输出完整TypeScript数组ui/components/ScoreBoard.ts输入“用LayaAir实现居中计分板包含当前分数、最高分、分数动画支持暂停时冻结”Cursor生成可运行代码我仅调整动画缓动函数lang/zh-CN.ts输入“将以下成就ID转为中文描述语气活泼带emoji长度≤20字”Copilot批量生成文案。我亲手写的模块占代码量32%core/gameLoop.ts主循环逻辑精确控制deltaTime计算、物理步进频率、渲染帧率锁定utils/collision.ts自研圆形碰撞检测针对微信Canvas的getPixel性能缺陷改用分离轴定理SAT预计算platform/wechat.ts微信API封装层处理wx.login失败重试、wx.shareAppMessage回调丢失等微信特有问题。注意AI生成的代码必须经过“三验”——验逻辑闭环是否覆盖所有分支、验微信API调用合规性是否遗漏wx.showLoading、验性能影响是否引入隐式内存泄漏。我曾因Copilot生成的for...in遍历对象导致iOS真机内存暴涨教训深刻。3. 核心模块实现从0到1搭建《弹珠叠叠乐》的5个关键环节3.1 游戏循环与性能锚点如何在60FPS下稳定运行微信小游戏的性能瓶颈不在CPU而在Canvas渲染管线与JavaScript主线程的争抢。微信客户端为小游戏分配的JS线程优先级低于UI渲染线程一旦JS执行超16ms1帧时间就会丢帧。我的解决方案是用Web Worker隔离计算密集型任务用requestIdleCallback调度非紧急任务用Canvas层级分离降低绘制压力。具体实现步骤主循环分帧设计// core/gameLoop.ts class GameLoop { private lastTime 0; private frameCount 0; private lastFpsUpdate 0; start() { const loop (timestamp: number) { const deltaTime timestamp - this.lastTime; this.lastTime timestamp; // 严格限制物理更新频率为30FPS降低CPU占用 if (deltaTime 33) { // 1000ms / 30fps ≈ 33ms this.updatePhysics(deltaTime); } this.updateLogic(deltaTime); this.render(); // 渲染始终60FPS requestAnimationFrame(loop); }; requestAnimationFrame(loop); } }这里关键点是updatePhysics与render解耦物理计算每33ms一次节省50%CPU渲染每16ms一次保障流畅感。实测iPhone 8上帧率从42FPS提升至59FPS。Canvas层级分离创建3个Canvas元素叠放canvas-bg静态背景每帧只绘制1次canvas-game动态游戏对象弹珠、障碍物每帧重绘canvas-uiHUD界面分数、按钮仅交互时重绘。通过ctx.clearRect(0,0,width,height)精准清除对应区域避免全屏擦除带来的GPU压力。Web Worker处理碰撞预测将弹珠轨迹预测未来3秒内可能碰撞的障碍物移入Worker// worker/collisionPredictor.js self.onmessage function(e) { const { ball, obstacles } e.data; const predictions []; for (let t 0; t 180; t 6) { // 每100ms采样一次 const pos predictPosition(ball, t); if (checkCollision(pos, obstacles)) { predictions.push({ time: t, position: pos }); } } self.postMessage(predictions); };主线程发送球体当前状态Worker返回预测结果主线程仅做最终判定。此举将碰撞检测CPU占用从32%降至7%。3.2 资源加载与离线体验如何让玩家3秒内进入游戏微信小游戏强制要求首屏资源≤2MB但《弹珠叠叠乐》美术资源含音效达12MB。我的策略是首屏只加载核心资源1.2MB非核心资源按需懒加载全部走微信本地文件系统缓存。实施步骤资源分组策略critical组必加载主场景图、弹珠贴图、基础音效点击、得分、字体文件lazy组按需加载关卡背景图、特殊音效Boss战、成就图标optional组用户触发加载分享海报模板、视频广告素材。自研懒加载器// utils/resourceLoader.ts class ResourceLoader { private cache new Mapstring, any(); private loadingQueue new Setstring(); async load(url: string): Promiseany { if (this.cache.has(url)) return this.cache.get(url); if (this.loadingQueue.has(url)) return this.waitForLoad(url); this.loadingQueue.add(url); try { // 优先尝试从微信本地文件系统读取 const file await wx.getFileSystemManager().readFile({ filePath: ${wx.env.USER_DATA_PATH}/${md5(url)} }); const data JSON.parse(file.data); this.cache.set(url, data); return data; } catch (e) { // 本地不存在则网络加载并缓存 const res await fetch(url); const data await res.json(); await wx.getFileSystemManager().writeFile({ filePath: ${wx.env.USER_DATA_PATH}/${md5(url)}, data: JSON.stringify(data) }); this.cache.set(url, data); return data; } finally { this.loadingQueue.delete(url); } } }关键技巧wx.env.USER_DATA_PATH是微信为每个小游戏分配的独立沙盒路径写入文件永久有效除非用户删小程序且读取速度比网络快10倍。我用MD5哈希作为文件名避免路径冲突。首屏加载优化启动页显示“正在加载游戏世界…” 进度条非真实进度心理暗示实际加载critical组资源时同步预加载lazy组首3关资源进度条走到80%时游戏主场景已渲染完毕用户可点击操作剩余资源后台静默加载。实测安卓机首屏时间从4.7秒压缩至2.3秒iOS从3.9秒降至1.8秒。3.3 微信特有功能集成登录、分享、广告与支付的避坑指南微信小游戏的功能集成不是简单调API而是与微信生态深度咬合。以下是我在3款游戏中踩过的坑与解决方案登录态管理wx.login的3次握手陷阱微信wx.login返回的code有效期仅5分钟且同一用户多次调用会返回不同code。我的方案是首次启动时调用wx.login获取code立即传给后端换取session_key与openid后端返回custom_tokenJWT格式有效期7天前端存入wx.setStorageSync后续请求携带custom_token后端验证JWT签名即可避免频繁调用wx.login。注意wx.checkSession必须在每次网络请求前调用若返回false则需重新wx.login否则custom_token过期后用户无法登录。分享功能wx.shareAppMessage的回调丢失问题微信分享成功后不会触发回调只能通过wx.onShow监听分享后的回传参数。我的处理逻辑// platform/wechat.ts wx.onShow((res) { if (res.query res.query.from share) { // 从分享链接进入记录分享者openId const sharerId res.query.sharerId; trackShareEvent(sharerId); } });关键点分享链接必须带?fromsharesharerId${myOpenId}参数且sharerId需经后端加密防止伪造。激励视频广告wx.createRewardedVideoAd的加载时机微信激励视频广告加载耗时长平均2.8秒若用户点击“看广告得道具”时才加载体验极差。我的方案游戏启动后立即创建广告实例并调用.load()广告加载成功后缓存实例到全局对象用户点击时直接调用.show()成功率99.2%未缓存时仅63%。实测广告展示完成率从51%提升至89%单用户ARPU值增加2.3元。支付功能wx.requestPayment的订单幂等性微信支付要求同一订单号不能重复请求。我的订单生成策略订单号 gameId timestamp randomString(6)确保全局唯一支付前调用后端接口校验订单状态若为unpaid则发起支付若为paid则直接发放道具支付回调中后端必须做幂等处理用Redis锁订单号超时释放。曾因未做幂等导致用户重复扣款微信客服介入后才解决务必重视。3.4 AI辅助开发实录用Claude生成关卡配置与成就系统的全过程以《弹珠叠叠乐》第5关为例展示AI如何参与核心内容生产步骤1向Claude输入结构化提示词你是一名资深休闲游戏策划请为微信小游戏《弹珠叠叠乐》设计第5关。要求 - 目标叠满5层弹珠塔每层需3颗弹珠 - 障碍物2个旋转齿轮转速15rpm1个移动平台左右移动速度2px/frame - 特殊机制第3层完成后触发“磁力场”吸附附近弹珠0.5秒 - 数值约束弹珠下落速度120px/s齿轮半径40px移动平台宽度120px - 输出格式TypeScript接口LevelConfig包含layers[], obstacles[], specialMechanics[]步骤2Claude输出结果经我微调interface LevelConfig { id: number; targetLayers: number; // 5 targetPerLayer: number; // 3 layers: Array{ y: number; required: number }; obstacles: Array{ type: gear | platform; x: number; y: number; rotationSpeed?: number; // rpm moveRange?: { minX: number; maxX: number }; }; specialMechanics: Array{ triggerLayer: number; // 3 type: magnet; duration: number; // 500ms }; } // Claude生成的具体数值...步骤3人工注入“手感”参数Claude生成的齿轮转速15rpm但实测发现太快导致玩家无法预判。我调整为8rpm并增加rotationOffset: Math.PI/4让初始角度错开提升视觉多样性。移动平台的moveRange由Claude给的{minX: 100, maxX: 300}改为{minX: 80, maxX: 320}扩大安全区降低挫败感。步骤4成就系统批量生成输入提示词“生成10个《弹珠叠叠乐》成就覆盖新手引导、关卡通关、技巧操作、社交分享四类每条含ID、名称、描述、图标建议描述用中文口语化带emoji≤15字”。Claude输出achv_001: “新手上路” —— 完成第1关 achv_002: “叠叠乐大师” —— 通关全部10关 achv_003: “磁力达人” —— 连续触发5次磁力场 ⚡……我仅修改了3条描述的emoji把“”换成“✨”更符合游戏美术风格其余全部采用。10个成就从构思到落地耗时11分钟。3.5 数据埋点与AB测试如何用最小成本验证玩法假设一人工作室没有数据团队但必须知道“玩家在哪流失”“哪个按钮点击率高”。我的方案是用150行代码实现全埋点轻量AB测试框架。全埋点设计自动捕获所有Laya.Button点击事件上报element_id按钮ID、page当前场景、timestamp关键节点手动埋点track(level_start, { level: 5 })、track(game_over, { score: 12800, combo: 7 })所有数据通过wx.request发往自建Node.js接口存入MongoDB。AB测试框架// utils/abTest.ts class ABTest { private variants new Mapstring, string[](); private currentVariant new Mapstring, string(); init(experimentId: string, options: string[]) { this.variants.set(experimentId, options); // 用用户openId哈希决定分组保证同一用户始终看到同一版本 const hash md5(wx.getStorageSync(openId)); const index parseInt(hash.substring(0, 4), 16) % options.length; this.currentVariant.set(experimentId, options[index]); } get(experimentId: string): string { return this.currentVariant.get(experimentId) || ; } }应用案例测试“磁力场持续时间”对通关率的影响。A组磁力持续500ms原版B组磁力持续800ms延长版后端按openId哈希分流前端调用abTest.get(magnet_duration)获取参数。7天数据B组通关率提升12.3%但单局时长增加23秒最终选择折中方案650ms。数据看板用Grafana连接MongoDB配置3个核心看板流失漏斗启动 → 首关完成 → 第5关完成 → 分享点击热力各按钮点击次数/曝光次数性能监控首屏时间、FPS分布、内存峰值。每日晨会花5分钟扫一眼决定当天开发重点。4. 常见问题与排查技巧一人工作室高频故障现场还原4.1 微信开发者工具常见故障速查表故障现象根本原因解决方案验证方式真机预览白屏控制台无报错代码中使用了微信未开放的API如navigator.geolocation在app.ts入口处添加全局错误捕获window.addEventListener(error, e { console.error(Global error:, e.error) });真机打开调试模式查看console输出资源加载404但路径确认正确微信开发者工具缓存了旧的project.config.json中的setting.projectname删除项目根目录下project.config.json重新用开发者工具创建项目新建项目后检查project.config.json中appid是否为当前小游戏AppIDwx.createVideoContext在iOS真机黑屏iOS微信客户端对video标签的src属性有严格MIME类型校验将视频文件后缀改为.mp4并在CDN配置Content-Type: video/mp4用Safari真机访问CDN链接确认能直接播放wx.setStorageSync存储超限10MB存储了未压缩的图片Base64字符串改用wx.getFileSystemManager().writeFile存二进制文件wx.setStorageSync只存文件路径查看微信开发者工具“存储”面板确认wx.setStorageSync占用500KB广告加载失败率高40%同一页面创建多个RewardedVideoAd实例全局单例管理广告实例wx.createRewardedVideoAd只调用1次代码中搜索createRewardedVideoAd确保只存在1处调用注意微信开发者工具版本必须与基础库版本匹配。我的固定组合是工具v1.06.2308130 基础库2.28.4。升级工具后务必检查基础库版本不匹配会导致wx.getSystemInfoSync返回空对象。4.2 Canvas性能瓶颈定位三步法当游戏出现卡顿按此顺序排查第一步确认是否主线程阻塞打开微信开发者工具 → “调试器” → “Console” → 输入performance.memory若usedJSHeapSize接近totalJSHeapSize说明内存泄漏此时运行chrome://inspectChrome浏览器连接微信开发者工具用“Memory”面板录制堆快照对比两次快照找泄漏对象。第二步确认是否渲染管线过载在render()函数开头添加const start performance.now(); // ...渲染代码... const end performance.now(); console.log(Render time: ${end - start}ms);若单帧渲染12ms检查是否在render()中做了计算如碰撞检测、是否Canvas尺寸过大超过屏幕2倍、是否未启用硬件加速canvas.style.transform translateZ(0)。第三步确认是否资源加载拖慢使用微信开发者工具“Network”面板过滤media类型查看视频/音频文件加载时间若1s说明CDN未开启Brotli压缩或未配置HTTP/2解决方案将音效转为.mp3比.wav小70%视频用H.264编码分辨率不超过720p。4.3 AI编程典型误用场景与修正方案误用场景危险后果修正方案我的实操记录用AI生成wx.login完整流程AI常忽略wx.checkSession校验导致token过期后无限重定向手写loginService.ts只让AI生成fetchUserInfo()函数体曾因此导致23%用户登录失败修复后留存率18%让AI优化Canvas渲染代码AI可能引入ctx.save()/restore()嵌套造成GPU状态切换开销禁止AI触碰render()函数仅允许优化update()逻辑对比测试AI优化后帧率下降7FPS手动重写提升5FPS用AI生成微信支付回调处理AI常遗漏sign签名验证存在安全漏洞支付回调代码100%手写AI只生成订单状态枚举微信安全扫描曾报出“未校验签名”高危漏洞幸未上线让AI编写ECS组件系统AI生成的组件间通信如eventBus在微信环境下内存泄漏采用LayaAir内置EventDispatcher禁用自研事件总线内存监控显示自研总线72小时后内存增长300MBLayaAir原生方案稳定在80MB4.4 从开发到上线的全流程时间卡点一人工作室最怕时间失控。我的标准流程与实际耗时如下以《弹珠叠叠乐》为例阶段计划耗时实际耗时关键卡点应对策略原型验证可玩Demo3天5天LayaAir物理引擎与微信Canvas兼容性问题放弃Box2D改用自研简易碰撞检测节省2天美术资源接入4天7天美术师交付的PNG含透明通道微信Canvas渲染异常编写Python脚本批量去除Alpha通道自动化处理微信功能联调2天4天wx.shareAppMessage在iOS真机回调丢失增加wx.onShow监听URL参数解析多花1天性能优化3天6天首屏时间超2.5秒红线引入Web Worker处理碰撞预测压缩1.2秒提审准备1天3天审核驳回“未提供隐私政策”紧急制作H5版隐私政策页嵌入小游戏首页上线后热修—2.5小时广告加载失败率突增至65%发现CDN节点故障切备用CDN37分钟恢复总耗时计划13天实际27天。但其中14天是“非开发时间”等美术、等审核、等CDN修复。真正编码时间仅13天印证了一人工作室的核心优势开发效率极高但外部依赖不可控。我的应对是永远为美术/审核/CDN留出200%缓冲时间开发时间则严守计划。5. 运营与变现一人工作室如何用最低成本撬动自然流量5.1 微信小游戏流量密码不是买量而是“社交裂变设计”微信小游戏的天然优势是“分享即安装”。我的策略是把分享行为设计成游戏核心玩法的一部分而非运营附加项。《弹珠叠叠乐》的分享机制每通关3关解锁“好友助力”功能分享链接给好友好友点击后双方各得1个稀有弹珠皮肤助力成功后好友游戏内自动弹出“XX邀请你叠弹珠”通知点击直达第1关分享卡片封面动态生成截取玩家当前最高分截图 “挑战我的记录”文案。数据结果分享率从行业平均12%提升至38%好友点击转化率61%远高于普通链接的22%自然新增用户占比达73%买量成本降低55%。关键技巧分享卡片必须包含“可感知价值”。纯文字“快来玩”无效而“你帮我拿皮肤我帮你涨分数”形成双向利益这才是微信生态的底层逻辑。5.2 变现组合拳广告内购IP衍生的三层结构一人工作室忌单一变现。我的结构是第一层现金流激励视频广告位置通关后、复活时、获取稀有皮肤时定价单次观看≈0.8元CPM 35元占收入62%优化AB测试显示通关后“再看1次得双倍分数”按钮点击率比“关闭”高4.7倍。第二层品牌溢价轻量内购商品弹珠皮肤1元/个、关卡跳过券3元/张设计原则绝不卖“数值优势”只卖“表达个性”。所有皮肤不影响游戏平衡数据付费率2.3%ARPPU 8.7元占收入28%。第三层长期价值IP衍生将弹珠角色设计成Q版形象授权给微信表情商店表情包免费下载但“弹珠叠叠乐”主题表情包需关注公众号领取结果公众号7天增粉1.2万为后续新游戏导流。5.3 一人工作室的可持续节奏如何避免 burnout最后说点掏心窝的话。一人工作室最大的风险不是技术而是精力枯竭。我前三个月每天工作12小时第四个月彻底崩溃代码错误率飙升连续2次提审被拒。现在的节奏是开发日每周3天上午2小时写核心逻辑下午2小时调UI/性能晚上不碰电脑运营日每周2天分析数据、回复用户反馈、优化分享文案全程用手机处理学习日每周1天只读1篇技术文档、试1个新工具如最近在试Vercel Edge Functions做Serverless后端空日每周1天彻底断网爬山或逛展让大脑重置。工具上我用Notion搭建“能量仪表盘”每日记录3项专注时长Forest App同步

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价