vue3+vite+typescript+pinia+element_plus构建web项目

1.vite搭建

yarn create vite
可能会提示node版本不支持,需要根据提示升级或降级node版本

 使用nvm下载对应版本

nvm download 18.x.xnvm use 18.x.x// 需要安装yarn
npm install -g yarn// 重新执行
yarn create vite

过程中会提供选择,分别选择vue、typescript,然后根据提示定位到项目,yarn安装默认依赖

 2.安装router

yarn add vue-router

 新建一个基础vue文件

<template><router-view v-slot="{ Component }"><keep-alive><component :is="Component" v-if="$route.meta.keepAlive"/></keep-alive><component :is="Component" v-if="!$route.meta.keepAlive"/></router-view>
</template>

新建home文件夹,index页面 

<template><div>home</div>
</template><script lang="ts" setup>
</script><style scoped></style>

新建router文件夹,index.ts

import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'
import ViewBase from '../views/viewBase.vue'const routes: RouteRecordRaw[] = [{path: '/',name: 'index',redirect: '/home/index',component: ViewBase,children: [{path: '/home',redirect: '/home/index',component: ViewBase,children: [{path: 'index',name: 'home',component: () => import('../views/home/index.vue'),meta: {title: '首页', keepAlive: false}},]},]}
]
const router = createRouter({history: createWebHashHistory(),routes
})
export default router

main.ts文件中使用router

import { createApp } from 'vue'
import router from './router' // 路由
import App from './App.vue'createApp(App).use(router).mount('#app')

给路由跳转添加css效果nprogress

yarn add nprogress
// router/index.tsimport NProgress from 'nprogress'
import 'nprogress/nprogress.css'router.beforeEach((to, from, next) => {NProgress.start()next()
})
router.afterEach(() => {NProgress.done()
})

3.安装pinia

yarn add pinia pinia-plugin-persistedstate

 main.ts

import { createApp } from 'vue'
import './style.css'
import router from './router' // 路由
import { createPinia } from 'pinia' // 状态管理
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' // 持久化
import App from './App.vue'createApp(App).use(createPinia().use(piniaPluginPersistedstate)).use(router).mount('#app')

新建store文件夹,user.ts

import { defineStore } from 'pinia'
export const userStore = defineStore('user', {state: () => ({userInfo: {userId: 0,userName: ''}}),persist: true // 持久化
})

 在home页面获取userId

<template><div>home</div><div>{{userInfo.userId}}</div>
</template><script lang="ts" setup>import { userStore } from "../../store/user"import { storeToRefs } from 'pinia'const user = userStore()const { userInfo } = storeToRefs(user) // 保持响应
</script><style scoped></style>

4.安装element-plus

unplugin-auto-import和 unplugin-vue-components 自动引入组件和按需引入插件、@element-plus/icons-vue @iconify-json/ep unplugin-icons图标需要额外安装才能使用。

yarn add element-plus @element-plus/icons-vue @iconify-json/ep
yarn add unplugin-auto-import unplugin-vue-components unplugin-icons -D

vite.config.ts

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
// ElementPlus
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
// 图标
import Icons from 'unplugin-icons/vite'
import IconsResolver from 'unplugin-icons/resolver'// https://vitejs.dev/config/
export default defineConfig({plugins: [vue(),AutoImport({resolvers: [// 自动导入element-plus组件ElementPlusResolver(),// 自动导入图标组件IconsResolver({prefix: 'Icon',})],include: [/\.[tj]sx?$/, // .ts, .tsx, .js, .jsx/\.vue$/,/\.vue\?vue/, // .vue/\.md$/ // .md],// 自动导入vue,vue-router相关函数,如ref,reactiveimports: ['vue', 'vue-router', '@vueuse/core'],// 可以选择auto-import.d.ts生成的位置,使用ts建议设置为'src/auto-import.d.ts'dts: 'src/auto-import.d.ts',}),// 自动下载图标Icons({autoInstall: true,compiler: 'vue3'}),Components({resolvers: [ElementPlusResolver(),IconsResolver({// icon前缀默认i,使用方式:<i-ep-xxx/>// prefix: 'i',// 指定图标集epenabledCollections: ['ep']})],dirs: ['src/components']})],
})

 使用方式:

<i-ep-edit/>

5.安装axios

yarn add axios

 新建http文件夹,index.ts

// 根据接口逻辑不同调整import axios from 'axios'const $http = axios.create({timeout: 200000,
})$http.defaults.headers.post['Content-Type'] = 'application/json; charset=utf-8'$http.interceptors.request.use(config => {config.url = '/api' + config.urlreturn config
})$http.interceptors.response.use(function (response) {const code = response.data?.codeif (code === 0) {return response} else {return Promise.reject(response.data)}},function (error) {// Do something with response errorreturn Promise.reject(error)}
)

新建一个接口文件

// list.tsimport $http from '../index'export function fetchList(): any {return $http({url: '/list',method: 'GET'})
}

页面中使用

<script lang="ts" setup>import { fetchList } from '../../http/api/list'onMounted(() => {fetchList().then(res => {const data = res.data?.data || []console.log('data', data)}).catch(e => {ElMessage.error('error:' + e)})})
</script>

当后端接口没有写好时,前端使用mock数据调试,安装mock插件

yarn add vite-plugin-mock mockjs -D

配置 

// vite.config.tsimport { viteMockServe } from 'vite-plugin-mock'//plugins中加入viteMockServe()

根目录新建文件夹mock,list.ts

import { MockMethod } from 'vite-plugin-mock'export default [{url: '/api/list',method: 'get',response: () => {return {"code": 0,"message": "","data": [{id: 1,name: 'Alice'}]}}}
] as MockMethod[]

6.安装less

yarn add less less-loader -D

7.其他配置

(1)src文件夹简写为@

// vite.config.tsimport path from 'path'export default defineConfig({plugins: [...],resolve: {// 简写alias: {'@': path.resolve(__dirname, 'src')}}
})// tsconfig.json{compilerOptions: {"baseUrl": "./","paths":{"@/*": ["src/*"]}}
}

(2)vue、lodash-es/nprogress等插件类型声明

// vite-env.d.ts/// <reference types="vite/client" />declare module '*.vue' {import type { DefineComponent } from 'vue'const component: DefineComponent<{}, {}, any>export default component
}declare module 'lodash-es'
declare module 'nprogress'

(3)vue.config.ts配置

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
// ElementPlus
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
// 图标
import Icons from 'unplugin-icons/vite'
import IconsResolver from 'unplugin-icons/resolver'
// mock
import { viteMockServe } from 'vite-plugin-mock'
import path from 'path'// https://vitejs.dev/config/
export default defineConfig({plugins: [vue(),AutoImport({resolvers: [// 自动导入element-plus组件ElementPlusResolver(),// 自动导入图标组件IconsResolver({prefix: 'Icon',})],include: [/\.[tj]sx?$/, // .ts, .tsx, .js, .jsx/\.vue$/,/\.vue\?vue/, // .vue/\.md$/ // .md],// 自动导入vue,vue-router相关函数,如ref,reactiveimports: ['vue', 'vue-router', '@vueuse/core'],// 可以选择auto-import.d.ts生成的位置,使用ts建议设置为'src/auto-import.d.ts'dts: 'src/auto-import.d.ts',}),// 自动下载图标Icons({autoInstall: true,compiler: 'vue3'}),Components({resolvers: [ElementPlusResolver(),IconsResolver({// icon前缀默认i,使用方式:<i-ep-xxx/>// prefix: 'i',// 指定图标集epenabledCollections: ['ep']})],dirs: ['src/components']}),viteMockServe()],resolve: {// 简写alias: {'@': path.resolve(__dirname, 'src')}},server: {host: '127.0.0.1',port: 9000,open: true,https: false,proxy: {'/api': {target: 'https://xx.xx.xx.xx',secure: false,changeOrigin: true,timeout: 600 * 1000}}},// 生产环境打包配置build: {minify: 'terser',terserOptions: {//去除 console debuggercompress: {drop_console: true,drop_debugger: true}},assetsDir: '',outDir: path.resolve(__dirname, '../resources/static'),rollupOptions: {output: {chunkFileNames: 'js/[name]-[hash].js',entryFileNames: 'js/[name]-[hash].js',assetFileNames: '[ext]/[name]-[hash].[ext]',manualChunks(id) { //静态资源分拆打包if (id.includes('node_modules')) {return id.toString().split('node_modules/')[1].split('/')[0].toString()}}},}},optimizeDeps: {include: ['lodash-es']}
})

(4)基本样式,新建style文件夹,index.less,reset.less,custom.less

// index.less@import './reset.less' // 覆盖浏览器默认样式
@import './custom.less' // 自定义公共样式//main.tsimport '@/assets/style/index.less'
// reset.lessbody,
#app {margin: 0;font-size: 12px;
}html,
body,
#app {height: 100%;min-width: 1100px;margin: 0;padding: 0
}
.container{font-size: 12px;
}body {overflow-y: hidden;
}#app {font-family: Microsoft YaHei, 'Avenir', Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;color: #606266;
}ul {list-style-type: none;
}ul,
ol {list-style: none
}:link,
:visited,
ins {text-decoration: none
}:focus {outline: 0
}@media (min-device-width: 375px) and (max-device-width: 667px) and (-webkit-min-device-pixel-ratio: 2) {html {font-size: 117.1875px}
}@media (min-device-width: 414px) and (max-device-width: 736px) and (-webkit-min-device-pixel-ratio: 3) {html {font-size: 129.375px}
}

 

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

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

相关文章

MySQL 实例student表综合查询

目录 例题&#xff1a; 1、查询student表的所有记录 2、查询student表的第2条到4条记录 3、从student表查询所有学生的学号&#xff08;id&#xff09;、姓名&#xff08;name&#xff09;和院系&#xff08;department&#xff09;的信息 4、从student表中查询计算机系和英…

逆向案例二十一——遇到混淆怎么办

开始新的板块尝试&#xff0c;混淆了怎么办 网址&#xff1a;极简壁纸_海量电脑桌面壁纸美图_4K超高清_最潮壁纸网站 抓包抓到&#xff0c;好久没做解密了&#xff0c;奥里给干他&#xff01;&#xff1a; 搜索关键字&#xff0c;打上断点&#xff0c;点击第二页。 _0x10a345…

关于光模块SFP-10G-SR、SFP-10G-LRM和SFP-10G-LR的对比分析

万兆光模块是万兆网络搭建领域中的重要组成部分&#xff0c;是传输万兆速率必要组件。随着网络速率和容量需求的增加&#xff0c;目前万兆光模块的应用量非常大。而在万兆光模块中&#xff0c;短距离光模块的出货量居首&#xff0c;本文将详细介绍3款短距离万兆光模块SFP-10G-S…

PyCharm Pro 2024:卓越的Python编辑开发工具,适用于Mac与Windows平台

PyCharm Pro 2024是一款专为Python开发者设计的强大编辑开发工具&#xff0c;无论是Mac还是Windows用户&#xff0c;都能从中受益良多。该软件凭借其出色的性能、丰富的功能和卓越的用户体验&#xff0c;成为Python编程界的翘楚。 作为一款高效的Python编辑器&#xff0c;PyCh…

什么是MOV视频格式?如何把MP4视频转MOV视频格式?

一&#xff0c;前言 当然可以&#xff0c;MP4视频可以转换为MOV格式。这两种格式都是常见的视频文件格式&#xff0c;它们都可以用于存储和播放视频内容。虽然它们的编码方式和特性有所不同&#xff0c;但使用合适的视频转换工具可以轻松地将MP4视频转换为MOV格式。 二&#…

React-样式使用

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;React篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容:React-样式使用 目录 1、行内样式 2、使用className属性 3、css module模块化 4、styled-c…

sidusv指标,fpmarkets澳福愿称之为最强辅助指标

做投资的最怕的就是犹豫不定&#xff0c;抓不住交易的机会&#xff0c;最后又后悔不及。现在不用怕了&#xff0c;fpmarkets澳福今天分享愿称之为最强辅助指标——sidusv指标。可以帮助投资者轻松把握交易时机。 sidusv指标通过箭头指示进入点;红色的是卖出位置&#xff0c;绿色…

linux学习:结构体、联合体、枚举

目录 结构体 例子 大小 联合体 例子 大小 枚举 例子 大小 结构体 结构体就是我们自己发明的数据类型&#xff0c;因此使用结构体至少包含两个步骤&#xff1a; 第一&#xff0c;创建一个自定义的结构体类型。 第二&#xff0c;用这个自己搞出来的类型定义结构体变量 …

如何激怒一位Python爱好者?

写代码不那么pythonic风格的&#xff0c;多多少少都会让人有点难受。 什么是pythonic呢&#xff1f;简而言之&#xff0c;这是一种写代码时遵守的规范&#xff0c;主打简洁、清晰、可读性高&#xff0c;符合PEP 8&#xff08;Python代码样式指南&#xff09;约定的模式。 Pyt…

基于SSM+Jsp+Mysql的宜佰丰超市进销存管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

Python实现对一个IP地址和端口号列表进行nmap扫描

一.功能目的 使用python实现对一个IP地址和端口号列表进行nmap扫描 二.功能调研 根据查找得知我们需要用到python的subprocess库 1.代码示例 以下是搜到的简单的subprocess库代码 import subprocess result subprocess.run([ls, -l], capture_outputTrue, textTrue) …

Web程序设计-实验01 HTML与CSS基础

【实验主题】 影视详情页设计 【实验任务】 1、浏览并分析多个影视详情页面&#xff08;详见参考资源&#xff0c;建议自行搜索更多影视网站&#xff09;的主要元素构成和版面设计&#xff0c;借鉴并构思预期效果。 2、新建 index.html文件&#xff0c;合理运用HTML标记编写…

【回溯】Leetcode 17. 电话号码的字母组合【中等】

电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 **输入&#xff1a;**digits “23” 输出&am…

LLM大语言模型助力DataEase小助手,新增气泡地图,DataEase开源数据可视化分析平台v2.5.0发布

2024年4月8日&#xff0c;DataEase开源数据可视化分析平台正式发布v2.5.0版本。 这一版本的功能升级包括&#xff1a;新增DataEase小助手支持&#xff0c;通过结合智能算法和LLM&#xff08;即Large Language Model&#xff0c;大语言模型&#xff09;能力&#xff0c;DataEas…

智能加湿器中应用的数字温度传感芯片

随着经济的发展和人民生活水平的提高&#xff0c;人们对生活质量和健康的要求愈来愈高。空气加湿器就是这样慢慢的走进全球的很多家庭当中&#xff0c;成为干燥地区家庭不可缺少的一种小型家电产品。空气加湿器在我国仍属于新兴产物&#xff0c;加大对空气加湿器的研究与开发的…

【how2j练习题】HTML DOM部分阶段练习

练习1 <!-- 验证账号是否已经存在 那么就在js使用简单的验证规则&#xff1a; 如果账号是以a或者A开头的&#xff0c;那么就提示已经存在了。 --> <!-- 1.需要一个输入框和一个按钮 2.按钮上绑上一个事件。 3.编写事件&#xff0c;并输出答案 --><html><…

服务器感染了.rmallox勒索病毒,如何确保数据文件完整恢复?

引言&#xff1a; 随着网络技术的发展&#xff0c;勒索病毒已经成为当今数字时代的一大威胁。近期出现的.rmallox勒索病毒更是引发了广泛关注。本文将深入探讨.rmallox勒索病毒的特点&#xff0c;并提供一系列应对这一威胁的高效策略。如果受感染的数据确实有恢复的价值与必要…

如何打造高度柔性动态的智能仓储物流解决方案?

近年来&#xff0c;仓储物流行业步入自动化系统集成时代&#xff0c;以货架为存储主体的方式逐步发展成为了自动化储方式&#xff0c;核心设备也由货架转变为机器人货架&#xff0c;形成系统集成物流存储体系。河北沃克根据客户需求精准发力&#xff0c;推出了新一代海格里斯智…

TSINGSEE青犀边缘计算AI智能分析网关V4客流统计算法的配置步骤及使用

TSINGSEE青犀AI智能分析网关V4内置了近40种AI算法模型&#xff0c;支持对接入的视频图像进行人、车、物、行为、烟火等实时检测分析&#xff0c;上报识别结果&#xff0c;并能进行语音告警播放。硬件支持RTSP、GB28181协议、以及厂家私有协议接入&#xff0c;可兼容市面上常见的…

十六、计算机视觉-Scharr算子 和 Laplacian算子

文章目录 一、Scharr算子二、Laplacian算子 一、Scharr算子 Scharr算子和Sobel算子原理都一样&#xff0c;它是由Scharr在2002年提出的一种改进的Sobel算子。Scharr算子的优点在于它相对于Sobel算子有更好的旋转不变性和更小的边缘响应误差。 我们看下Scharr算子的水平卷积核&…