修改全局过滤器后微信开发者工具不刷新,是因为uni-app小程序端不支持Vue.filter热更新;需改用页面内methods、导出纯函数或显式导入调用,并清除缓存、重启工具、真机完全退出重进。

uni-app 全局过滤器修改后微信开发者工具不刷新
改了 filters 或 app.config.globalProperties 挂的全局方法,保存后微信开发者工具没反应——这不是你代码写错了,是编译链根本没把变更推过去。uni-app 的过滤器(尤其是 Vue 2 风格的 Vue.filter)在小程序平台不参与热重载依赖追踪,HBuilder 修改文件后不会触发对应 JS 模块的重新打包和注入。
公众号运营:文章发布至草稿、样式封面、评论与用户管理、数据统计等。用户要求将 Markdown 发送到公众号草稿、查看阅读量统计或类似后台操作时,使用本技能。
为什么 Vue.filter 修改不触发热更新
uni-app 小程序端底层不使用 Vue 的 runtime compiler,而是将模板提前编译为 WXML + JS 逻辑,Vue.filter 注册的函数只在编译时被静态提取、内联或丢弃,运行时并不作为响应式依赖存在。所以:
- 修改 main.js 或 common/filters.js 中的 filter 定义,HBuilder 不会标记相关页面文件为“需重编译”
- 微信开发者工具收到的仍是旧的 pages/xxx/xxx.js,里面调用的还是上一轮编译时固化进去的 filter 函数体
- 控制台看不到编译日志,也不报错,就是“静默失效”
哪些写法能绕过这个限制
想让过滤器变更立刻生效,必须让它进入模块依赖图:
- 把过滤器逻辑直接写进页面 .vue 的 methods 或 computed 里,这样保存页面文件就能触发重编译
- 用 export function formatTime(...) 替代 Vue.filter('time', ...),然后在模板中显式调用 {{ formatTime(date) }}
- 在 utils/ 下写纯函数,再通过 import { formatTime } from '@/utils/filter' 引入使用,确保 import 路径没被 HBuilder 缓存(可删 unpackage/ 目录强制重建)
- 不要用 Object.defineProperty(Vue.prototype, '$format', ...),小程序端 Vue.prototype 不可写,且同样不触发热更
真机调试时更隐蔽的缓存问题
即使开发者工具显示刷新了,真机预览仍可能用旧 filter,因为:
- 微信小程序冷启动才拉新包,热启动复用内存中的 JS 上下文,Vue.filter 注册只执行一次
- uni.getUpdateManager() 不管 filter 这种运行时逻辑,只管整包资源更新
- 如果你没改 manifest.json 的 versionCode,连整包更新都不会触发
所以每次改完过滤器,务必:
- 清空微信开发者工具缓存(设置 → 清除缓存 → 全部清除)
- 关闭并重启开发者工具
- 真机上完全退出小程序(不是切后台),再重新打开


















