位置: IT常识 - 正文

Vite + Vue2 + Vuetify2 + <script setup> + TypeScript 搭配开发项目

编辑:rootadmin
本文记录如何在 Vue2 环境下尽量使用 Vue3 的 Composition-api 并配合 Vuetify2 使用 前言 之前在改造一个用 Vuetify2 的 项目,由于 Vuetify3 还处于 beta 阶段并且与 Vuetify2 相比缺失一些特性,但又想用 Vue3 的 <script ...

推荐整理分享Vite + Vue2 + Vuetify2 + <script setup> + TypeScript 搭配开发项目,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

本文记录如何在 Vue2 环境下尽量使用 Vue3 的 Composition-api 并配合 Vuetify2 使用

前言

之前在改造一个用 Vuetify2 的 项目,由于 Vuetify3 还处于 beta 阶段并且与 Vuetify2 相比缺失一些特性,但又想用 Vue3 的 <script setup> 语法,于是寻找了下相关方案,下面简单记录一下。

开始之前

建议使用 VSCode 开发并安装以下插件且禁用 Vetur:

Vue Language Features (Volar)

TypeScript Vue Plugin (Volar)

初始化

使用 npm init 初始化项目

添加所需依赖vue@2.6.14: 指定 2 版本,不指定的话默认安装 3 版本vue-template-compiler: 将 Vue 2.0 模板预编译为渲染函数vite-plugin-vue2: 让 Vite 支持 Vue2@vue/composition-api: 在 Vue2 项目中使用组合 APIunplugin-vue2-script-setup: 在 Vue2 项目中使用 <script setup> 语法糖unplugin-vue-components: 按需自动引入组件@vue/runtime-dom: 配合 Volar

完整依赖如下:

"dependencies": { "@mdi/font": "5.9.55", "@vue/composition-api": "^1.6.0", "roboto-fontface": "*", "vue": "^2.6.14", "vuetify": "^2.6.4", "webfontloader": "^1.0.0" }, "devDependencies": { "@types/node": "^17.0.29", "@types/webfontloader": "^1.6.34", "@vue/runtime-dom": "^3.2.33", "sass": "1.32.12", "typescript": "^4.6.3", "unplugin-vue-components": "^0.19.3", "unplugin-vue2-script-setup": "^0.10.2", "vite": "^2.9.5", "vite-plugin-vue2": "^2.0.0", "vue-template-compiler": "^2.6.14", "vue-tsc": "^0.34.10" }文件目录结构?project ┣ ?.vscode ┣ ?dist ┣ ?node_modules ┣ ?src ┃ ┣ ?common ┃ ┣ ?components ┃ ┣ ?plugins ┃ ┃ ┣ ?vuetify.ts ┃ ┃ ┗ ?webfontloader.ts ┃ ┣ ?styles ┃ ┣ ?App.vue ┃ ┣ ?env.d.ts ┃ ┗ ?main.ts ┣ ?.gitattributes ┣ ?.gitignore ┣ ?components.d.ts ┣ ?index.html ┣ ?package.json ┣ ?readme.md ┣ ?tsconfig.json ┣ ?tsconfig.node.json ┣ ?vite.config.ts ┗ ?yarn.lockindex.html

来自 Vite 官网:

你可能已经注意到,在一个 Vite 项目中,index.html 在项目最外层而不是在 public 文件夹内。这是有意而为之的:在开发期间 Vite 是一个服务器,而 index.html 是该 Vite 项目的入口文件。Vite 将 index.html 视为源码和模块图的一部分。Vite 解析 <script type="module" src="https://www.cnblogs.com/himeka/p/..."> ,这个标签指向你的 JavaScript 源码。甚至内联引入 JavaScript 的 <script type="module"> 和引用 CSS 的 <link href> 也能利用 Vite 特有的功能被解析。另外,index.html 中的 URL 将被自动转换,因此不再需要 %PUBLIC_URL% 占位符了。

<!DOCTYPE html><html lang="zh"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Vite App</title></head><body> <div id="app"></div> <script type="module" src="https://www.cnblogs.com/src/main.ts"></script></body></html>components.d.ts

由 unplugin-vue-components 自动生成,为自动引入组件提供支持,在 vite.config.ts 中通过以下设置打开

Components({ dts: true, // enabled by default if `typescript` is installed})

记得把 components.d.ts 添加到 tsconfig.json 的 includes

tsconfig.json

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

Vite + Vue2 + Vuetify2 + <script setup> + TypeScript 搭配开发项目

配置全局类型:

"compilerOptions": { "types": [ "vite/client", "node", "vue", "vuetify", "unplugin-vue2-script-setup/types" ], },

Volar 需要以下配置来支持 Vue2

"vueCompilerOptions": { "experimentalCompatMode": 2, "experimentalTemplateCompilerOptions": { "compatConfig": { "MODE": 2 // optional } } },

完整配置见 yandere-masonry/tsconfig.json

tsconfig.node.json

配置 vite.config.ts 的 TypeScript 选项

{ "compilerOptions": { "composite": true, "module": "esnext", "moduleResolution": "node", "esModuleInterop": true, "allowSyntheticDefaultImports": true, "types": ["node"] }, "include": ["vite.config.ts"]}vite.config.ts

Vite 配置文件,之前安装的插件需要这个文件里配置一下来支持 Vue2、<script setup> 等等

import { fileURLToPath, URL } from 'node:url'import { defineConfig } from 'vite'import { createVuePlugin as Vue2 } from 'vite-plugin-vue2'import { VuetifyResolver } from 'unplugin-vue-components/resolvers'import Components from 'unplugin-vue-components/vite'import ScriptSetup from 'unplugin-vue2-script-setup/vite'// https://vitejs.dev/config/export default defineConfig({ plugins: [ // https://github.com/underfin/vite-plugin-vue2 Vue2({ target: 'esnext' }), // https://github.com/antfu/unplugin-vue2-script-setup ScriptSetup(), // https://github.com/antfu/unplugin-vue-components Components({ // generate `components.d.ts` global declarations dts: true, // auto import for directives directives: true, // resolvers for custom components resolvers: [ // Vuetify VuetifyResolver(), ], }), ], resolve: { alias: { '@': fileURLToPath(new URL('src', import.meta.url)) }, },})src/env.d.ts

提供类型支持:

/// <reference types="vite/client" />declare module '*.vue' { import type { DefineComponent } from 'vue' // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types const component: DefineComponent<{}, {}, any> export default component}declare module 'vuetify/lib/framework' { import 'vuetify/types' import Vuetify from 'vuetify' export default Vuetify}src/main.ts

入口文件,在此安装 VueCompositionAPI 与 Vuetify:

import Vue from 'vue'import VueCompositionAPI from '@vue/composition-api'import installVuetify from './plugins/vuetify'import App from './App.vue'Vue.use(VueCompositionAPI)const vuetify = installVuetify()const app = new Vue({ vuetify, render: h => h(App),})app.$mount('#app')src/App.vue

直接使用 <script setup> 语法:

<template> <v-app :theme="store.theme"> <v-app-bar /> <v-navigation-drawer /> <v-main app> <v-container /> </v-main> </v-app></template><script setup lang="ts">// This starter template is using Vue 3 <script setup> SFCs// Check out https://vuejs.org/api/sfc-script-setup.html#script-setupimport { onMounted } from '@vue/composition-api'import { useVuetify } from './plugins/vuetify'const vuetify = useVuetify()onMounted(() => { vuetify.theme.dark = true})</script>src/plugins/vuetify.ts

安装 Vuetify,并通过 useVuetify 暴露 $vuetify 实例:

// Stylesimport '@mdi/font/css/materialdesignicons.css'import 'vuetify/dist/vuetify.min.css'import Vue from 'vue'import Vuetify from 'vuetify'import { getCurrentInstance } from '@vue/composition-api'import { loadFonts } from './webfontloader'loadFonts()function installVuetify() { Vue.use(Vuetify) return new Vuetify({})}export default installVuetify/** Get vuetify instance (For Composition api) */export function useVuetify() { /** Get Instance */ const instance = getCurrentInstance() if (!instance) { throw new Error('Should be used in setup().') } return instance.proxy.$vuetify}src/plugins/webfontloader.ts

加载字体:

/** * plugins/webfontloader.js * * webfontloader documentation: https://github.com/typekit/webfontloader */export async function loadFonts() { const webFontLoader = await import('webfontloader') webFontLoader.load({ google: { families: ['Roboto:100,300,400,500,700,900&display=swap'], }, })}效果

启动项目

yarn dev

项目代码见 yandere-masonry

Reference

https://juejin.cn/post/7012240119465771038

https://github.com/logue/vite-vue2-vuetify-ts-starter

https://github.com/antfu/unplugin-vue2-script-setup

fin.

本文链接地址:https://www.jiuchutong.com/zhishi/309221.html 转载请保留说明!

上一篇:phpcms页面乱码怎么办(php运行乱码怎么办)

下一篇:ElementUI table无缝循环滚动(vue elementui table)

  • 魅族无线蓝牙耳机怎么连接(魅族无线蓝牙耳机)

    魅族无线蓝牙耳机怎么连接(魅族无线蓝牙耳机)

  • 电脑内存8g和16g有什么区别(电脑内存8g和16g的区别玩游戏)

    电脑内存8g和16g有什么区别(电脑内存8g和16g的区别玩游戏)

  • 荣耀play的陀螺仪功能需要进行设置吗(荣耀play陀螺仪开启)

    荣耀play的陀螺仪功能需要进行设置吗(荣耀play陀螺仪开启)

  • 苹果屏幕中间有个黑色的圆(苹果屏幕中间有个灰点)

    苹果屏幕中间有个黑色的圆(苹果屏幕中间有个灰点)

  • 微信绿码在哪里(微信绿码怎么弄出来)

    微信绿码在哪里(微信绿码怎么弄出来)

  • 充电宝刚买回来先放电还是先充电(充电宝刚买回来用为什么掉电快)

    充电宝刚买回来先放电还是先充电(充电宝刚买回来用为什么掉电快)

  • 华为mate30怎么关闭震动(华为mate30怎么关机)

    华为mate30怎么关闭震动(华为mate30怎么关机)

  • 操作数地址存放在寄存器的寻址方式叫(操作数地址存放在寄存器)

    操作数地址存放在寄存器的寻址方式叫(操作数地址存放在寄存器)

  • 一体机开不了机是什么原因(phlips一体机开不了机)

    一体机开不了机是什么原因(phlips一体机开不了机)

  • ldnal10是什么型号(ldnal20是什么型号)

    ldnal10是什么型号(ldnal20是什么型号)

  • 手机突然有音乐关不掉(华为手机突然有音乐)

    手机突然有音乐关不掉(华为手机突然有音乐)

  • 淘宝账户性别可以改吗(淘宝账号的性别可以随便改吗)

    淘宝账户性别可以改吗(淘宝账号的性别可以随便改吗)

  • 荣耀20pro多重(荣耀20pro有多重)

    荣耀20pro多重(荣耀20pro有多重)

  • 怎么给软件加密(华为手机怎么给软件加密)

    怎么给软件加密(华为手机怎么给软件加密)

  • vivos5怎么返回到桌面(vivoy52s手机怎么返回)

    vivos5怎么返回到桌面(vivoy52s手机怎么返回)

  • macbook air怎么注销id(macbook air怎么注销用户管理员)

    macbook air怎么注销id(macbook air怎么注销用户管理员)

  • 微信对方静音会显示吗(微信对方静音了还会有声音吗)

    微信对方静音会显示吗(微信对方静音了还会有声音吗)

  • 麒麟970和980区别(麒麟970和麒麟980差距有多大)

    麒麟970和980区别(麒麟970和麒麟980差距有多大)

  • cad图元不能被正确识别(cad图元无法用自身圆角)

    cad图元不能被正确识别(cad图元无法用自身圆角)

  • 克罗地亚佩列沙茨半岛附近的风筝冲浪者和风帆冲浪者 (© helivideo/Getty Images)(克罗地亚佩列沙茨)

    克罗地亚佩列沙茨半岛附近的风筝冲浪者和风帆冲浪者 (© helivideo/Getty Images)(克罗地亚佩列沙茨)

  • 自定义“发送到”菜单(自定义发件人邮件)

    自定义“发送到”菜单(自定义发件人邮件)

  • sftp命令  加密传输FTP文件(sftp 加密算法)

    sftp命令 加密传输FTP文件(sftp 加密算法)

  • Python之PyArmadillo计算库的产生(python lzo)

    Python之PyArmadillo计算库的产生(python lzo)

  • 小规模纳税人收入是含税还是不含税
  • 车辆使用费属于什么税收分类
  • 普惠性幼儿园是非盈利幼儿园吗
  • 出售技术所有权的会计分录
  • 年终奖1月发放能算上一年吗
  • 金蝶旗舰版的现金流量表怎么导出
  • 2020年建筑企业税收优惠政策
  • 红字信息表已核销不允许撤销
  • 企业接受赠予企业固定资产是否免税
  • 销售自己使用过的固定资产如何开票
  • 递延收益没有应列入哪个科目
  • 个人怎么捐赠物资
  • 摊销直线法会计分录怎么写?
  • 公司转工程款到个人银行卡需要交个税吗
  • 客户想免费拿样
  • 分公司往子公司投资如何做税务处理?
  • 季节性停工损失属于期间费用吗
  • 水产养殖公司的经营范围_问答
  • 契税与印花税能抵扣吗
  • 进项税额有哪些明细科目
  • 物业公司收入多少钱
  • 醋开票属于什么类
  • 非居民企业取得股息红利企业所得税
  • 营业收入在财务报表上跟实际多出来怎么解释
  • 土地补偿款属于专项资金吗
  • 小规模所得税申报表填写样本
  • 费用转入本年利润
  • 挂靠别人的资质进行房屋建筑会计怎样做账?
  • windows hello用不了怎么办
  • 个人开票给公司有什么风险
  • win11开机后
  • 从银行提取备用金填制什么凭证
  • 金融保险属于什么行业
  • 企业所得税调增调减怎么理解
  • 购买的烟酒怎么入账科目
  • PHP:xml_set_start_namespace_decl_handler()的用法_XML解析器函数
  • ev4是什么文件
  • 税费缴纳比例
  • 国家占耕地补偿款给谁?
  • linux系统如何更改主机名
  • php yii框架
  • 分公司能不能独立法人
  • 未按规定采取预防措施,导致发生严重突发事件的
  • 图卷积神经网络原理
  • 开发成本结转开发产品条件
  • php 文件传输
  • 企业的研发支出
  • 企业接受捐赠资产属于什么科目
  • python继承例子
  • 设备计提折旧从什么时候开始
  • 保险费计入固定资产原值吗
  • 物业公司电费最多可以收多少钱一度
  • 百旺税控盘跨月发票作废
  • 私车公用可以报销哪些费用
  • 个人写收据要写身份证号吗
  • 福利费用属于哪个部门
  • 进项税转出金额怎么算
  • 押金和租金
  • 债务抵销的条件
  • 未完工属于什么科目
  • 研发费用加计扣除的条件
  • 补缴社保的利息会进入个人账户里吗
  • 商业医疗保险的缺点
  • 如何记账固定资产成本
  • sql联合主键设置外键
  • freebsd操作命令
  • windows累积更新失败怎么办
  • linux开发android好处
  • js时间范围
  • 如何从0开始赚钱
  • 浏览器如何批量打开网址
  • js怎么使用
  • three.js 教程
  • unity改vs版本
  • css实现无缝滚动
  • 税务系统干部选拔任用工作树立导向
  • 国家税务局发票查询
  • 印花税在哪里查询
  • 厦门象屿正式员工招聘
  • 进口小麦关税税率是多少
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设