使用 vue cli 脚手架创建项目工程,选择的是自定义配置项,选择是 ts + 2.0 版本
PS F:\gitlab> vue create test
Vue CLI v5.0.8
? Please pick a preset: Manually select features
? Check the features needed for your project: Babel, TS, Router, Vuex, CSS Pre-processors, Linter
? Choose a version of Vue.js that you want to start the project with 2.x
? Use class-style component syntax? Yes
? Use Babel alongside TypeScript (required for modern mode, auto-detected polyfills, transpiling JSX)? Yes
? Use history mode for router? (Requires proper server setup for index fallback in production) Yes
? Pick a CSS pre-processor (PostCSS, Autoprefixer and CSS Modules are supported by default): Sass/SCSS (with dart-sass)
? Pick a linter / formatter config: Standard
? Pick additional lint features: Lint on save
? Where do you prefer placing config for Babel, ESLint, etc.? In dedicated config files
? Save this as a preset for future projects? No
这时候我想使用 @vue/composition-api 这个npm 包进行 vue3 的语法书写代码,代码如下
<template>
<div id="app">
{{ name }}
</div>
</template>
<script lang="ts">
import { defineComponent, ref } from '@vue/composition-api'
export default defineComponent({
setup () {
const name = ref('tom')
return {
name
}
}
})
</script>
这时候控制台就会报错
[Vue warn]: The setup binding property "name" is already declared.
下面是关于排查这个问题的思路
找到 @vue/composition-api 文档,翻阅使用方式,结果看到一句醒目的提醒,vue2.7+ 版本已经内置了该库, 该库需要配合 vue2.6+ 以下版本使用,这时候我就返回项目查看vue对应的版本,package.json 显示的是 "vue": "^2.6.14" 版本。
这个时候我又去github上面找到 @vue/composition-api 仓库进行查看issus,找到几条有价值的提问,该报错是指vue版本存在问题,此时我又翻看了项目的 node_modules/vue 的 package.json 为2.7.14
到这我才想起来,可能是项目 package.json vue 安装的版本出现了问题,定睛一看通过脚手架生成的项目依赖是 "vue": "^2.6.14"
“^” 代表的是安装最近的一个大版本, 比如 2.6.14 将会匹配所有 2.x.x,但不包含 3.x.x 版本
到这里其实就应该知道报错的原因了,使用vue-cli脚手架生成2.x的项目时,虽然package.json上面写的是 "vue": "^2.6.14",实际上node_modules里面 vue 的依赖安装的是2.7.14。2.7.14版本已经支持composition-api啦,就不需要在使用 @vue/composition-api这个库来进行搭桥使用新语法了。
下面我就简单的说一下 package.json 里面控制版本号的符号 “~” 和 “^”
~ 的意思是匹配最小的版本号,比如 ~2.6.14 将会匹配所有的 2.6.x 版本,但不匹配2.7.0
^ 的意思是最近的一个大版本,比如 ^2.6.14 将会匹配所有的 2.x.x 版本,但不包括3.x.x