过滤器中调用 uni.requireNativePlugin 会失败,因其运行在模板渲染阶段,JS 上下文不保证原生插件已加载、平台未判断、无法异步等待,且返回值可能为 null 或 undefined,而过滤器必须同步立即返回结果。

过滤器里不能调用外部 JS 插件——这不是写法问题,是运行时限制。
为什么过滤器里调用 uni.requireNativePlugin 会失败
过滤器(Vue.filter)运行在模板渲染阶段,此时 JS 上下文不保证原生插件已加载、平台判断未执行、且无法做异步等待。更关键的是:uni.requireNativePlugin 返回的是同步对象(可能为 null),而过滤器函数必须立即返回值,不能挂起或重试。
- 调用
uni.requireNativePlugin('xxx')时若插件未就绪,直接得null,过滤器没法重试或延后执行 - 过滤器无生命周期钩子,无法监听插件加载完成事件
- 模板中如
{{ time | formatDate | encryptWithNative }},第二个过滤器想调原生插件,但此时连platform都没判,uni.requireNativePlugin在 H5 小程序端直接返回undefined,还不会报错
替代方案:把原生能力提前封装成可复用的工具函数
真正可行的做法,是绕开过滤器,在 methods 或 setup 中预先加载并缓存插件实例,再暴露为纯 JS 函数供业务逻辑调用。
- 在
main.js或App.vue的onLaunch里初始化插件:const facePlugin = uni.requireNativePlugin('bd-face-plugin'),校验非空后挂到globalThis.facePlugin - 封装一个工具函数,比如
encryptByNative(data),内部先判facePlugin && facePlugin.encrypt,再调用,失败时 fallback 到 JS 实现 - 页面中需要格式化+加密的场景,改用
computed或methods组合处理,而不是塞进过滤器链
如果非要“在模板里用”,只能靠组件封装 + 条件编译
模板本身不支持动态加载原生能力,但可以借助自定义组件隔离平台差异和加载状态。
- 写一个
<native-encrypt>组件,内部用onMounted调uni.requireNativePlugin,加v-if="pluginReady"控制渲染 - 组件 props 接收原始数据,slots 或 scoped slot 输出处理结果,避免在父组件模板里硬编码过滤逻辑
- 配合条件编译:
#ifdef APP-PLUS包裹该组件,H5 和小程序用纯 JS 版本降级
原生插件本质是平台级能力,和过滤器这种纯同步数据转换不在同一抽象层级。强行塞进去,只会让错误变得隐蔽——比如真机上偶发 null、模拟器里永远 undefined、打包后某个平台突然失效。把加载、校验、降级都显式写出来,比依赖过滤器“自动触发”靠谱得多。


















