成长记录#002|2025-11
原始记录:
2025-11-01:
-
【修复】 针对需要退出页面重进,配置项才生效的问题,进行了修复。具体方法为:在
mqttConnect函数体内,每次调用都重新从缓存中读取最新值,弃用原本的updateDeviceInfo逻辑,将其改为仅控制popup弹出层。 -
【修改】 修改了配置项的数据结构,将一维数组改为对象,方便
mqttConnect函数的引用。 -
【修复】 通过在逻辑中增加返回值,并将其中的异步读缓存改为同步。在判断
deviceInfo为空对象之后,可以返回true,阻止mqttConnect函数执行。有效避免需要将对象赋值为null的问题,同时解决了为空数组时仍然可以连接MQTT服务器的BUG。值得注意的是,
wx.getStorage是异步的,会导致直接得到错误的返回值初始值。所以此时应该是同步的。下面指出一种判断对象为空的办法:
1
isEmpty = Object.values(data).some(item => !item || !item.trim());
当数组为空字符串,空格,
0,null,undefined时,都会返回true。原理为:通过
Object.values()将所有属性值提出,拼成数组。然后用some进行判断,当得到第一个符合条件(元素为空,或者去除空格后元素为空)的值,就会返回对它取反的值,也就是true。
2025-11-02:
-
【更新】 通过学习
mqtt.min.js的用法,通过调用mqttClient.on('error', (error) => { },实现了对连接失败状态的反馈。 -
【更新】 进行了部分函数、常量、配置项的模块化,将代码从660行缩减到440行。
-
【更新】 在
setDeviceState函数内集成了对按钮外显文本的更新。当设备连接成功状态更新时,自动将按钮文本替换为‘断开’。但断开连接功能还未实装。为什么在这个函数内更新,而不是在
mqttConnect呢?因为MQTT连接是通过异步回调实现的,会先一步return错误的值而不是根据“是否连接上”这一结果进行返回。 -
【更新】 在所有WXML引用的
for循环中加入了wx:key。用以提高性能。 -
【更新】 重写了
deviceInfo的数据结构,并将WXML中的设备状态/增氧设备状态指示卡片改为循环结构,缩短代码长度。
2025-11-03:
今天因为下午有课,故更新内容较少。
- 【更新】 新增了断开连接功能。当连接成功后再按下按钮,可以结束连接并回到’未连接‘状态。
- 【BUG】 在退出连接时,可以触发对应的函数,但无法通过
.end()方法退出连接。也无法监听到断开连接的状态。
2025-11-04:
-
下午焊完板子,尝试了很多办法,包括更
mqtt.min.js为mqtt.js;从3.0.0到4.2.0,更换能支持的版本;尝试监听end,close,offline事件;尝试在执行后手动关闭socket连接,均无效。此外,在bing上并没有查到很多类似的案例,唯一有相似情况且有回复的如下:uni-app mqtt.js在H5可以正常,但是在APP和微信小程序调用end关闭mqtt不正常晚上将继续根据上面的论坛内容尝试修复。
2025-11-05:
- 【更新】 小程序新增了用于发送
on和off命令的函数,在消息监听方法中,加入了对启用成功与否所返回标志位的读取和判断,同时在按钮处理函数中,加入了超时判断。实现了用户未连接设备/连接设备但设备编号错误等情况的灵活反馈。 - 【更新】 修改了ESP8266的部分代码。在串口部分,新增了对
FLAG_FRAME标志位帧的读取,当2560执行成功后会向8266发送指令,8266根据指令判断向云平台推送的消息并发出onSuccess或者offSuccess的消息。小程序根据收到的消息,判断是否启动成功/关闭成功,否则进入超时状态。 - 【更新】 修改了2560的部分代码,使其在执行开关指令之后能够发送标志位给8266。
2025-11-06:
-
【更新】 将原来的
mqttConnect函数模块化,进一步缩短主代码长度。在使封装过程中,出现了由于MQTT连接为异步过程,返回对象为
undefined的情况。对此,学习了Promise的用法。简单概括为,先
return new Promise((resolve, reject) => {},new一个Promise容器,在结果处resolve()或者reject()然后,主函数里,在需要等待的函数那里,先用
async声明此函数返回Promise容器,在声明的函数用await修饰,再利用JS的异常捕获机制try/catch接收reject。 -
【BUG】 值得注意的是,MQTT连接并未在退出页面后关闭,这个问题需要解决。
2025-11-07:
- 【更新】 优化了部分元素的样式,增大了按钮的字体。
- 【更新】 将原本模拟数据接收的定时触发的代码封装为
pushCurrentData函数,通过回调的办法,在client收到传感器数据时自动调用,并传入收到的data,实现数据和图表实时更新。至此,基本完成了小程序端的所有功能。 - 【BUG】 尚未解决MQTT连接在退出页面后无法关闭,仍然接收来自云平台的数据的问题。
2025-11-08:
-
针对增氧启动功能进行了测试,小程序端表现良好。接下来仅需要针对单片机代码做出修改。
-
【更新】 通过
hover-class,给index页面的微应用增加了点击态。采取的办法如下1
2
3
4.tool-card-pressed {
transform: scale(0.97); /* 控制变换 */
opacity: 0.8; /* 控制透明度 */
} -
【更新】 烧录了2560的代码,并无明显异常,能够实现预期的功能。
-
【更新】 删除了8266回调函数中用于测试的代码,即收到
on/off,延时3秒自动发送onSuccess/offSuccess。改为由2560串口向8266发送0x0A/0x0B指令码,然后根据收到的指令码发送。 -
【修改】 小程序启用设备超时由5秒改为8秒。
-
【更新】 在小程序引入了
marked.min.js组件,使项目介绍页面可以渲染markdown文本。 -
【更新】 在
mqttHelper.js里加入了end方法。虽然无法彻底断开连接,触发end或者off回调,但可以终止消息的接收。 -
【更新】 在微信开发者平台完善了小程序信息,并上线了体验版,添加了几个体验用户。
2025-11-09:
- 【更新】 完成了项目介绍和使用指南的文字部分。并上传至体验版。
- 购买了
electro-dragon.site域名3年。并通过七牛云初步了解了图床和域名的使用,成功配置了HTTP协议下的图床,并成功访问。只是微信不支持HTTP协议,后续可能无法通过这个访问。另外,小程序访问HTTPS或许还需要额外的配置。
2025-11-10:
- 进行了paypal卡号绑定,学会了
cloudflare的用法,成功将阿里云的域名代理至cloudflare,并使用PicList成功上传图片到对应的bucket,更新为https协议,成功在微信小程序中引用这些图片,将代码包缩小到1026kb。
2025-11-11:
- 在
cloudflare上新建了一个桶,用来存储博客网站素材。重新启动博客网站建站计划。经过微信小程序的捶打,对CSS的理解更加深入,配置一些样式也更加轻松。 - 学习了ID选择器的用法,配合类选择器可以达到不错的效果。
2025-11-12:
-
想明白了小程序状态切换的BUG的产生原因。
现象:在链接设备成功之后,尝试启用增氧设备。启用成功后,快速点击“关闭”按钮,如果顺利关闭,且上述过程在8秒内完成,就会又进入错误的“链接失败”状态。
原因:在处理按钮按下的函数内,写了一个
setTimeOut函数,预想的功能是,在一定时间后根据是否返回链接成功的状态,判断是否将状态切换为“连接失败”。但是如果用户操作较快,在连接后又按了关闭按钮,就会导致这个函数执行时,错误地读取状态,认为在8秒内没有启动设备。解法:将定时器赋给一个变量,在启动设备成功时清除定时器。
-
【修复】 修复了启动设备成功后点击关闭设备,会出现“启用失败”这一错误状态的问题。
-
进一步修改了一些博客页面的样式,初步了解了
hexo框架下的博客页面创建流程,补全了tags、categories等页面
2025-11-13:
- 今天下午上完课,回宿舍充电,然后理发去了。
- 晚上得知项目创新点修改,思考了一下可能的实现方案。
- 尝试修改加载动画,引入gif图片。但还没搞清楚pug和styl代码要如何修改。
2025-11-14:
- 发现其实styl和css是类似的。尝试修改了一些样式。
- 成功引入了gif图片,更换了默认的加载样式。但对于文字有显示的bug,总会在加载结束之后才缓慢消失。
- 【BUG】 当同时引入加载样式和pace之后,会出现加载样式丢失的问题。
- 尝试引入自定义图片作为进度条,但是似乎并没有什么效果,可能是哪里出问题了。
2025-11-15:
-
下载
pace,js,将pace.pug引用的CDN替换,并找到核心部分(控制百分比修改的样式)源代码。替换为如下语句:1
transform = "inset(0 " + (100 - this.progress) + "% 0 0)";
因为不需要 transform,注释掉下面语句:
1
2
3
4
5_ref2 = ['webkitTransform', 'msTransform', 'transform'];
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
key = _ref2[_j];
el.children[0].style[key] = transform;
}实现了遮罩加载的效果。
但由于这效果是异步的,所以没法和页面加载的 show 效果一同离场。
2025-11-16:
- 下午写了一部分信号与系统的作业。
- 晚上在研究
butterfly的preloader。找到了配置进场动画时长和关键帧的代码。但是总是设计不出想要的样式。重新设计了背景图,但不太好看。
2025-11-17:
- 完成微信小程序代码的拆分,并研究了git,然后成功将代码push到GitHub repository上。并在GPT的帮助下学了一些表达,写了一份全英文的README.md。
- 对于
preloader页面设计有了一点新想法。为了避免图片拉伸的问题。背景依旧用纯色的,然后把刻晴立绘固定在某个位置,就可以了。
2025-11-18:
- 继续优化了一下README.md。新增了一个仓库用来放profile。在编写profile的时候学会了使用shields.io。
- 预习了一下传感器原理部分。但是没有重点还是难以下手。
- 遇到了 cloudflare 崩溃的罕见情况。
2025-11-19:
-
终于把样式改到了我比较理想的情况。回顾一下,具体操作如下:
-
换掉原来的
pace.jsCDN 源,改为本地引入。在pace.js内,修改下面部分代码1
2
3
4
5
6// 将body替换为.image-container,以使注入的pace元素收到.image-container控制,能随着图片够同时淡出
target: 'body',
elements: {
checkInterval: 100,
selectors: ['body']
},1
2//意图实现遮罩加载进度条,故将原来的transform值替换为下面的内容,删掉transform相关的循环,由下面语句直接赋值
transform = "inset(0 " + (100 - this.progress) + "% 0 0)"; -
抄了一种网上的
pace样式,并做出一点修改,调整相关的距离。例如删掉了下面的代码,以取消加载完成动画:1
2
3
4
5.pace.pace-inactive {
opacity: 0;
transition: .5s;
bottom: 35vh;
} -
照着
fullpage-loading,抄了一版image-loading,修改了元素结构如下,并把原来.loading-bg的50%宽度改为100,运动方向改为向下。1
2
3
4#image-loading-box
.loading-bg
.image-container
img.load-image(src=url_for(loadimage) alt='') -
在
function.styl里修改对应动画样式,包含入场动画持续时间、关键帧、卡片出现动画样式等。整体上让动画更慢,同时契合preloader-bg的移动。 -
在注入的
css内,修改了preloader-bg的颜色。
-
2025-11-20:
-
花费一番努力,把blog的仓库代理到
cloudflare了。其实操作很简单,凭借直觉就可以完成。cloudflare的代理还可以实现自动拉取仓库的更新,然后再转发,这非常好。还解决了使用
GitHub Pages在国内无法裸连的问题。 -
上传了一些图片和字体到R2存储桶,解决了存在本地加载较慢的问题。
-
添加了友链页面的配置文件
-
【问题】 目前不推荐手机使用,因为加载页面是给PC设计的,之后可能需要针对手机做一些适配。
2025-11-21:
- 今天做了信号与系统实验,我们小组是最快做完的
- 对手机/窄屏移动设备进行了适配。在宽度小于1000px时,将不显示刻晴图片,只显示pace加载动画。
- 【问题】 加载字体时,由于使用的域名是
blog.material,这与博客网站域名冲突,触发了CORS。所以还需要进一步的适配。
2025-11-22:
-
针对移动端进一步适配了
preloader效果:当页面宽度小于1000px和700px,分别对应缩小pace大小,然后取消刻晴立绘显示。 -
通过在
cloudflare配置CORS、用pip install fonttools brotli引入fonttools库,然后用pyftsubset实现子集化,把字体文件从3M压缩到650kb。下面是使用的代码:
1
2pyftsubset {字体路径} --text-file={精简字符集路径} --output-file={输出文件路径} --flavor={转换后的格式}
# 输出文件路径应当精确到要输出的文件名,例如 D:\pycharm\font-manage\target\gi-font.woff2 -
整理了一些微信小程序的踩坑记录,发布了第一篇文章,旨在介绍一些用得上的JS技巧。
2025-11-23:
- 优化了不同宽度的屏幕下标题的适配情况。设置了更多的挡位。分别是700px以内,700px-1000px的范围。以及其他。
- 因为中文问号在字库内缺失,所以无法显示,现在已经修复了这个问题,在字库内添加中文问号,重新制作
subset。 - 制作了网站的
favicon,并完成了配置。 - 增加了一句
subtitle,配置了打字效果。 - 花了很多时间在CSS微调、字体压缩、加载动画(Pace.js + 刻晴立绘)上。虽然这体现了匠心,但在商业或大型工程中,这可能被视为“优先级管理不当”。未来需要学会权衡ROI(投入产出比),有时候“能用”也是一种智慧。
2025-11-24:
- 复习好无聊哦。可不复习也不行,但是复习了也不一定争得过他们呢。
- 让GPT和DeepSeek帮忙润色了一下我的About文档。
- 发现字库缺失中文字“嗯”,明天修复。
- 更新了文章“好吃的JS技巧”。
2025-11-25:
- 传感器考完了。。。冒出了1个很明显的错误,我居然记错线性度的定义了,居然以为是越靠近1越好。就导致填空题错了。
- 还有好多事。。。
- 新增了一篇关于微信小程序开发的博文,写了一点内容。
- 重新做了字体子集,上传到R2。
- 正在考虑小程序上线的事情,但是还没有分包,包体有点大,超出限制。正在尝试重新整理项目结构。
2025-11-26:
- 【更新】 完成了小程序分包,缩小主包体积,通过了代码检查对主包的要求。
- 【更新】 对小程序的README文档进行了更新,加入了Features部分对使用R2服务的描述。
- 字库缺失“渲染”的“渲”,已添加。
- 完成了小程序备案的申请。
2025-11-27:
- 小程序备案被驳回了,由于身份证不清晰和小程序名称与商标冲突。
- 做出了对应的修改,并重新上传。
- 尝试用nano banana模型或者GPT绘制小程序头像,发现AI味太重,画图像抽奖,不好。
- 做实验还挺快的。不过还得是大家一起思考力量比较大。也是,有时候一个人看不出问题。但是找得到信任的人也好难。
2025-11-28:
- 打算了解一下后端了,但是还没有付诸实践。
- 继续了解了一下考研的方向,我如果想去上海的话,考上海大学可能会是一个不错的选择。但是目前还不知道这所学校的实力如何。
- 小程序备案又被驳回了,计划明天问一下客服,应当怎么命名,通过的可能性才会大一些。
2025-11-29:
- 将名称改为“可爱银龙的轻量化工具集”,小程序备案初审通过了。
- 博客网站新增了一篇文章,用于介绍小程序备案的常见问题。
- 和家里沟通了一下,这是每天都进行的。家里依旧很支持我的想法,我得进一步付诸实践了。
- 明天需要评估一下考上海大学的难度,以及考西南交大的目的。
- 明天还需要重写一下项目创新点。
2025-11-29:
- 重新写了一下项目的创新点,在Ai的帮助下,学习了利用位图,把图形二值化映射为矩阵中离散点,然后通过点的数量求和,能够得知大约面积的方法。
- 还是不知道怎么判断一个大学的研究生专业的好坏。感觉上大的081000和我专业课用书重合度很高,只有电路是不相同的。
- 大概看了一下量子力学的整体框架,虽然还是有很多地方看不明白。但是翻书应该能快一些。
2025-11-30:
- 继续研究了一下考研院校。
处理过程:
2025.11.01 - 11.04:MQTT连接逻辑重构与配置生效问题
- 遇到问题 :配置项修改后必须退出页面重进才生效;异步读取缓存导致连接逻辑判断失效;对象为空时仍然可以触发MQTT连接;断开连接功能无法正常实现。
- 如何解决 :
- 在
mqttConnect函数中每次调用时重新从缓存读取配置,废弃原有的更新逻辑。 - 将配置数据结构由数组改为对象,便于按字段读取。
- 将缓存读取由异步改为同步,并在检测为空对象时直接返回中断连接流程。
- 尝试监听
end/close/offline事件及更换不同版本mqtt.js排查断连问题。
- 在
- 解决原理 :
- 异步函数会先返回初始值,导致判断失效,同步读取可以保证逻辑时序正确。
Object.values + some可以快速检测对象中是否存在无效字段。
- 总结复用 :配置类数据应避免缓存滞留,关键路径中应实时读取;涉及连接状态的逻辑必须保证时序一致性;对于第三方库问题,应优先验证版本与运行环境兼容性,而不是局限于单点修改。
2025.11.05 - 11.08:设备控制链路打通与状态反馈机制
- 遇到问题 :设备启停缺乏明确反馈;用户操作与设备实际状态不同步;无法判断指令是否执行成功。
- 如何解决 :
- 在小程序中增加
on/off指令发送函数,并在监听中解析返回标志位。 - 在ESP8266与2560之间增加标志位通信,由硬件侧返回执行结果。
- 在前端加入超时机制,对异常情况进行兜底提示。
- 将按钮状态更新逻辑放入状态回调函数中,而非连接函数。
- 在小程序中增加
- 解决原理 :通过建立“请求—执行—反馈”闭环链路,使状态由设备端驱动,而非前端假设。
- 总结复用 :任何涉及硬件控制的系统都应具备明确的状态回传机制;前端状态不应基于操作行为,而应基于实际反馈;超时机制是处理不可靠链路的必要补充。
2025.11.06 - 11.07:异步流程控制与Promise引入
- 遇到问题 :MQTT连接为异步过程,函数返回值无法反映真实连接状态;模块化过程中出现返回
undefined问题。 - 如何解决 :
- 使用
Promise封装MQTT连接过程,在成功或失败时分别调用resolve/reject。 - 在调用侧使用
async/await配合try/catch处理结果。
- 使用
- 解决原理 :
Promise提供状态容器,使异步操作可以以同步形式编排执行流程。 - 总结复用 :所有需要“等待结果”的异步操作都应显式封装为Promise;模块化时必须明确函数的返回契约,否则容易出现隐式错误。
2025.11.07 - 11.08:数据驱动与界面联动优化
- 遇到问题 :传感器数据更新依赖定时器,无法做到实时响应;界面代码冗余,维护成本高。
- 如何解决 :
- 将数据处理封装为
pushCurrentData函数,通过MQTT回调触发更新。 - 重构WXML结构,使用循环渲染统一设备状态卡片。
- 在循环中加入
wx:key优化渲染性能。
- 将数据处理封装为
- 总结复用 :应优先采用事件驱动而非轮询机制;结构重复的UI应抽象为数据驱动渲染;性能优化应从渲染机制入手,而非单纯减少代码量。
2025.11.08 - 11.12:交互细节完善与状态竞争问题
- 遇到问题 :快速操作导致状态错乱(定时器误判);用户操作体验缺乏反馈;按钮状态与实际流程存在竞争关系。
- 如何解决 :
- 为按钮增加
hover-class实现点击态反馈。 - 在启用设备时设置定时器,并在成功回调中清除定时器,避免误判。
- 延长超时时间,提高容错性。
- 为按钮增加
- 解决原理 :通过控制定时器生命周期,避免异步任务对共享状态的错误覆盖。
- 总结复用 :涉及异步+用户操作的场景,本质是“状态竞争问题”;所有定时器都应可控、可清理;用户体验优化应覆盖视觉反馈与逻辑反馈两个层面。
2025.11.08 - 11.10:工程完善与发布准备
- 遇到问题 :资源加载与体积限制;小程序对协议与资源有额外限制;需要上线测试环境。
- 如何解决 :
- 引入
marked.min.js支持Markdown渲染。 - 使用图床与CDN(R2 + cloudflare)托管资源并升级为HTTPS。
- 精简代码包体积并发布体验版。
- 引入
- 总结复用 :前端工程不仅是功能实现,还包括资源管理与部署策略;协议(HTTP/HTTPS)在不同平台有严格限制,需要提前规划。
2025.11.11 - 11.15:博客系统与加载动画机制探索
- 遇到问题 :加载动画效果与页面渲染不同步;默认加载样式不满足需求;多种加载机制冲突。
- 如何解决 :
- 本地化
pace.js并修改核心进度计算逻辑。 - 重写加载DOM结构,引入自定义图片与遮罩动画。
- 调整CSS动画参数与关键帧,使整体节奏统一。
- 本地化
- 解决原理 :通过直接修改库源码与渲染逻辑,实现对加载过程的完全控制。
- 总结复用 :当第三方库无法满足需求时,可以通过“本地化+裁剪源码”方式深度定制;动画系统本质是时间函数与状态同步问题。
2025.11.16 - 11.20:样式系统重构与部署链路打通
- 遇到问题 :动画效果难以统一;GitHub Pages访问受限;本地资源加载效率低。
- 如何解决 :
- 重构preloader动画体系,统一动画节奏与视觉风格。
- 使用cloudflare代理GitHub仓库,实现加速访问。
- 将图片与字体迁移至R2存储桶。
- 总结复用 :前端性能问题往往来源于资源分发;CDN与代理是基础设施级优化手段;视觉系统需要统一设计语言,而非零散调整。
2025.11.21 - 11.23:多端适配与字体优化
- 遇到问题 :移动端显示异常;字体文件体积过大;跨域加载失败(CORS)。
- 如何解决 :
- 针对不同屏幕宽度设置断点,动态调整UI元素。
- 使用
pyftsubset对字体进行子集化压缩。 - 在cloudflare中配置CORS策略解决跨域问题。
- 解决原理 :字体子集化通过仅保留使用字符,大幅降低资源体积。
- 总结复用 :移动端适配应在设计阶段考虑;字体优化是前端性能优化的重要部分;跨域问题本质是浏览器安全策略,需要从服务端配置解决。
2025.11.24 - 11.26:工程收尾与体积控制
- 遇到问题 :小程序包体超限;字体缺字影响显示;文档不完善。
- 如何解决 :
- 实现小程序分包,降低主包体积。
- 修复字体缺失字符并重新生成子集。
- 完善README与功能说明。
- 总结复用 :工程收尾阶段重点在“可交付性”;体积控制需要结构优化而非简单删除;文档是项目的重要组成部分。
2025.11.27 - 11.30:备案流程与考研方向探索
- 遇到问题 :小程序备案被驳回;命名与材料不符合规范;对考研与技术方向存在不确定性。
- 如何解决 :
- 修改身份证材料与小程序名称,重新提交审核。
- 调整命名策略以规避商标冲突。
- 调研院校与专业方向,并尝试构思项目创新点。
- 总结复用 :非技术流程同样影响项目推进;合规性问题需要反复试错与经验积累;技术成长与方向选择需要长期探索,而非短期决策。
归纳总结:
近期我围绕一套基于 MQTT 的物联网小程序与个人博客进行了持续迭代,逐步打通了设备控制链路,完善了前端状态管理,并推进了资源部署与上线流程。
在这一过程中,我逐步理清了一些关键实践路径:
例如围绕 MQTT 异步通信,引入 Promise + async/await 重构流程控制;通过“设备执行—标志位回传—前端判定”的链路设计,使状态更新从“前端驱动”转为“硬件反馈驱动”;在数据处理上,将定时轮询改为基于回调的事件驱动;在工程层面,尝试了小程序分包、R2 + cloudflare 资源托管、字体子集化(pyftsubset)等优化手段。同时,在界面与体验方面,也实践了 hover-class 交互反馈、CSS 动画与 pace.js 加载机制的定制,以及多端适配与 CORS 问题处理。
