你们好,我是金金金。

pinia报错does not provide an export named 'hasInjectionContext

场景

pinia报错does not provide an export named 'hasInjectionContext

  • 我这里是uniapp+vue3编写的一个小程序项目,在集成pinia过程傍边遇到此问题,报错请求的模块 未供给 导出名hasInjectionContext(坐落 pinia.mjs:6:10)

以下我项目傍边vue和pinia的详细依靠版别

pinia报错does not provide an export named 'hasInjectionContext

  • 这里插一条常识:package.json里边依靠包标识符~、^、以及不指定分别都代表什么意义,非常重要!!!

package.json里边依靠包标识符意义

  • ^2.0.27:指定的版别范围答应进行向后兼容的更新,包括小版别和非必须版别的更新,但主版别号不变
    • 假如一个依靠项的版别为^2.0.27,那么在装置时,能够承受任何2.x.x版别的更新,但不承受3.0.0或更高版别的更新。例如,^2.0.27答应装置2.2.272.3.272.5.27等,但不答应装置3.0.0
  • ~2.0.27:指定的版别范围答应进行小版别的更新,但坚持主版别号不变
    • 假如一个依靠项的版别为~2.0.27,那么在装置时,能够承受任何2.0.x版别的更新,但不承受2.1.0或更高版别的更新。例如,~2.0.27答应装置2.0.372.0.5等,但不答应装置2.1.0
  • 2.0.27:指定什么版别详细便是什么版别
    • 便是2.0.27

排查

  • 依靠装置的详细版别

pinia报错does not provide an export named 'hasInjectionContext

pinia报错does not provide an export named 'hasInjectionContext

由于我前面加了^所以版别在pnpm i的也就更新了~

  • vue:3.4.21
  • pinia:2.1.7

进入正题,从报错信息能看出来和pinia相关,咱们来到更新日志看下是否是依靠兼容问题

pinia报错does not provide an export named 'hasInjectionContext

pinia报错does not provide an export named 'hasInjectionContext

  • 这里能够看到,pinia2.1.0要求vue版别 >= 3.3.0vue-demi 也需求 >= 0.14.5,我的vue版别是满意的,vue-demi(用于供给 Vue 2 兼容性的东西库)的版别也满意,vue3内置了这个东西库。

pinia报错does not provide an export named 'hasInjectionContext

  • 我就纳闷了,依靠也能对上啊,为什么仍是报错,在此期间又多次在网上寻找相关问题等解决方法,看到一篇帖子说是uniapp,我惊了。我先贴张图片,我也不清楚是不是这里影响的。

pinia报错does not provide an export named 'hasInjectionContext

  • 随后我来到package.json,点击进去

pinia报错does not provide an export named 'hasInjectionContext

pinia报错does not provide an export named 'hasInjectionContext

  • 纳尼,这里依靠了vue 版别是3.2.47的,可能是被uniapp所依靠的版别影响到了,咱们知道pinia``2.1.0以上需求vue版别是3.3.0及以上的,但是这个咱们又是修改不了的,那么咱们只有下降pinia的版别了,降到2.1.0以下供支撑3.3.0以下vue版别即可。

造成error的原因

  • uniapp所依靠的vue版别 导致依靠不兼容所导致

解决

  • 下降pinia版别,咱们指定装置详细的pinia版别为2.0.27

pinia报错does not provide an export named 'hasInjectionContext

pinia报错does not provide an export named 'hasInjectionContext

测试

  • 成功运转无报错

pinia报错does not provide an export named 'hasInjectionContext

深究

  • 上面既然说了原因是uniapp的锅,我创了一个不是uniapp项目来验证

pinia报错does not provide an export named 'hasInjectionContext

  • package.json

pinia报错does not provide an export named 'hasInjectionContext

  • 咱们来运转看下是否会报错,上面这个情况uniapp项目是已经报错了

pinia报错does not provide an export named 'hasInjectionContext

成功运转。无报错!再次验证是uniapp所依靠的vue版别所导致。

总结

uniapp所依靠的vue版别 和 装置的pinia所需求的vue版别对应不上导致报错,由于我是uniapp项目 只能自降pinia版别,假如不是uniapp项目,vue版别和pinia版别对应的话,那么也不会出现这个问题。

  • 编写有误还请大佬指正,万分感谢。