依赖更新后组件报错,该怎么处理?

打工人悦轩 阅读 12

我用 Vue 3 写了个简单的用户卡片组件,之前一直好好的。昨天运行 npm update 把依赖全升到最新,结果控制台报错说 defineProps is not defined,完全不知道咋回事。

我查了下 package.json,发现 @vue/compiler-sfc 被自动升级到了 4.x,但项目还是 Vue 3.2 的。是不是版本不兼容?现在不敢随便更新依赖了……

<template>
  <div class="user-card">
    <h3>{{ name }}</h3>
    <p>{{ email }}</p>
  </div>
</template>

<script setup>
const props = defineProps({
  name: String,
  email: String
})
</script>
我来解答 赞 1 收藏
二维码
手机扫码查看
1 条解答
A. 露宜
A. 露宜 Lv1
你的问题我太熟悉了,这确实是 @vue/compiler-sfc 升级到 4.x 和 Vue 3.2 不兼容导致的。Vue 3 的 SFC 编译器和 Vue 4 的编译器在底层语法处理上有 breaking change,比如 defineProps 这些内置宏在 Vue 3 里是编译时注入的,但 4.x 的编译器会按新规则解析,结果 Vue 3 的运行时根本认不出它。

我的做法是先回退到兼容的版本:

先确认你当前的 Vue 版本:
npm list vue

如果是 3.2.x,那就把 @vue/compiler-sfc 锁死在 3.x 版本。在 package.json 里把它的版本改成:
"@vue/compiler-sfc": "^3.2.0"
(注意用和你 Vue 主版本一致的 3.x 版本,比如你用 3.2.47 就写 3.2.47 或 ^3.2.47)

然后删掉 node_modules 和 package-lock.json,再重新装:
rm -rf node_modules package-lock.json && npm install

这样就能用回原来的 defineProps 行为。别急着全量 update,以后遇到这种编译器相关的包,先看 release note 有没有 breaking change,或者直接用 npm outdated 看哪些包真的需要更新,不要一股脑全升。

对了,顺带提醒下,Vue 3.4+ 开始就支持