解决 vue2.7使用 pnpm 和 pinia 2.x报错

看了很多帖子,都说和vue2.7 不兼容,需要降级到2.0.x,但还是没有效果,pinia 2.x的最后更新版本也支持2.7,使用yarn可以运行,使用pnpm就报错

github.com/vuejs/pinia...

md 复制代码
2.3.1 (2025-01-20)
Bug Fixes
types: support for Vue 2.7 (d14e1a7)

环境说明

package.json

json 复制代码
 "dependencies": {
    "pinia": "2.3.1",
    "vue": "2.7.16"
  }

报错信息

报错关键字:export 'hasInjectionContext' (imported as 'hasInjectionContext') 报错信息:

sh 复制代码
error   Build errors: 
  ./node_modules/.pnpm/pinia@2.3.1_vue@2.7.16/node_modules/pinia/dist/pinia.mjs ×

File: ./node_modules/.pnpm/pinia@2.3.1_vue@2.7.16/node_modules/pinia/dist/pinia.mjs:1726:27-46
  × ESModulesLinkingError: export 'hasInjectionContext' (imported as 'hasInjectionContext') was not found in 'vue-demi' (possible exports: EffectScope, Vue, Vue2, computed, customRef, defineAsyncComponent, defineComponent, del, effectScope, getCurrentInstance, getCurrentScope, h, inject, install, isProxy, isReactive, isReadonly, isRef, isShallow, isVue2, isVue3, markRaw, mergeDefaults, nextTick, onActivated, onBeforeMount, onBeforeUnmount, onBeforeUpdate, onDeactivated, onErrorCaptured, onMounted, onRenderTracked, onRenderTriggered, onScopeDispose, onServerPrefetch, onUnmounted, onUpdated, provide, proxyRefs, reactive, readonly, ref, set, shallowReactive, shallowReadonly, shallowRef, toRaw, toRef, toRefs, triggerRef, unref, useAttrs, useCssModule, useCssVars, useListeners, useSlots, version, watch, watchEffect, watchPostEffect, watchSyncEffect)
      ╭─[1726:27]
 1724 │     }
 1725 │     function useStore(pinia, hot) {
 1726 │         const hasContext = hasInjectionContext();
      ·                            ───────────────────
 1727 │         pinia =
 1728 │             // in test mode, ignore the argument provided as we can always retrieve a
      ╰────
Import traces (entry → error):

问题分析

由于 vue-demi 被 Ignored build scripts(忽略了构建脚本),它无法执行安装后的 postinstall 脚本。

为什么这会导致报错? vue-demi 是 Pinia 兼容 Vue 2 和 Vue 3 的核心桥梁。它在安装时需要运行一个脚本来检测你当前项目是 Vue 2 还是 Vue 3,并据此"切换"导出的 API。

因为 pnpm 默认禁用了未授权的脚本运行,vue-demi 没能成功切换。

结果它默认指向了 Vue 3 的导出路径,导致 Pinia 去调用 Vue 2.7 根本不存在的 hasInjectionContext,从而引发了你看到的错误。

解决办法

授权并重新构建 在终端运行以下命令:

sh 复制代码
pnpm approve-builds

空格选中 vue-demi

sh 复制代码
pnpm approve-builds
√ Choose which packages to build (Press <space> to select, <a> to toggle all, <i> to invert selection) · vue-demi
√ The next packages will now be built: vue-demi.
Do you approve? (y/N) · true
node_modules/.pnpm/vue-demi@0.14.10_vue@2.7.16/node_modules/vue-demi: Running postinstall script, done in 127ms

再次执行pnpm dev 即可

相关推荐
恋猫de小郭31 分钟前
Redis 作者反驳「中国模型之所以强,是因为通过 API 蒸馏了美国模型」
前端·人工智能·ai编程
Darling噜啦啦35 分钟前
Canvas 游戏开发与数据可视化实战:从飞机大战到 ECharts 报表
前端·echarts·canvas
OpenTiny社区1 小时前
这次更新太良心!GenUI SDK v1.2.0 轻量化 + 稳流式 + 超强 Playground
前端·vue.js·ai编程
梨子同志1 小时前
WebGL test
前端
程序员黑豆1 小时前
AI全栈开发系列开篇:从Java全栈到AI应用实战
前端·ai编程·全栈
yangyj1 小时前
从 PDR 到落地:用 Codex 完成一次 Rspack 升级
前端
程序员鱼皮1 小时前
提示词工程已死,Loop Engineering 称王!保姆级教程 + 项目实战
前端·后端·ai编程
小爷毛毛_卓寿杰1 小时前
给 Embedding 模型也加一块“游乐场“—— Xinference 是怎么把 vector 变成肉眼可见的体验的
前端
忆江南1 小时前
iOS 性能优化全面详解
前端
lichenyang4531 小时前
HAP / HAR / HSP 到底啥区别?顺带把「导入」那点疑惑讲清楚
前端