使用Vite创建Vue3+TS项目并整合Element Plus框架等一条龙服务

news/2024/4/20 16:00:48/文章来源:https://blog.csdn.net/Cai181191/article/details/129269078

记录一下使用Vite创建Vue3+TS项目以及整合Element Plus框架,还有Less、Pinia、Vue-router、monaco-editor等插件或组件。

一、使用Vite创建Vue3+TS项目

第一步:在桌面新建一个temp文件夹,然后在VS Code打开,打开一个终端;

第二步:创建一个Vite项目

npm create vite@latest(1) 输入项目名,如: vue3_vite_ts_less_element_plus ,然后回车
? Project name: » vue3_vite_ts_less_element_plus(2) 选择 Vue 框架,回车
? Select a framework: » - Use arrow-keys. Return to submit.Vanilla
>   VueReactPreactLitSvelteOthers(3) 选择数据类型,回车
? Select a variant: » - Use arrow-keys. Return to submit.JavaScript
>   TypeScriptCustomize with create-vue ↗Nuxt ↗(4) 创建完成,运行项目
Done. Now run: cd vue3_vite_ts_less_element_plusnpm installnpm run devPS C:\Users\Administrator\Desktop\temp> 

二、配置 @ 别名

第一步:修改 vite.config.ts 配置文件

修改前:

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'// https://vitejs.dev/config/
export default defineConfig({plugins: [vue()],
})

修改后:

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'/*** 详情见 vitejs 文档:https://vitejs.dev/config/*/
export default defineConfig({plugins: [vue()],resolve: {alias: {'@': resolve(__dirname, './src')}}
})

第二步:修改 tsconfig.json 配置文件

修改前:

{"compilerOptions": {"target": "ESNext","useDefineForClassFields": true,"module": "ESNext","moduleResolution": "Node","strict": true,"jsx": "preserve","resolveJsonModule": true,"isolatedModules": true,"esModuleInterop": true,"lib": ["ESNext", "DOM"],"skipLibCheck": true,"noEmit": true},"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],"references": [{ "path": "./tsconfig.node.json" }]
}

修改后:

{"compilerOptions": {"target": "ESNext","useDefineForClassFields": true,"module": "ESNext","moduleResolution": "Node","strict": true,"jsx": "preserve","resolveJsonModule": true,"isolatedModules": true,"esModuleInterop": true,"lib": ["ESNext", "DOM"],"skipLibCheck": true,"noEmit": true,"paths": {"@": ["src"],"@/*": ["src/*"]}},"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],"references": [{ "path": "./tsconfig.node.json" }]
}

第三步:配置成功!

三、整合 Element Plus 框架

第一步:导入依赖包

npm i element-plus

第二步:在项目的 src 目录新建 plugins 文件夹,里面再新建 element-plus.ts 文件,写入以下代码

import ElementPlus from 'element-plus'
import 'element-plus/theme-chalk/index.css'
import zhCn from 'element-plus/es/locale/lang/zh-cn' // 汉化 element-plus 组件export default (app: any) => {app.use(ElementPlus, {locale: zhCn,})
}

第三步:在项目的 main.ts 文件夹引入和使用该插件和注册图标,即整合完成,main.ts 文件如下所示

import { createApp } from 'vue'
import App from './App.vue'
import './global.less' // 全局样式const app = createApp(App)// 引入 ElementPlus 插件(npm i element-plus)
import ElementPlusPlugin from '@/plugins/element-plus'// 全局注册 ElementPlus 图标组件(npm install @element-plus/icons-vue)
import * as ElementPlusIcons from '@element-plus/icons-vue'
for(const [key, component] of Object.entries(ElementPlusIcons)) {app.component(key, component)
}app
.use(ElementPlusPlugin)
.mount('#app')

第四步:验证整合成功,在项目的 App.vue 文件夹,例如写个按钮标签,保存即可看到效果,App.vue 文件如下所示

<template><el-buttonsize="small"type="primary"icon="UploadFilled"@click="void(0)">点击事件</el-button><el-button size="small" type="primary" plain @click="void(0)"><el-icon :size="18"><UploadFilled /></el-icon><span>点击事件</span></el-button><el-buttonsize="small"type="primary"circle><el-icon :size="18"><UploadFilled /></el-icon></el-button><el-icon:size="20"style="color: #5e7ce0; cursor: pointer"@click="void(0)"><UploadFilled /></el-icon>
</template><style lang="less">* {margin: 0;padding: 0;}html, body {width: 100%;height: 100%;margin: 0;padding: 0;border: none;}#app {width: 100%;height: 100%;font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;}
</style>

四、整合 vue-router、pinia、less 等插件

第一步:查看vue-router所有版本,以及指定一个较新的版本来安装,使用方式和以前一致

npm view vue-router versions --json
npm i vue-router@4.1.0

第二步:安装pinia,听说Vuex拥抱ts没有Pinia好,使用方式见官网(Pinia 中文文档)

npm i pinia

第三步:安装less/scss,看个人使用习惯来安装

npm i less
npm i scss

第四步、其他插件的整合也差不多的,再来个封装使用Axios插件

使用Vue Cli创建Vue3+TS项目并整合Element Plus框架以及封装使用Axios插件_帅龍之龍的博客-CSDN博客

五、整合微软在线代码编辑器 monaco-editor 插件,该插件能够轻松实现,在线浏览仅一个页面就超过30万行代码或日志,快速渲染高亮文本却不卡的功能

第一步:查看 monaco-editor 版本

npm view monaco-editor versions --json

第二步:安装指定版本的 monaco-editor

npm i monaco-editor@0.33.0

第三步:将 App.vue 改为以下代码

<template><div class="m-e" id="m-e-id"><div class="m-e-main"><div class="m-e-main_toolbar" :style="isThemeLightOrBlack ? 'background-color: #fff; box-shadow: 0px 2px 5px #ddd;' : 'background-color: #1e1e1e; box-shadow: 0px 2px 5px #111;'"><div class="m-e-main_toolbar_left"><span>日志 - {{ title }}</span></div><div class="m-e-main_toolbar_right" :style="isThemeLightOrBlack ? 'color: #000' : 'color: #fff'"><a title="查找" @click="findByKeyword"><i class="fa fa-search"/></a><a title="回到顶部" @click="scrollToTop"><i class="fa fa-chevron-circle-up"/></a><a title="回到底部" @click="scrollToBottom"><i class="fa fa-chevron-circle-down"/></a><a title="是否截断换行" @click="setEditorWordWrap"><i class="fa fa-bars"/></a><a title="切换白天或暗夜模式" @click="setEditorTheme"><i class="fa fa-adjust"/></a><a :title="fullScreen ? '退出全屏' : '全屏显示'" @click="handleFullScreenClick"><i :class="fullScreen ? 'fa fa-compress' : 'fa fa-expand'"/></a><a title="下载日志" @click="handleDownloadLogClick"><i class="fa fa-cloud-download" style="position: relative; top: 0px"/></a></div></div><div :id="id" class="m-e-main_container" :style="'height: calc(100% - 40px)'"></div></div></div>
</template><script>
// 引入获取原始数据组件
import { toRaw } from 'vue'// 引用 font-awesome 资源
import 'font-awesome/css/font-awesome.min.css';// 引入 monaco-editor 组件
import * as me from 'monaco-editor'export default {data: () => ({editor: null,// 编辑器对象id: null,// 编辑器DOM节点IDtitle: '',// 编辑器标题content: '',// 编辑器内容height: 'auto',// 编辑器高度readOnly: false,// 编辑器是否禁用isScrollToBottom: false, // 是否滚动到底部// 其他配置项...fullScreen: false,// 是否全屏状态wordWrap: false,// 当单行文本太长时截断换行,true 为换行,false 为不换行isThemeLightOrBlack: false,// 明亮或暗夜模式,true 为白天模式,false 为暗夜模式}),mounted() {this.newME()/*** 监听全屏显示状态*/let that = this;window.onresize = function() {if (!document.fullscreenElement) {that.fullScreen = false;} else {that.fullScreen = true;} }},watch: {},methods: {/** */newME() {this.id = 'me_czq' // 随便起一个DOM节点ID名称this.title = '帅龍之龍' // 随便起一个编辑器标题this.content = 'Hello,World!' // 随便写入一点编辑器内容this.initMonacoEditor(this.id, this.content, this.readOnly)},/*** 实例化在线代码编辑器* * 文档地址:https://microsoft.github.io/monaco-editor/api/index.html*/async initMonacoEditor(id, content, readOnly) {try {// 异步获取节点,确保 Dom 节点已经渲染完成,不可删await document.getElementById(this.id);this.editor = me.editor.create(document.getElementById(id), {value: content,// 编辑器内容language: 'python',// 选择支持语言automaticLayout: true,// 是否自动布局theme: 'vs-dark',// 官方自带三种主题:vs、hc-black、vs-darkreadOnly: readOnly,// 设置是否只读wordWrap: this.wordWrap ? 'on' : 'off',// 设置启用截断功能scrollBeyondLastLine: false,// 滚动完最后一行后再滚动一屏幕// 滚动条// scrollbar: {//   verticalScrollbarSize: 15,//   horizontalScrollbarSize: 15// },// 是否开启小地图minimap: {enabled: true},});} catch (e) {console.error(e)}// 设置编辑器滚动到最底部// this.scrollToBottom();},/*** 设置编辑器的内容且滚动到最底部*/setEditorContent(val) {toRaw(this.editor).setValue(val);this.scrollToBottom();},/*** 获取编辑器的内容*/getEditorContent() {toRaw(this.editor).getValue();},/*** 打开编辑器查找功能*/findByKeyword() {try {// 先聚焦编辑器toRaw(this.editor).focus();// 从模型中获取要查找的字符串范围 new Range(startLineNumber, startColumn, endLineNumber, endColumn)toRaw(this.editor).setSelection(new me.Range(1, 9999, 1, 10000));// 触发查找操作// toRaw(this.editor).getAction('actions.find').run();// 查找方式一toRaw(this.editor).trigger('', 'actions.find');// 查找方式二} catch(error) {console.log(error);}},/*** 设置编辑器从只读变成可写*/setEditorRW() {toRaw(this.editor).updateOptions({readOnly: false});},/*** 设置编辑器开关截断功能*/setEditorWordWrap() {this.wordWrap = this.wordWrap ? false : true;if (this.wordWrap) {toRaw(this.editor).updateOptions({wordWrap: 'on'});} else {toRaw(this.editor).updateOptions({wordWrap: 'off'});}},/*** 设置编辑器明亮或暗夜模式*/setEditorTheme() {this.isThemeLightOrBlack = this.isThemeLightOrBlack ? false : true;if (this.isThemeLightOrBlack) {toRaw(this.editor).updateOptions({theme: 'vs'});} else {toRaw(this.editor).updateOptions({theme: 'vs-dark'});}},/*** 设置编辑器滚动到最顶部*/scrollToTop() {toRaw(this.editor).setScrollPosition({scrollTop: 0});},/*** 设置编辑器滚动到最底部*/scrollToBottom() {toRaw(this.editor).revealLine(toRaw(this.editor).getModel().getLineCount());},/*** 全屏显示句柄*/handleFullScreenClick () {const element = document.getElementById('m-e-id');if (!document.fullscreenElement) {element.requestFullscreen();} else {document.exitFullscreen();} },/*** 下载日志句柄*/handleDownloadLogClick() {this.exportFile(this.title, this.content);},/*** 下载日志*/exportFile(name, data) {let url = window.URL || window.webkitURL || window;let blob = new Blob([data]);let event = document.createEvent("MouseEvents");event.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);let link = document.createElementNS("http://www.w3.org/1999/xhtml", "a");link.href = url.createObjectURL(blob);link.download = name;link.dispatchEvent(event);}},/*** 销毁在线代码编辑器*/beforeDestroy() {if (toRaw(this.editor)) {toRaw(this.editor).dispose()}},
}
</script><style lang="less" scoped>.m-e {width: 100%;height: 100%;.m-e-main {width: 100%;height: 100%;.m-e-main_toolbar {width: 100%;height: 40px;box-shadow: 0px 2px 5px #000;display: flex;position: relative;z-index: 99;.m-e-main_toolbar_left {flex: 1;overflow: hidden;span {color: #fff;display: block;font-size: 15px;padding-left: 10px;line-height: 26px;line-height: 40px;white-space:nowrap;/* 不换行 */overflow:hidden;/* 内容超出宽度时隐藏超出部分的内容 */text-overflow:ellipsis;/* 当对象内文本溢出时显示省略标记(...) ;需与overflow:hidden;一起使用。*/// user-select: none;}}.m-e-main_toolbar_right {margin-right: 15px;display: flex;a {width: 16px;height: 16px;line-height: 16px;transition: ease all 0.3s ;text-align: center;display: inline-block;padding: 5px;cursor: pointer;border-radius: 2px;margin: 7px 0 7px 5px;i {font-size: 15px;}&:hover {background-color: rgba(255, 255, 255, 0.1);}}}}}}
</style>

Tip:如何降低 vite 版本?

第一步:删除项目中的 node_modules 目录

第二步:删除项目中的 package-lock.json 文件

第三步:安装指定版本的 vite

npm i vite@3.0.0 -D

第四步:安装指定版本的 @vitejs/plugin-vue

npm i @vitejs/plugin-vue@3.0.0 -D

第五步:重新执行导入依赖指令,若出现两个vite版本的报错,重复步骤一和步骤二后,再重新导入依赖

npm i

第六步:启动项目,运行正常

npm run dev

报错问题

问题一:找不到名称“__dirname”。

原因:path 模块是 node.js 的内置模块,而 node.js 默认不支持 ts 文件的

解决:安装 @type/node 依赖包 npm install @types/node --save-dev

vue3+vite+ts 配置@时vscode报找不到__dirname的问题_vite __dirname_yuhaiyang11的博客-CSDN博客

问题二:未设置 "baseUrl" 时,不允许使用非相对路径。是否忘记了前导 "./"?。

解决:

{"compilerOptions": {..."baseUrl": ".",    // 未设置 "baseUrl" 时,不允许使用非相对路径。"paths": {"@": ["src"],"@/*": ["src/*"]}},...
}

问题三:找不到模块“./App.vue”或其相应的类型声明。

解决:在src目录新建shims-vue.d.ts文件,文件内容为以下代码

/* eslint-disable */
declare module '*.vue' {import type { DefineComponent } from 'vue'const component: DefineComponent<{}, {}, any>export default component
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_75778.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【原创】java+swing+mysql校园订餐管理系统设计与实现

校园订餐管理系统&#xff0c;主要是为了方便广大学生点餐使用&#xff0c;以往的大多数的校园订餐系统基本使用bs架构&#xff0c;也就是网页系统&#xff0c;但是我们今天不用javaweb&#xff0c;我们主要介绍javaswing同样可以去实现一个校园订餐管理系统。 功能分析&#…

「TCG 规范解读」规范结构

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…

软测入门(一)测试理念及基础知识

软测入门理念 软件的分类 按层次划分&#xff1a;系统软件、应用软件按组织划分&#xff1a;商业软件、开源软件按结构划分&#xff1a;单机软件、 软件缺陷 由来 Grace Hopper发明Cobol计算机语言&#xff0c;也是找出电脑程序中第一个bug的女程序员 BugDefect 定义 软…

带你掌握webSocket 和 socket.io的基本用法

两者的作用和区别 作用&#xff1a;使得前后端可以随时地相互沟通。什么是互相沟通呢&#xff1f;像网络请求这种就是客户端向服务端的单向的沟通&#xff0c;当然&#xff0c;网络请求也可以实现双向的沟通&#xff0c;比如ajax 轮询&#xff0c;就是浏览器开个定时器不断的发…

【Java】Java进阶学习笔记(四)—— 抽象类与接口

【Java】Java进阶学习笔记&#xff08;四&#xff09;—— 抽象类与接口一、抽象类1、抽象类的概念抽象类的定义格式2、抽象类的注意点抽象方法的介绍3、抽象类的具体作用4、抽象类实例二、接口&#xff08;一&#xff09;、接口的概念1、接口与类的区别2、接口特性3、抽象类和…

如何实现云原生?推荐的几个实用工具

云原生是一种软件开发和部署的方法&#xff0c;它依赖于容器、微服务和自动化运维。它能使应用更高效、可靠和可扩展&#xff0c;并适用于不同的云平台。 如果要更直接、更通俗地解释上述概念的话。 云的本源更准确地说是一种文化&#xff0c;一种潮流&#xff0c;它必然是云…

此网站可能不支持TLS1.2协议

问题描述 火狐浏览器版本&#xff1a;“97.0.1 (64 位)”&#xff0c;打开360网神设备Web管理地址时出现&#xff1a;“此网站可能不支持TLS1.2协议&#xff0c;而这是Firefox支持的最低版本。”&#xff0c;如下图所示。 原本是默认使用https协议打开的&#xff0c;看起来出问…

蓝桥杯每日一题:不同路径数(dfs深度优先)

给定一个 nm的二维矩阵&#xff0c;其中的每个元素都是一个 [1,9] 之间的正整数。 从矩阵中的任意位置出发&#xff0c;每次可以沿上下左右四个方向前进一步&#xff0c;走过的位置可以重复走。 走了 k 次后&#xff0c;经过的元素会构成一个 (k1) 位数。 请求出一共可以走出…

零基础机器学习做游戏辅助第十五课--原神自动钓鱼(五)完整效果

一、先上效果二、整理思路我们现在已经具备了所有需要的技术&#xff0c;我们梳理出所有技术的流程。判断当前钓鱼状态&#xff08;未抛竿、已抛竿、上鱼中&#xff09;。未抛竿&#xff0c;截图并识别图中所有鱼类&#xff0c;选择其中一个种类。根据以选择鱼类选择对应鱼饵。…

从一个实例配置引入Prometheus的PromQL语法

1. PromQL介绍 PromQL提供对时间序列数据进行逻辑运算、过滤、聚合的支持。应用于数据查询、可视化、告警处理 2. 基本用法 2.1 查询时间序列 点击Prometheus图标,进行查询页面。可以点击地图图标查看有哪些metrics name。输入要查询的metrics name和过滤条件,然后点击执行…

2023年功能测试还值得入行吗?

前言 鉴于笔者从13年入行IT行业&#xff0c;经历了只有开发没有测试的阶段&#xff0c;经历了14年只要会基本的功能测试在一线就能薪资过万的阶段&#xff0c;经历了17年只要会一点自动化&#xff0c;会一点性能就能蒙骗过面试官的阶段&#xff0c;更经历了19年所有面试官对于…

基于大规模边缘计算的千万级聊天室技术实践

当前直播成为一种流行趋势&#xff0c;带货直播&#xff0c;网红带货&#xff0c;明星在线演唱会等&#xff0c;进一步使得直播聊天室变成了一个当前必备的能力&#xff0c;面向大型&#xff0c;超大型的直播场景&#xff0c;技术上也在不断的进行迭代更新。 大规模边缘聊天室如…

如何或者无插件Web页面监控播放软件LiveNVR的固定视频流地址,实现大屏上墙、播放、视频分析等目的

1、LiveNVR介绍 LiveNVR的安防监控的视频直播&#xff0c;可以按标准的Onvif/RTSP协议接入监控设备&#xff0c;也可以通过海康、大华、天地伟业等厂家私有SDK接入监控&#xff0c;实现web页面的播放和录像回放。 可以分发HTTP-FLV、WS-FLV、WebRTC、RTMP、HLS(M3U8)、RTSP等多…

全球化趋势下,如何建设稳定高效的技术能力?

如果将全球化比作一场航行&#xff0c;每个期望走出去的企业都是水手&#xff0c;那么是造一艘属于自己的船&#xff0c;还是搭乘已有的船呢&#xff1f;在不同的时间和场景下&#xff0c;相信每个水手都有自己的答案。 近几年&#xff0c;在国际政经环境复杂变幻的形势之下&am…

ImportError: Can not find the shared library: libhdfs3.so解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…

活动回顾|中文社区面对面·上海站

回顾来了&#xff01; 「中文社区面对面」首次线下交流活动&#xff0c;于 2 月 26 日下午在上海德必世纪 WE 成功举办&#xff0c;迎来了 30 位上海小伙伴的热情参与&#xff01;Jina AI 高级算法工程师王峰博士与大家分享 Jina AI 的“三驾马车”&#xff0c;百万粉丝B站效率…

4.文件管理

文章目录1、初识文件管理1.1、回顾1.2、文件的属性1.3、无结构文件/有结构文件1.4、文件之间应该怎样组织起来&#xff1f;1.5、操作系统应该向上提供哪些功能&#xff1f;1.6、从上往下看&#xff0c;文件应如何存放在外存&#xff1f;1.7、其他需要由操作系统实现的文件管理功…

【蓝桥杯嵌入式】点亮LED灯,流水灯的原理图解析与代码实现——STM32

&#x1f38a;【蓝桥杯嵌入式】专题正在持续更新中&#xff0c;原理图解析✨&#xff0c;各模块分析✨以及历年真题讲解✨都在这儿哦&#xff0c;欢迎大家前往订阅本专题&#xff0c;获取更多详细信息哦&#x1f38f;&#x1f38f;&#x1f38f; &#x1fa94;本系列专栏 - 蓝…

实践数据湖iceberg 第四十二课(业界视野)业界的流批一体架构

系列文章目录 实践数据湖iceberg 第一课 入门 实践数据湖iceberg 第二课 iceberg基于hadoop的底层数据格式 实践数据湖iceberg 第三课 在sqlclient中&#xff0c;以sql方式从kafka读数据到iceberg 实践数据湖iceberg 第四课 在sqlclient中&#xff0c;以sql方式从kafka读数据到…

React(三):脚手架、组件化、生命周期、父子组件通信、插槽、Context

React&#xff08;三&#xff09;一、脚手架安装和创建1.安装脚手架2.创建脚手架3.看看脚手架目录4.运行脚手架二、脚手架下从0开始写代码三、组件化1.类组件2.函数组件四、React的生命周期1.认识生命周期2.图解生命周期&#xff08;1&#xff09;Constructor&#xff08;2&…