Vite+Vue2+Composition-api+ +TypeScript搭配如何开发项目?

2025-05-29 0 86

Vite+Vue2+Composition-api+ +TypeScript搭配如何开发项目?

前言

Vite相信大家都用过,它是一种新型前端开发与构建工具,能够显著提升前端开发体验。我们在搭建Vite项目,选择Vue模板之后,默认会下载Vue3模板。如果你的公司现在还没有准备使用Vue3,而在使用Vue2,那么这篇文章值得你继续看下去。下面,我将带大家如何搭建一个 Vite+Vue2+Composition-api+<script setup>+TypeScript 搭配使用的项目。这篇文章很干,请大家点点赞哦!

安装所需依赖

又到了实战环节,下面可以一步步跟着我哦!我这里使用的是yarn 依赖管理工具。

初始化项目

这里使用快捷初始化命令:

  1. yarninit-y

创建完package.json文件之后,我们可以手动修改下项目名称字段name:vitevue2p。

初始化Vite

安装Vite

  1. yarnaddvite-D

初始化Vue2

我们需要安装Vue2,所以直接这样安装。

  1. yarnaddvue

目前,我安装的版本是^2.6.14。

另外,我们还需要安装vue-template-compiler这个依赖,此包可用于将Vue 2.0模板预编译为渲染函数,以避免运行时编译开销和CSP限制。在编写具有非常特定需求的构建工具时,才需要单独使用它。所以,我们这里单独安装。

  1. yarnaddvue-template-compiler-D

最后,如果想让Vite支持Vue2,就必须安装这个依赖vite-plugin-vue2。

  1. yarnaddvite-plugin-vue2-D

支持Composition-api

Composition-api字面意思是组合API,它是为了实现基于函数的逻辑复用机制而产生的。这也是Vue3亮点之一,那么我们如何才能够在Vue2项目中使用呢?这需要安装@vue/composition-api依赖。

  1. yarnadd@vue/composition-api

支持<script setup>语法

<script setup>是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖,是Vue3.2新加入的语法。那么,我们也可以在Vue2项目中使用它。

你需要安装unplugin-vue2-script-setup依赖。

  1. yarnaddunplugin-vue2-script-setup-D

了解更多,可以查看https://github.com/antfu/unplugin-vue2-script-setup。

Vue2项目中使用Volar

以下是官方的解释:

我们建议将 VS Code 与 Volar 结合使用以获得最佳体验(如果您拥有 Vetur,您可能希望禁用它)。使用 Volar 时,您需要安装 @vue/runtime-dom 作为 devDependencies 以使其在 Vue 2 上工作。

  1. yarnadd@vue/runtime-dom-D

支持TypeScript语法

随着应用的增长,静态类型系统可以帮助防止许多潜在的运行时错误,所以我们推荐使用TypeScript

  1. yarnaddtypescript-D

最后,我把安装的所有依赖列出来,可以参照有没有漏的。

  1. "dependencies":{
  2. "@vue/composition-api":"^1.1.5",
  3. "vue":"^2.6.14"
  4. },
  5. "devDependencies":{
  6. "@vue/runtime-dom":"^3.2.11",
  7. "typescript":"^4.4.3",
  8. "unplugin-vue2-script-setup":"^0.6.4",
  9. "vite":"^2.5.7",
  10. "vite-plugin-vue2":"^1.8.1",
  11. "vue-template-compiler":"^2.6.14"
  12. }

搭建项目架构

首先,我先列出我自己搭建的项目文件目录,我是参照Vite默认模板而创建的文件目录。

  1. public
  2. –favicon.ico
  3. -src
  4. –assets
  5. —logo.png
  6. –components
  7. —Async.vue
  8. —Bar.vue
  9. —Foo.vue
  10. —HelloWorld.vue
  11. –App.vue
  12. –main.ts
  13. –shims-vue.d.ts
  14. index.html
  15. -package.json
  16. -ref-macros.d.ts
  17. -tsconfig.json
  18. -vite.config.ts

下面,我们按排列顺序分别看下文件中都放了什么东西?

public文件夹中放着一个ico图标文件,这个不再说明。src文件夹中文件有点多,我们放在最后讨论。

index.html

谈到index.html这个文件,我们需要引入Vite官网一段话:

你可能已经注意到,在一个 Vite 项目中,index.html 在项目最外层而不是在 public 文件夹内。这是有意而为之的:在开发期间 Vite 是一个服务器,而 index.html 是该 Vite 项目的入口文件。

Vite 将 index.html 视为源码和模块图的一部分。Vite 解析 <script type="module" src="…"> ,这个标签指向你的 JavaScript 源码。甚至内联引入 JavaScript 的 <script type="module"> 和引用 CSS 的 <link href> 也能利用 Vite 特有的功能被解析。另外,index.html 中的 URL 将被自动转换,因此不再需要 %PUBLIC_URL% 占位符了。

  1. <!DOCTYPEhtml>
  2. <htmllang="en">
  3. <head>
  4. <metacharset="UTF-8">
  5. <linkrel="icon"href="/favicon.ico"/>
  6. <metaname="viewport"content="width=device-width,initial-scale=1.0">
  7. <title>ViteApp</title>
  8. </head>
  9. <body>
  10. <divid="app"></div>
  11. <scripttype="module"src="/src/main.ts"></script>
  12. </body>
  13. </html>

package.json

这个文件定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)。这里,需要注意的是我们自定义了"scripts"字段,有三个命令:"vite –open"、"vite preview"、"vite build"。

  1. {
  2. "name":"vitevue2p",
  3. "version":"0.1.1",
  4. "description":"",
  5. "keywords":[],
  6. "license":"MIT",
  7. "main":"dist/index.js",
  8. "module":"dist/index.mjs",
  9. "scripts":{
  10. "dev":"vite–open",
  11. "serve":"vitepreview",
  12. "build":"vitebuild"
  13. },
  14. "dependencies":{
  15. "@vue/composition-api":"^1.1.5",
  16. "vue":"^2.6.14"
  17. },
  18. "devDependencies":{
  19. "@vue/runtime-dom":"3.2.11",
  20. "typescript":"^4.4.3",
  21. "unplugin-vue2-script-setup":"^0.6.4",
  22. "vite":"^2.5.7",
  23. "vite-plugin-vue2":"^1.8.1",
  24. "vue-template-compiler":"^2.6.14"
  25. }
  26. }

ref-macros.d.ts

以d.ts后缀结尾的是TypeScript中的类型定义文件。我们知道自从引入 Composition API 以来,一个主要未解决的问题是 refs 与reactive的使用,到处使用 .value可能很麻烦,如果不使用类型系统,很容易错过。一些用户特别倾向于只使用reactive,这样他们就不必处理refs。

为了优化,官方提出了一个RFC,大家可以打开下面这个网址 https://github.com/vuejs/rfcs/discussions/369 了解一下。

下面,可以看下一个简单的例子。

  1. //declaringareactivevariablebackedbyanunderlyingref
  2. letcount=$ref(1)
  3. //noneedfor.valueanymore!
  4. console.log(count)//1
  5. functioninc(){
  6. //assignmentsarereactive
  7. count++
  8. }

另外,这是一项实验性功能。实验性功能可能会改变补丁版本之间的行为。建议将您的 vue 依赖项固定到确切的版本以避免损坏。

言归正传,我们来看下ref-macros.d.ts文件中的内容。

  1. importtype{
  2. Ref,
  3. UnwrapRef,
  4. ComputedRef,
  5. WritableComputedOptions,
  6. WritableComputedRef,
  7. ShallowUnwrapRef,
  8. }from'@vue/composition-api'
  9. declareconstRefMarker:uniquesymbol
  10. typeRefValue<T>=T&{[RefMarker]?:any}
  11. declareconstComputedRefMarker:uniquesymbol
  12. typeComputedRefValue<T>=T&{[ComputedRefMarker]?:any}
  13. declareconstWritableComputedRefMarker:uniquesymbol
  14. typeWritableComputedRefValue<T>=T&{[WritableComputedRefMarker]?:any}
  15. typeToRawRefs<Textendsobject>={
  16. [KinkeyofT]:T[K]extendsComputedRefValue<inferV>
  17. ?ComputedRefValue<V>
  18. :T[K]extendsWritableComputedRefValue<inferV>
  19. ?WritableComputedRef<V>
  20. :T[K]extendsRefValue<inferV>
  21. ?Ref<V>
  22. :T[K]extendsobject
  23. ?T[K]extends
  24. |Function
  25. |Map<any,any>
  26. |Set<any>
  27. |WeakMap<any,any>
  28. |WeakSet<any>
  29. ?T[K]
  30. :ToRawRefs<T[K]>
  31. :T[K];
  32. }
  33. /**
  34. *Vuereftransformmacroforbindingrefsasreactivevariables.
  35. */
  36. declarefunction_$<T>(arg:ComputedRef<T>):ComputedRefValue<T>
  37. declarefunction_$<T>(
  38. arg:WritableComputedRef<T>
  39. ):WritableComputedRefValue<T>
  40. declarefunction_$<T>(arg:Ref<T>):RefValue<T>
  41. declarefunction_$<Textendsobject>(arg?:T):ShallowUnwrapRef<T>
  42. /**
  43. *Vuereftransformmacroforaccessingunderlyingrefsofreactivevaraibles.
  44. */
  45. declarefunction_$$<T>(value:T):ComputedRef<T>
  46. declarefunction_$$<T>(
  47. value:WritableComputedRefValue<T>
  48. ):WritableComputedRef<T>
  49. declarefunction_$$<T>(value:RefValue<T>):Ref<T>
  50. declarefunction_$$<Textendsobject>(arg:T):ToRawRefs<T>
  51. declarefunction_$ref<T>(arg?:T|Ref<T>):RefValue<UnwrapRef<T>>
  52. declarefunction_$shallowRef<T>(arg?:T):RefValue<T>
  53. declarefunction_$computed<T>(
  54. getter:()=>T,
  55. //debuggerOptions?:DebuggerOptions
  56. ):ComputedRefValue<T>
  57. declarefunction_$computed<T>(
  58. options:WritableComputedOptions<T>,
  59. //debuggerOptions?:DebuggerOptions
  60. ):WritableComputedRefValue<T>
  61. declareglobal{
  62. const$:typeof_$
  63. const$$:typeof_$$
  64. const$ref:typeof_$ref
  65. const$shallowRef:typeof_$shallowRef
  66. const$computed:typeof_$computed
  67. }

tsconfig.json

tsconfig.json文件中指定了用来编译这个项目的根文件和编译选项。

我们这里需要注意如果您的 IDE 缺少全局类型。

  1. {
  2. "compilerOptions":{
  3. "types":[
  4. "unplugin-vue2-script-setup/types"
  5. ]
  6. }
  7. }

Volar 优先支持 Vue 3。Vue 3 和 Vue 2 模板有些不同。您需要设置 ExperimentCompatMode 选项以支持 Vue 2 模板。

  1. {
  2. "compilerOptions":{
  3. },
  4. "vueCompilerOptions":{
  5. "experimentalCompatMode":2
  6. },
  7. }

最后,文件内容如下:

  1. {
  2. "compilerOptions":{
  3. "target":"es2017",
  4. "module":"esnext",
  5. "moduleResolution":"node",
  6. "esModuleInterop":true,
  7. "strict":true,
  8. "strictNullChecks":true,
  9. "resolveJsonModule":true,
  10. "types":[
  11. "unplugin-vue2-script-setup/types"
  12. ]
  13. },
  14. "vueCompilerOptions":{
  15. "experimentalCompatMode":2
  16. }
  17. }

vite.config.ts

这个文件是Vite的配置文件。当以命令行方式运行 vite 时,Vite 会自动解析项目根目录下名为 vite.config.js(或vite.config.ts) 的文件。

这里需要注意 refTransform 现在是插件根级选项,需要手动定义为true。(为什么配置refTransform,可以看上面ref-macros.d.ts文件中对refs处理,不使用.value的介绍)。

另外,如果想支持<script setup>语法,必须在这里以插件的形式配置。

  1. import{defineConfig}from'vite'
  2. import{createVuePluginasVue2}from'vite-plugin-vue2'
  3. importScriptSetupfrom'unplugin-vue2-script-setup/vite'
  4. exportdefaultdefineConfig({
  5. plugins:[
  6. Vue2(),
  7. ScriptSetup({
  8. refTransform:true,
  9. }),
  10. ],
  11. })

介绍完这些文件,剩下的就是src文件夹中的文件了,因为文件过多,我们把它单独放在Src文件夹栏目中。

Src文件夹

assets文件中只有logo.png一个图片,你可以把静态文件放在当中,这里不多过介绍。

main.ts

这是Vue2的入口文件,我们可以看到这里VueCompositionAPI被当做插件引入。另外,我们引入的App.vue以及其他*.vue为后缀的文件,需要有专门的类型定义文件进行声明,在下面的shims-vue.d.ts文件中我们会讲到。

  1. importVuefrom'vue'
  2. importVueCompositionAPIfrom'@vue/composition-api'
  3. importAppfrom'./App.vue'
  4. Vue.use(VueCompositionAPI)
  5. constapp=newVue({render:h=>h(App)})
  6. app.$mount('#app')

shims-vue.d.ts

  1. declaremodule'*.vue'{
  2. importVuefrom'vue'
  3. exportdefaultVue
  4. }

App.vue

这个文件是页面入口文件。我们来看下它是如何写的,这是Vue2项目,但是写法与Vue3项目无异,只不过在Vue2项目中需要'@vue/composition-api'使用Composition-api,而Vue3项目直接引入vue。

另外,这里看到我们直接使用<script setup>语法,替换了之前setup()方法,使代码更简洁。还有我们可以直接引入组件,直接在模板中使用。

更多关于<script setup>语法的内容可以看看https://v3.cn.vuejs.org/api/sfc-script-setup.html,了解更多使用方法。

  1. <template>
  2. <divid="app">
  3. <imgalt="Vuelogo"src="./assets/logo.png">
  4. <hello-worldname="Vue2+TypeScript+Vite"@update="onUpdate"/>
  5. <async-component/>
  6. </div>
  7. </template>
  8. <scriptsetuplang="ts">
  9. import{defineAsyncComponent}from'@vue/composition-api'
  10. importHelloWorldfrom'./components/HelloWorld.vue'
  11. constAsyncComponent=defineAsyncComponent(()=>import('./components/Async.vue'))
  12. functiononUpdate(e:any){
  13. console.log(e)
  14. }
  15. </script>
  16. <scriptlang="ts">
  17. exportdefault{
  18. name:'App',
  19. }
  20. </script>
  21. <style>
  22. #app{
  23. font-family:Avenir,Helvetica,Arial,sans-serif;
  24. -webkit-font-smoothing:antialiased;
  25. -moz-osx-font-smoothing:grayscale;
  26. text-align:center;
  27. color:#2c3e50;
  28. margin-top:60px;
  29. }
  30. </style>

HelloWorld.vue

然后,我们再看下这个文件中什么内容。这里需要注意的是$ref()、$computed()方法,这就是之前提到的refTransform语法,不得不说,这比以前使用.value处理方便多了。

  1. <template>
  2. <div>
  3. <h1>{{msg}},{{name}}</h1>
  4. <button@click="inc">
  5. Inc
  6. </button>
  7. <div>{{count}}x2={{doubled}}</div>
  8. <button@click="dec()"v-html="decText"/>
  9. <component:is="count>2?Foo:Bar"/>
  10. </div>
  11. </template>
  12. <scriptsetuplang="ts">
  13. import{watch}from'@vue/composition-api'
  14. importFoofrom'./Foo.vue'
  15. importBarfrom'./Bar.vue'
  16. constprops=withDefaults(defineProps<{msg:string;name:string|number}>(),{msg:'Hello'})
  17. constemit=defineEmits(['update'])
  18. letcount=$ref(1)
  19. //eslint-disable-next-lineprefer-const
  20. letdoubled=$computed(()=>count*2)
  21. functioninc(){
  22. count+=1
  23. }
  24. functiondec(){
  25. count-=1
  26. }
  27. constdecText='<b>Dec</b>'
  28. watch(()=>count,value=>emit('update',value))
  29. </script>
  30. <stylescoped>
  31. button{
  32. margin:20px0;
  33. }
  34. </style>

其他文件就不过多介绍了,就只是简单的模板文件。

Foo.vue

  1. <template>
  2. <div>Foo</div>
  3. </template>

Bar.vue

  1. <template>
  2. <div>Bar</div>
  3. </template>

Async.vue

  1. <template>
  2. <div>AsyncComponent</div>
  3. </template>

结语

最后,我们启动下项目。

  1. yarndev

Vite+Vue2+Composition-api+ +TypeScript搭配如何开发项目?

如上图所示,启动成功。

相信这样可以在一定程度上提升你 Vue 2 的开发体验,赶快来!

以下是本篇文章的源码地址:

  1. https://github.com/maomincoding/viteVue2p

如果觉得这篇文章对你有帮助,感谢点赞哦~

原文链接:https://mp.weixin.qq.com/s/qFZo0hE7iGDsVqtxgrE79g

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Vite+Vue2+Composition-api+ +TypeScript搭配如何开发项目? https://www.kuaiidc.com/94356.html

相关文章

发表评论
暂无评论