过滤器里不能直接引入或使用 lodash——因 import 必须在模块顶层,而过滤器函数内不支持;且小程序端无动态 import 支持,运行时无模块加载上下文。正确做法是提前按需导入(如 import debounce from 'lodash/debounce')并挂载到全局或封装为工具函数,在 computed/methods 中调用,而非塞入过滤器。

过滤器里不能直接引入或使用 lodash(或其他 npm 包)——不是写法问题,是运行时环境和打包机制双重限制。
为什么 import 在过滤器里会失效
uni-app 的过滤器(Vue.filter)在模板编译阶段被注册,但此时模块尚未完成解析,且小程序端不支持动态 import();更重要的是,import 语句必须出现在模块顶层,不能写在函数体内(包括过滤器函数)。即使你强行把 import debounce from 'lodash/debounce' 写进过滤器函数,也会报错:Cannot use import statement inside a function。
- 过滤器函数本质是纯同步执行体,没有模块加载上下文
- 微信小程序、App 端的 JS 引擎不支持运行时
require或动态import - HBuilderX 或 vite 构建时会忽略函数体内的
import,导致实际未打包进主包
想在模板中用 lodash 方法,该怎么做
必须把 lodash 功能提前导入并挂载到全局或组件作用域,再让过滤器调用已存在的函数。注意:只允许按需引入具体方法文件,不能 import _ from 'lodash'。
- 在
main.js或App.vue的onLaunch中导入并挂载:import debounce from 'lodash/debounce'; globalThis._debounce = debounce; - 定义过滤器时直接调用:
Vue.filter('debounce', (val) => globalThis._debounce(() => console.log(val), 300))—— 但注意这其实没意义,因为过滤器本身不触发防抖时机 - 更合理的做法:把 lodash 工具函数封装成可复用的
utils/模块,例如src/utils/format.js,导出throttle、debounce、get等,然后在setup()或methods中调用,而非塞进过滤器
哪些 lodash 写法在 uni-app 小程序端真正有效
只有两种路径能触发 tree-shaking 并正确打包进小程序主包:
-
import debounce from 'lodash/debounce'✅(精确到文件) -
import { get } from 'lodash-es'✅(前提是lodash-es没被 babel 转成 commonjs;检查vite.config.ts中transformIgnorePatterns是否放过node_modules/.pnpm/.*lodash-es) -
import _ from 'lodash'❌(整包打进,主包瞬间 +100KB) -
import { debounce } from 'lodash'❌(commonjs 模式下 tree-shaking 失效)
真正容易被忽略的一点:过滤器不是逻辑容器,而是模板语法糖。所有需要第三方库参与的处理,都应该前置到数据准备阶段(computed、onMounted、watch),而不是靠过滤器“现场调用”。否则你会在真机调试时遇到 undefined is not a function,却查不出来源——因为错误发生在模板渲染期,堆栈信息被截断。











