- 博客(110)
- 问答 (1)
- 收藏
- 关注
原创 TypeScript 中 void 的一个反直觉问题:为什么声明了 void,还能返回任意类型的值?
在TypeScript中,void作为函数返回类型并不强制禁止函数返回值,而是表示调用者不应依赖返回值。函数类型兼容性规则允许实际返回任意类型的函数赋值给() => void,如const fn: () => void = () => 'hello'合法。但显式声明返回类型时(如function fn(): void),则必须返回undefined,否则报错。这源于TypeScript对函数类型兼容性的设计,旨在支持如forEach等忽略返回值的场景。void与undefined不同:前者
2026-10-28 16:06:40
215
原创 软件开发中值得理解的几个核心设计模式
本文梳理了学习NestJS与软件架构时的核心概念:SOLID原则指导代码设计,降低耦合;IoC与DI实现依赖管理,提升可维护性;策略、工厂、观察者、适配器、Repository等设计模式解决具体问题。强调应结合实际需求灵活应用,避免过度设计,核心目标是让代码在变化中仍易于扩展与维护。
2026-10-26 11:05:52
267
原创 微信 4.x 桌面自动化踩坑实录:从 UIA 到 Qt,为什么能识别窗口却读不到消息?
本文记录了一次基于Python、Vue3、Electron与wxauto4等技术的Windows桌面自动化项目开发历程,因微信客户端版本差异及UIAutomation兼容性问题,导致核心功能(消息读取与实时监听)无法稳定实现。项目暴露了GUI自动化中“能运行≠可生产”的关键误区:窗口识别不等于控件访问,历史消息读取不等于实时监听。最终因跨环境稳定性不足、依赖不可控而暂停。反思指出:应优先验证最小可行链路,设置独立验收标准,避免在未验证前提下投入大量开发成本。
2026-10-14 11:14:38
359
原创 Express 5 异步错误处理实战:为什么不再需要 asyncHandler?从 Promise 到全局异常处理
本文详解Express5对异步错误处理的改进:不再需手动添加asyncHandler或try/catch,因框架可自动捕获路由返回的rejected Promise。但非Promise链的异步操作(如setTimeout)仍可能漏错。通过自定义AppError类与全局错误中间件,实现业务错误与内部异常的分离处理,确保安全响应。强调错误处理应分层设计——业务、请求、进程级错误各司其职,避免盲目套用try/catch。核心结论:框架简化代码,但开发者仍需理解异步传播机制,构建可维护的错误治理体系。
2026-10-11 23:34:51
169
原创 WooCommerce 接入 KPay 后订单完成页不显示订单信息:returnUrl 动态参数问题解决
在WooCommerce接入KPay支付时,支付成功后返回页仅显示不完整订单信息,根源在于KPay插件将returnUrl配置为静态地址,而WooCommerce订单完成页需动态依赖订单ID与OrderKey。问题本质是:静态配置无法承载动态业务数据。解决方法是在生成支付请求时,通过$order->get_checkout_order_received_url()动态构建返回地址,确保跳转后能正确恢复订单上下文。此案例揭示了第三方集成中“数据流理解”比代码修改更重要,提醒开发者:动态业务数据不应作为静
2026-10-01 23:30:21
342
原创 Vue3实现苹果风液态玻璃组件Liquid Glass:可复用液态玻璃容器组件
该优化版Vue3液态玻璃组件通过动态质量分级(high/medium/lite)实现性能平衡:核心区域保留完整RGB位移与色散效果,普通卡片降级为单次位移,大量按钮等重复元素则使用原生backdrop-filter。结合浏览器能力缓存、视口感知降级、尺寸变化合并更新等策略,显著减少重复计算与渲染开销,兼顾视觉表现与性能,适用于复杂UI场景下的高效应用。
2026-09-19 21:45:00
172
原创 Vue3 状态管理设计指南:组件状态、全局状态、URL 状态怎么划分
项目后期维护困难,根源常在于状态所有权不清。核心问题不是技术选型,而是状态管理混乱:同一数据多处存储、同步关系复杂、缺乏唯一数据源。应明确“谁拥有状态”“是否需持久化”“能否计算得出”“谁有最终解释权”,优先使用URL、computed等天然容器,避免冗余副本。减少状态数量、统一数据源、降低同步依赖,才是提升可维护性的关键。真正的状态管理,是“删掉不该存在的状态”。
2026-09-17 14:40:07
218
原创 Nuxt4去掉body中默认的边距
全局 CSS / SCSS全局固定 Head页面级 HeadSEO Metacss: [],app: {head: {},link: [})*,*::before,*::after {html,body {margin: 0;padding: 0;基础配置基本到这里就够用了,后面项目变复杂再继续拆 Reset、变量、字体和主题。
2026-09-09 18:19:30
192
原创 网站SEO优化完整指南:前端开发者必懂的技术SEO
内容核心是从开发者视角梳理技术SEO:包括抓取、收录、渲染、URL规范化、结构化数据、性能等,强调搜索引擎发现和理解的工程问题,以及开发者在这一过程中承担的关键角色。摘要需要压缩到150字以内,保留核心逻辑和关键要点即可。 结构可以这样组织:开头点明技术SEO的定义和任务,然后按链路顺序简要概括关键点,最后落到开发者视角这个结论
2026-09-06 21:00:00
318
原创 从 Page Design 到 System Design:我对 UI/UX 的一次认知变化
讲的是从Page Design向System Design转变的设计思考。要求是根据内容生成不超过150字的摘要。 文章篇幅不短,核心脉络比较清晰:作者早期以为完成页面设计就等于完成了产品设计,但参与开发后发现用户使用的其实是状态、数据、权限、规则、流程,而非页面本身。页面只是系统状态的一个截面。文中反复强调状态设计的重要性,以订单、上传、登录等为例说明真正的复杂度在流程和状态,而不在静态页面。
2026-09-04 21:07:37
239
原创 Wordpress WooCommerce 商品分类页顶部分类导航不显示?一次完整的排查与解决记录
本文记录了一次排查WooCommerce商品分类导航消失问题的全过程。作者发现Shop首页分类正常,但进入具体分类页后导航消失,尤其是其中一个分类始终不显示。经过层层排查:1. 确认是ProductCategories动态区块在分类页未输出;2. 发现问题出在WooCommerceQuery上下文变化,改为CustomQuery后大部分分类恢复;3. 最后发现异常分类因LiteSpeed缓存保留旧版本HTML导致。关键经验:动态区块需注意页面上下文差异,同类页面个别异常应优先怀疑缓存,且浏览器刷新≠清服务器
2026-08-14 19:36:20
342
原创 从 PRD 到可运行应用:我用 GPT、Stitch、Figma 和 Codex 跑通了一套 AI 协同开发流程
本文记录了一个AI协同开发流程的vibecoding实验过程,整合GPT、Stitch、Figma和Codex等工具,形成了一套接近实际生产的开发方法。核心流程包括:先用GPT编写PRD明确需求,用Stitch生成UI初稿,在Figma中优化设计,将设计稿纳入项目目录提供完整上下文,再由Codex制定开发计划并分阶段实现代码,最后人工验收。作者指出,AI开发的关键在于提供清晰的上下文(需求文档、设计稿、技术约束等),而非让AI自由发挥。这套方法虽然前期文档成本较高,但能显著提高开发可控性,同时仍需人工进行技
2026-07-09 18:47:11
375
原创 Node.js fs 常用 API 整理:node:fs/promises、node:fs、fs 到底怎么用
本文总结了Node.js中文件操作的三种主要导入方式及使用场景:1. 推荐首选node:fs/promises的Promise API处理常规文件操作,支持async/await语法;2. 需要文件流、监听或同步方法时使用node:fs;3. 旧代码中的fs写法虽可用但建议新项目改用带node:前缀的明确写法。文章详细对比了不同方式的区别,提供了常用API速查表(如readFile/writeFile/stream处理等),并给出了真实项目中的封装示例。核心建议是:日常开发优先使用Promise版本,特殊场
2026-06-12 10:46:01
326
1
原创 Promise、构造函数和原型链:理解 JavaScript 底层机制的三个入口
本文梳理了JavaScript中Promise、构造函数和原型链三个核心概念。Promise用于处理异步操作的结果流转,通过状态(pending/fulfilled/rejected)管理未来值,解决回调地狱问题;构造函数作为对象工厂,通过new操作符批量创建实例对象;原型链则是属性查找机制,通过__proto__与prototype的链接实现方法共享。三者分别解决不同层面的问题:Promise处理异步流程控制,构造函数负责对象创建,原型链实现继承和属性查找。理解时应从问题场景出发,而非孤立记忆定义,这样才
2026-06-10 00:45:19
225
原创 本地图片正常,部署到 Cloudflare 后 404:一次 WebP 文件名大小写踩坑记录
这次问题的核心不是 Cloudflare 配置,也不是图片格式问题,而是:Windows 本地环境不区分文件名大小写,但 Cloudflare 线上静态资源路径区分大小写。所以本地正常并不代表线上一定正常。代码里的路径大小写真实文件名大小写部署后的文件路径大小写这个问题很小,但很容易浪费时间。尤其是展示站、前端项目、图片资源较多的网站,最好一开始就统一资源命名规范。
2026-05-23 15:55:56
409
原创 微信小程序审核机制解析(2026 实践向总结)
本文解析微信小程序审核机制,指出其本质为自动化风险评估系统而非单纯人工审核。审核流程分为三层模型,核心是自动化检测系统(静态内容扫描、语义意图识别、UI结构识别和行为逻辑检测),通过风险评分模型综合评估后给出审核结果。文章强调审核关注设计意图而非单条规则,不同类目有不同风险阈值,并指出近年审核趋势向AI风控转变。最后提出合规设计原则:广告应是产品副产物而非目标,建议保持功能完整性,避免广告导向结构。理解审核机制关键在于使产品符合平台生态逻辑,而非简单规避规则。
2026-02-23 19:05:01
2468
1
原创 uniCloud 数据库:database() 和 databaseForJQL() 到底有什么区别?
本文对比了uniCloud中两种数据库操作接口的区别:database()是传统MongoDB风格接口,支持原子操作和事务,适合云函数/云对象等写操作场景;而databaseForJQL()采用类似SQL的JQL查询语法,具有自动权限校验和查询优化功能,更适合前端页面数据查询等读操作场景。作者建议:页面列表、筛选等读操作使用JQL接口,云函数事务、原子更新等写操作使用传统接口。两者在小数据量下性能差异不大,但从官方趋势看,JQL是未来更推荐的方式。
2026-02-14 21:49:47
372
原创 前端性能小优化:把串行请求改成 Promise.all 并行请求
本文介绍了一种优化前端数据加载体验的方法:使用Promise.all并行发起多个独立请求,替代传统的串行请求方式。通过并行请求,总等待时间从各请求耗时的相加变为取最大值,显著提升页面响应速度。文章详细对比了串行和并行请求的耗时差异,说明了Promise.all的适用场景(请求间无依赖)和注意事项(全有全无特性),并建议对容错性要求高的场景使用Promise.allSettled。这种优化虽不减少请求次数,但能有效缩短页面可交互时间,属于低风险高性价比的性能优化方案。
2026-02-13 00:36:20
440
原创 UniCloud 本地调试云对象报 Cannot find module ‘uni-id-common‘ 的排查与解决
本地调试云对象报错"uni-id-common"模块找不到,但云端运行正常。排查发现原因是本地Node环境不会自动解析公共模块目录,而云端有特殊机制。解决方案是在云对象的package.json中显式声明依赖路径:"uni-id-common":"file:../common/uni-id-common"。关键区别在于:云端会自动识别公共模块,本地调试必须手动配置依赖。这类问题的核心是开发与生产环境模块解析机制不同,不应假设云端能跑本地就一定能跑。
2026-02-12 17:21:05
773
原创 微信小程序控制台 SharedArrayBuffer 警告:[Deprecation] SharedArrayBuffer will require cross-origin isolation as
微信开发者工具控制台出现的跨域隔离警告可忽略,这是Chrome浏览器对SharedArrayBuffer的安全策略提示,并非小程序代码问题。普通前端项目基本不会使用该API,且小程序环境不受浏览器Header配置限制。该警告属于调试工具噪音,不影响小程序真机运行、审核和线上性能。仅当开发H5项目且主动使用SharedArrayBuffer时才需处理,常规小程序开发可直接无视这条与业务无关的浏览器级提示。
2026-02-10 23:12:23
713
原创 Vue 中 v-if 和 v-show 的区别、性能对比与使用场景(工程实战向)
Vue中v-if和v-show的核心区别与应用场景:v-if是条件渲染,不满足时DOM不存在,适合首屏不显示的场景;v-show是样式控制,始终保留DOM,适合高频切换和状态保留的需求。性能方面,v-if首屏更优但切换成本高,v-show切换性能好但初始渲染负担大。工程建议:默认使用v-show,仅在首屏性能敏感时用v-if。对于重组件可采用首次点击后v-show的懒加载方案。实际选择需权衡渲染机制、性能影响和状态保留需求。
2026-02-09 00:18:47
683
原创 微信小程序如何“判断用户是否分享成功”?一套可控的前端监测方案与踩坑总结
微信小程序分享行为无法直接获取成功状态,本文提出基于页面生命周期的间接判断方案。核心思路是:当用户点击分享时记录时间戳,通过onShow事件计算页面隐藏时长来推断分享行为。关键点包括:1)区分分享状态与处理锁;2)设置合理时间阈值(建议≥1500ms视为成功);3)明确所有判断都是概率性推断。该方案虽无法100%准确,但能提供可靠的业务决策依据,强调应关注用户后续行为而非单纯分享动作。
2026-02-04 16:03:02
1169
原创 基于uniapp开发小程序自定义顶部导航栏状态栏标题栏
本文介绍了在uniapp中获取并计算顶部导航栏高度的方法。通过官方API获取状态栏高度和胶囊按钮信息,计算出标题栏高度,从而自定义导航栏。文章提供了代码示例和封装工具库,包含获取状态栏高度、标题栏高度和总导航栏高度的函数。还针对抖音小程序LOGO遮挡问题给出了解决方案。使用时只需引入封装好的方法即可快速实现自定义导航栏,适用于多种小程序平台。
2026-01-25 22:37:47
601
原创 在响应式网页的开发中使用固定布局、流式布局、弹性布局哪种更好
固定布局的网页有一个固定宽度的容器,内部组件宽度可以是固定像素值或百分比。其容器元素不会移动,无论访客屏幕分辨率如何,看到的网页宽度都相同。现代网页设计中,960 像素宽度较为常见,因为多数用户屏幕分辨率在 1024x768 及以上。
2025-04-05 20:46:21
1038
原创 The `util._extend` API is deprecated. Please use Object.assign() inste;报错解决方案
在使用electron-vite构建的桌面应用进行打包时报错:The `util._extend` API is deprecated. Please use Object.assign() inste,根据报错提示可以看出是使用了废弃的API导致的,然后去社区查找解决方案,不出意外的顺利的找到了解决方案,然后进行了更改,如下图所示。
2025-03-19 15:21:42
6251
原创 index.js:273 Uncaught TypeError: navLink.forEach(...) is not a function
原因:首先我们可以明显的看到获取的DOM元素明显的是一个数组,原型上也有forEach()方法,看上去是不是很合理,但是有趣就有趣在这个获取到的DOM元素数组经过typeof检测其实是一个对象,正是这一点导致数组forEach()方法报错。今天遇到个有点意思的问题,使用forEach()遍历document.querySelectorAll获取的DOM节点时出现的报错,虽然不影响正常使用,但有强迫整的我看不得一点报错。使用for()循环代替forEach()或者使用遍历对象的方法遍历即可。
2023-12-08 02:57:01
865
原创 前端实现主题(深色模式)切换的几种方案
实现思路:首先定义几个我们需要的全局样式变量,之后定义几个集合属性(不同的主题样式),然后将其放在html根元素标签里,再动过js动态的切换这个集合属性就可以实现主题的切换,具体看以下代码;
2023-12-06 16:00:20
9222
3
原创 figma拉伸画板,导致元素变形,一键搞定
老样子废话不多说,直接上解决办法!MAC按住Cmd进行拉伸,windows按住Ctrl进行拉伸即可!
2023-10-17 11:41:58
6021
2
原创 vue3 路由的二次封装
为了使路由便于后续的维护和修改,将路由拆分为多个文件,例如将导航守卫,路由列表,路由模式啊等等将这些不同的功能存放在不同的文件里,最后设置一个主的入口文件将这些拆分好的文件导入进去
2023-03-20 23:11:43
1241
原创 vue中触发更新检测的几种方案
在使用vue开发中大部分人应该都遇见过这种问题即数据明明发生了变化却没有触发视图的更新,这时候你可能各种尝试,比如把生命周期函数mounted()更改为created(),于是数据的重新绑定直接被你提前到new Vue()节点;终于,碰了几次南墙,你想回头。属性,它会对数据进行监控,但对数组的每一项都进行监控的话就会对性能产生影响,但问题又来了数组的更新检测如何触发呢,不要慌官方给出了解决方法,即他们对一些数组的方法进行了重写,我们可以使用这几种方法对数组进行修改从而触发更新检测。
2023-02-02 22:26:04
1120
原创 vue中的data为什么是一个函数
首先组件的data写成一个函数并将数据以函数返回值的形式定义,这样就可以让组件在每次复用的时候返回一份新的data数据,从而使各个组件之间不会相互影响(即当某个组件中的数据发生变化时其他组件里的数据也会跟着发生变化,因为他们共用了一份数据)。csdn文章推荐受影响解决办法10个字10行。csdn文章推荐受影响解决办法10个字10行。csdn文章推荐受影响解决办法10个字10行。csdn文章推荐受影响解决办法10个字10行。csdn文章推荐受影响解决办法10个字10行。
2023-02-02 21:57:22
680
原创 Object.assign()用法和特性
假如源对象的属性值是一个对象的引用,那么它也只指向那个引用;简单来说,就是Object.assign()是对象的静态方法,可以用来复制对象的可枚举属性到目标对象,利用这个特性可以实现对象属性的合并。1.当目标对象和源对象中有重名属性时后面的属性值会覆盖前面的属性值,也就是说拷贝的源对象里的属性值会将目标对象里的重名的属性值覆盖掉;2.拷贝多个源对象时,没重复的属性会按序拷贝到目标对象,同理后面的重复属性也会覆盖前面的属性;简单来说Object.assign()就是一个对象的拷贝方法。以下是vue中的用法。
2022-12-15 21:52:55
960
原创 JSON.parse(JSON.stringify()常见坑
首先这行代码在执行时,他的执行过程就是利用json.stringify()将对象序列化(将对象转为可存储和传输的形式),再通过json.parse()进行反序列化;2.如果json里有RegExp、Error对象,则序列化的结果将只得到空对象 RegExp、Error => {};5.如果json里有对象是由构造函数生成的,则序列化的结果会丢弃对象的 constructor;但是这种深拷贝的方法是有局限性的,他仅仅适用于一般数据的拷贝,例如对象和数组。6.如果对象中存在循环引用的情况也无法实现深拷贝。
2022-12-15 21:27:45
2407
转载 vite和webpack对比
当浏览器请求需要的模块时,再对模块进行编译,这种按需动态编译的模式,极大缩短了编译时间,当项目越大,文件越多时,vite的开发时优势越明显;vite充分利用这点,将开发环境下的模块文件,就作为浏览器要执行的文件,而不是像webpack先打包,交给浏览器执行的文件是打包后的;当需要打包到生产环境时,vite使用传统的rollup进行打包,所以,vite的优势是体现在开发阶段,另外,由于vite使用的是ES Module,所以代码中不可以使用CommonJs;文章引用于简书上的一个大佬,原文链接。
2022-12-14 20:10:21
647
原创 ly-tab插件动态更改高度进行多端适配
可以看出当在其他设配时布局是没有问题的,但切换到ipad时,很明显ly-tab闭关没有自适应从而导致与下面的元素产生了很大的间隙,看过官方文档的小伙伴应该清楚ly-tab虽然后有设置高度的api但那个是设置底部选中状态的底线的高度的,并没有设置整个插件高度的api,起初打算直接更改此组件的高度,但结果不尽人意(或许是我技术不够牛改不动)无效,但可以使用动态计算来解决它!比如当我们想将其定位到顶部时,设置主元素的padding-top值后,在不同的设备会出现不同的结果,而有些结果显然不是我们想要的,如图。
2022-11-18 20:12:08
859
原创 ly-tab插件报错
根据三方文档进行配置后一直报错,搞不懂因为啥,也查不到原因,头都大了,后来开始怀疑是版本问题,进行检查后发现安装的是最新版而三方文档是2.0版本(果然是版本差异问题)根据官方文档进行配置,一定要是官方文档
2022-11-17 21:18:01
786
1
原创 vue-router.esm.js?a12b:2046 Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation
路由重复点击报错解决方法
2022-11-17 17:38:16
5951
1
原创 ✖ 48 problems (48 errors, 0 warnings) 45 errors and 0 warnings potentially fixable with the `--fix
起初此报错以为是eslint导致的,在尝试了关闭eslint或者或者添加新的校验规则后始终无效,以下方法为针对此报错有效的一种就是将vue.config.js里的配置进行修改....
2022-11-16 21:12:23
1769
原创 Can‘t get DOM width or height. Please check dom.clientWidth and dom.clientHeight. They should not be
即100%就会转换成100px,就会导致图表过小或者干脆显示不出来得问题,但是用内敛样式即可完美解决此问题。
2022-10-28 19:17:49
2398
可以自定义安装路径的谷歌浏览器
2022-08-16
js中for循环var声明的变量最后一次不输出
2022-08-07
uniapp uni.getUserInfo(OBJECT) API 不兼容H5
2022-08-25
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅