Redux store.subscribe报错__webpack_require__.i(...) is not a function求助
问题排查:Redux subscribe 结合 lodash throttle 导致的 TypeError
首先咱们来定位这个错误的核心原因:你调用store.subscribe的方式存在参数位置错误,这直接引发了打包时的函数类型异常。
错误根源分析
你的代码里是这么写的:
store.subscribe(throttle(() => { saveState({ cart: store.getState().cart }); }), 1000);
这里有两个关键问题:
store.subscribe仅接受一个参数:状态变化时执行的回调函数,你把1000作为第二个参数传入,完全不符合它的API规范- 节流函数
throttle的延迟时间参数1000没有传递给throttle本身,导致throttle没有生成预期的节流函数,最终让webpack在处理时抛出了类型错误
修复方案
把1000作为throttle的第二个参数,正确包裹在throttle的调用括号内:
store.subscribe(throttle(() => { saveState({ cart: store.getState().cart }); }, 1000)); // 将延迟时间移至throttle的参数列表中
额外优化建议
- 代码可读性优化:可以把回调函数抽离出来,让逻辑更清晰:
const saveCartToLocalStorage = throttle(() => { saveState({ cart: store.getState().cart }); }, 1000); store.subscribe(saveCartToLocalStorage);
- 依赖兼容性检查:虽然你用的lodash按需导入方式是正确的,但如果lodash版本和现有项目依赖存在冲突,也可能引发奇怪的打包错误。可以尝试更新lodash到稳定版本:
npm install lodash@latest --save
- 保持localStorage操作的安全性:你的
saveState和loadState已经做了try-catch包裹,这很好,能避免某些浏览器禁用localStorage导致的页面崩溃,建议继续保持这个写法。
为什么注释掉代码错误就消失?
当你注释掉store.subscribe的代码块后,webpack不再处理这段错误的函数调用逻辑,自然也就不会触发那个类型错误了。
内容的提问来源于stack exchange,提问作者Galivan
相关产品推荐
相关产品推荐

