
文章分类:新闻资讯 发布时间:2026-10-05 原文作者:小程序开发 阅读( )

我见过太多小程序项目,代码写到一半就乱成一锅粥。页面逻辑、请求封装、工具函数全堆在一起,改一个需求就像在雷区里跳舞。这问题的根源,往往就是utils没做好。很多人觉得utils就是放几个格式化函数的地方,随便写写就行。但等你项目跑到两万行代码的时候,你会发现,好的utils封装不是锦上添花,而是救命的。
先说说最基础的时间格式化。微信小程序里`new Date()`在iOS上解析`"2024-01-01 10:00:00"`这种格式会直接报错,必须替换成`"2024/01/01 10:00:00"`。我见过不少项目在页面上写死这个替换逻辑,每个页面复制一遍。正确的做法是封装一个`formatTime`,内部统一处理兼容性,返回你想要的格式。再把`dayjs`这种轻量库引进来,体积控制在2KB左右,但能解决所有时间计算问题。别自己写日期计算,边界条件多到你想哭。
请求封装是utils里最值得下功夫的部分。每个项目都要跟后端打交道,登录态过期、token刷新、错误提示、loading控制,这些逻辑如果每个页面都写一遍,那真是灾难。我在utils里放一个`request`方法,统一处理baseURL、超时时间、请求拦截、响应拦截。特别是错误码处理,后端返回`401`就自动跳登录页,返回`500`就弹toast提示。页面里只需要调`request.get('/api/list', params)`,其他什么都不用管。这样改起来也方便,后端接口结构变了,改一个地方就行。
缓存封装容易被忽视,但实际开发中特别烦。微信小程序的`wx.setStorageSync`只能存字符串,存对象得自己`JSON.stringify`。而且缓存过期、版本管理、命名冲突,这些问题如果不封装,后期维护成本极高。我的做法是封装一个`storage`对象,支持`set(key, value, expire)`和`get(key)`,内部自动做序列化和过期判断,还能在key前面加项目前缀,防止不同环境的数据串了。这样页面里存用户信息、配置参数,一行代码搞定,还能统一清理。
防抖和节流也是高频使用的工具。搜索框输入、按钮连续点击、滚动加载更多,这些场景都需要处理。我见过有人直接在页面的`bindinput`里写定时器,页面销毁了定时器还在跑,导致setData报错。封装一个`debounce`和`throttle`函数,在utils里统一管理定时器,页面只用调用`debounce(this.search, 500)`,不用关心具体的实现细节。特别是按钮防重复提交,这个功能几乎每个表单页面都需要,封装好了能省不少事。
路由跳转的封装很多人没意识到。微信小程序的`wx.navigateTo`的url要写全路径,还要带参数,参数还得encodeURIComponent。页面多了以后,改一个路径就要全局搜索替换,特别容易漏。我在utils里维护一个路由表,把所有的页面路径和参数类型集中管理。跳转的时候只调用`router.push('orderDetail', { id: 123 })`,内部自动拼接路径和序列化参数。这样页面路径变了,改一处就行,再也不会出现找不到页面的情况。
还有一个容易忽视的地方——表单校验。小程序里表单验证的代码写起来特别啰嗦,每个输入框都要判断非空、格式、长度。我封装了一个`validator`对象,支持链式调用和正则匹配。比如`validator.check('phone', '138000').required().isMobile()`,返回错误信息或空字符串。这样页面上只需要遍历表单字段,统一调用校验方法,错误提示也统一格式。后端返回的字段错误也能映射到对应输入框上,体验好太多。
说说工具函数的组织方式。很多人喜欢把所有函数都塞进一个`utils.js`文件里,几百行代码看着就头疼。我的习惯是分模块管理,`format.js`放格式化函数,`request.js`放网络请求,`storage.js`放缓存操作,`router.js`放路由管理,`validator.js`放校验逻辑。每个模块只负责一类事情,互不干扰。再用`module.exports`统一导出,页面引用的时候`const { formatTime } = require('../../utils/format')`,清晰明了。如果项目再大一点,可以考虑用ES6的`import`语法,配合构建工具做tree-shaking,只打包用到的函数。
我见过太多团队在utils上偷懒,结果后期维护成本翻倍。好的utils封装不是炫技,而是把重复的逻辑收拢到一处,让页面代码专注在业务展示上。你花两天时间把utils体系搭好,后面两个月开发效率至少提升50%。而且随着项目迭代,utils会越来越完善,新成员上手也快。别觉得这是浪费时间,这恰恰是让你从“码农”变成“工程师”的关键一步。