You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I:\Temp\taro-demo-vue3>pnpm ls vue
Legend: production dependency, optional only, dev only
taro-demo-vue3@1.0.0 I:\Temp\taro-demo-vue3
dependencies:
vue 3.0.0
背景
创建完 Vue 3 版本的 Taro 项目,运行的时候发现报错了:
问题定位
报错原因是
vue
包下找不到compiler-sfc
这个目录,查一下vue
的版本:在 package.json 中定义的版本是
"vue": "^3.0.0"
然而就直接安装了3.0.0
版本,这就很不合逻辑。把 node_modules 删了,改用 npm 重新安装依赖,发现安装的就是最新版的
vue
了:再次启动项目也不报错了,说明问题出在 pnpm 身上。
去 pnpm 官网搜索后发现原因了: pnpm 版本(
v8.0.0
到v8.6.12
)中resolution-mode
的默认值是lowest-direct
,即 安装依赖的最低版本 。从 pnpm@8.7.0 开始,已经回滚默认值为highest
了,所以出错的只有部分用户。而我好巧不巧安装了修复前的最后一个版本8.6.12
后就没更新过。解决方法
1. 升级
vue-loader
到一个不会报错的版本,比如^17.1.0
2. 升级
vue3
到一个不会报错的版本,比如^3.2.13
3. 项目根目录添加一个
.npmrc
文件强制下载最高版本,可以兼容所有版本的 pnpm ,就是有点碍眼。
4. 升级 pnpm 版本
下载 exe 的方式以后升级还得手动替换,还是用 npm 仓库安装更加省事、通用。
这里有一个小技巧:先用 npm 全局安装 pnpm ,再用 pnpm 套娃安装指定版本的自己:
利用 pnpm 全局缓存的特性就可以快速切换不同版本的 pnpm 了。
可以看到其实安装了两个 pnpm ,只是
%PNPM_HOME%
目录处于 PATH 环境变量中靠前的位置( 如果不是这样的话,自己调整一下环境变量的顺序 ),优先级更高,所以里面的 pnpm 就是我们实际用到的那个。总结:还是手动把
vue-loader
、vue
以及 pnpm 都升级掉,这样以后比较省事。小插曲
测试升级 pnpm 后的效果时,发现原先的报错是没了,但又报新的错了:
这个 @tarojs/binding-win32-x64-msvc 包是 @tarojs/binding 包中的 optionalDependencies (可选依赖项) 。按理说应该会根据运行的系统环境自动安装的,但是没安装下来。又是耽误时间去怀疑是不是 pnpm 升级导致本地缓存错乱或者不再自动安装 optionalDependencies 了。
最后仔细看了
@tarojs/binding-win32-x64-msvc
包的 package.json 才发现它是依赖 node16 的,而我在升级 pnpm 的时候因为操作生疏把它安装的 node16 也一并删掉了,就只剩一个原装的 node14 了,知道真相后也是挺无语的。pnpm install --froce
will install all optionalDependencies关联问题
转载请注明出处: https://github.com/anyesu/blog/issues/50
The text was updated successfully, but these errors were encountered: