uni-app中filters导致白屏的根本原因是Vue 2响应式机制在App端(尤其iOS)被绕过,filter内调用未声明字段、H5专属API或解析大文本会静默中断JS线程,使Vue实例无法挂载。

uni-app里用filters导致白屏,根本不是语法错
白屏时控制台没报错,filters却让页面卡在挂载前——这不是你写错了函数名,而是 Vue 2 的响应式机制在 uni-app 的 App 端(尤其是 iOS)里被绕过了。uni-app 默认使用 Vue 2,而 filters 是模板编译期处理的语法糖,一旦 filter 函数内部触发了未声明的响应式字段访问、或调用了只在 H5 存在的 API(比如 window.encodeURIComponent),JS 线程就会静默中断,Vue 实例根本没挂载,自然一片白。
常见错误现象:
-
onLaunch里注册了全局 filter,但 filter 内部用了uni.getSystemInfoSync().model(iOS 16+ 已废弃,应为deviceModel) - filter 函数里直接
JSON.parse(str)解析 MB 级字符串,主线程卡死 - filter 被用在 v-if 或 v-for 的条件表达式里,而返回值是 undefined,后续逻辑链式调用崩溃
删掉filters比修它更安全
uni-app 官方文档早已不推荐在新项目中使用 filters,尤其在 App 和小程序平台。它无法被 Tree-shaking,会增加主包体积;更关键的是,它在非 H5 平台缺乏运行时校验,出错即白屏,且不抛堆栈。
实操建议:
- 把所有
filters拆成普通工具函数,放在utils/format.js里,用import { formatTime } from '@/utils/format'显式调用 - 模板中改写:
{{ formatTime(item.time) }},而不是{{ item.time | formatTime }} - 如果必须保留 filter 形式(如历史项目),确保 filter 函数体极简:不调 API、不解析大文本、不访问未定义属性、不依赖
window或document - 在 App.vue 的
onLaunch开头加console.log('filters loaded')—— 如果这句都没输出,说明 filter 注册阶段就失败了,得查 import 路径或函数是否被 webpack 误删
Vue 3 项目里filters压根不存在
如果你的 uni-app 已升级到 Vue 3(通过 vueVersion: '3' 配置),那 filters 就是非法语法。HBuilderX 编译时不会报错,但真机运行时会因模板编译失败直接白屏,且控制台无提示。
验证方式:
- 检查
vue.config.js或manifest.json是否含"vueVersion": "3" - 搜索项目里所有
filters:和|符号,全部替换为方法调用 - Vue 3 中等价写法是用
computed或useXXX()组合式函数封装格式逻辑,而非模板 filter
白屏后怎么快速定位是不是filters惹的祸
别猜,直接隔离。这是最省时间的办法:
- 注释掉
main.js里所有Vue.filter(...)和app.config.globalProperties.$filters = {...} - 清空
pages.json中所有页面的template,只留一个<view>test</view> - 重新打包运行,如果白屏消失,再逐个解注释 filter,配合真机 console.log 找出问题函数
- 特别注意:某些 UI 库(如 uView)自带 filter,它们可能在 App 端引用了 H5 专属方法,要检查
node_modules/uview-ui/libs/function/filter.js类似路径
真正麻烦的从来不是写 filter,而是它藏得太深——没报错、不提示、只留白。上线前务必在 iOS 真机上跑一遍所有含 filter 的页面,别信模拟器。


















