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

1.vite搭建

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

 使用nvm下载对应版本

nvm download 18.x.x

nvm 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.ts

import 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,reactive
      imports: ['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',
            // 指定图标集ep
            enabledCollections: ['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.url
  return config
})

$http.interceptors.response.use(
  function (response) {
    const code = response.data?.code
    if (code === 0) {
      return response
    } else {
        return Promise.reject(response.data)
    }
  },
  function (error) {
    // Do something with response error
    return Promise.reject(error)
  }
)

新建一个接口文件

// list.ts

import $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.ts

import { 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.ts

import 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,reactive
      imports: ['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',
          // 指定图标集ep
          enabledCollections: ['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 debugger
      compress: {
        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.ts

import '@/assets/style/index.less'
// reset.less

body,
#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
  }
}

 

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

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

相关文章

三个晚上!给干废了!MINI2440 挂载 NFS

虚拟机执行&#xff1a;sudo ifconfig tap0 10.10.10.1 up qemu 开发板&#xff1a; set bootargs noinitrd root/dev/nfs rw nfsroot10.10.10.1:/nfsroot ip10.10.10.10:10.10.10.1 ::255.255.255.0 consolettySAC0,115200 Hit any key to stop autoboot: 0 MINI2440 # set…

VMware 虚拟机中的 Ubuntu 16.04 设置 USB 连接

VMware 虚拟机中的 Ubuntu 16.04 设置 USB 连接 1. VMware USB Arbitration Service2. 可移动设备 USB 口连接主机3. 虚拟机 -> 可移动设备 -> 连接 (断开与主机的连接)4. 状态栏 -> 断开连接 (连接主机)References 1. VMware USB Arbitration Service 计算机 -> …

设计编程网站集:动物,昆虫,蚂蚁养殖笔记

入门指南 区分白蚁与蚂蚁 日常生活中&#xff0c;人们常常会把白蚁与蚂蚁搞混淆&#xff0c;其实这两者是有很大区别的&#xff0c;养殖方式差别也很大。白蚁主要食用木质纤维&#xff0c;会给家庭房屋带来较大危害&#xff0c;而蚂蚁主要采食甜食和蛋白质类食物&#xff0c;不…

word文件的创建时间和修改时间可以更改吗?答案是肯定的 文件属性修改的方法

一&#xff0c;引言 在日常生活和工作中&#xff0c;我们经常需要处理各种Word文件。有时&#xff0c;由于某些原因&#xff0c;我们可能需要更改Word文件的创建时间和修改时间。虽然这听起来可能有些复杂&#xff0c;但实际上&#xff0c;通过一些简单的方法和工具&#xff0…

使用VLC无法播放安防监控EasyCVR平台分发出的FLV视频流,是什么原因?

安防视频汇聚平台EasyCVR不仅可支持的接入协议非常多&#xff08;包括&#xff1a;国标GB28181、RTSP/Onvif、RTMP&#xff0c;以及厂家的私有协议与SDK&#xff0c;如&#xff1a;海康ehome、海康sdk、大华sdk、宇视sdk、华为sdk、萤石云sdk、乐橙sdk等&#xff09;&#xff0…

数据结构线性表篇-顺序表的实现

1.数据结构的介绍 ⚀基本概念 数据结构 数据 结构 数据&#xff1a; 数据就是所有描述客观事物的符号。比如&#xff1a;我们常见的文字&#xff0c;“你今天学习了吗&#xff1f;”&#xff1b;数字&#xff0c;“1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&a…

基于RflySim平台的uORB消息读取与写入实验(一)

uORB消息读取与写入实验框架总览 一. 总体说明 —文件目录 uORB消息读取与写入例程目录&#xff1a; [安装目录]\RflySimAPIs\5.RflySimFlyCtrl\0.ApiExps\6.uORB-Read-Write 自定义uORB消息例程目录&#xff1a; [安装目录]\5.RflySimFlyCtrl\0.ApiExps\7.uORB-Create 二…

Linux三剑客之awk篇

目录 1、awk 1.1、awk参数 1.2、awk变量 1.3、awk分割符 1.3.1、FS 1.3.2、OFS 1.3.3、RS 1.3.4、ORS 1.3.5、NF 1.3.6、NR 1.3.7、FNR 1.3.8、FILENAME 1.3.9、ARGC与ARGV 1.4、自定义变量 1.5、printf格式化输出 1、awk 作用&#xff1a;具有强大的文本格式化…

【多线程】阻塞队列 | put()方法 | take()方法 | 生产者-消费者模式 |实现阻塞队列

文章目录 阻塞队列1.生产者-消费者模式生产者消费者模型的意义&#xff1a;1.解耦合2.削峰填谷&#xff1a; 2.阻塞队列的使用BlockingQueue 3.实现阻塞队列唤醒&#xff1a;使用阻塞队列实现生产者消费者模型 阻塞队列 阻塞队列是一种特殊的队列&#xff1a; 1.是线程安全的。…

视频自定义字幕,中英文,彩色的,你也可以,不会不知道吧

前言 关于【SSD系列】&#xff1a; 前端一些有意思的内容&#xff0c;旨在3-10分钟里&#xff0c;有所获&#xff0c;又不为所累。 字幕&#xff0c;大家见过吧&#xff0c;其实你也可以&#xff0c;真的可以&#xff0c;真的真的可以。不难&#xff0c;不难&#xff0c;真的…

leetcode1448.统计二叉树中的好节点数目

1. 题目描述 题目链接 2. 解题思路 首先看一下题目的“核心”&#xff0c;什么是好节点&#xff1a;从根到该节点 X 所经过的节点中&#xff0c;没有任何节点的值大于 X 的值。也就是说&#xff0c;我们只要知道了从根节点到该节点的所有的值&#xff0c;就可以判断该节点是…

优斯特:防静电包装解决方案的巧妙运用

在现代电子产品生产与运输领域&#xff0c;防静电包装已成为保障产品安全的必备环节。优斯特凭借其创新的防静电包装解决方案&#xff0c;为客户提供了一种巧妙的方式来确保产品在存储和运输过程中不受静电影响&#xff0c;并且不会被刮花或损坏。 静电对产品的影响 静电对电子…

数学建模--深入剖析线性规划(模型全方位解读+代码分析)

1.简介 &#xff08;1&#xff09;线性规划三要素 &#xff08;2&#xff09;模型适用赛题 2.典例讲解 &#xff08;1&#xff09;问题分析 目标函数是净收益尽可能大&#xff0c;风险尽可能小&#xff1b; 约束条件是交易费的分段函数&#xff0c;以及每一笔投资都是非负数&am…

java绘图在ubuntu报错

把JRT网站部署到ubuntu桌面系统上&#xff0c;开始没测试绘图部分功能&#xff0c;只试了连PostGreSql部分正常。后面试了生成位图部分发现报错。 报下面错误&#xff1a; (ColorModel.java:220)\n\tat java.desktop/java.awt.image.BufferedImage.(BufferedImage.java:286)\n…

阿赵UE学习笔记——28、粒子系统Niagara简介

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的使用。这次开始学习粒子系统的使用。 一、Cascade系统 在介绍UE5的Niagara系统之前&#xff0c;必须先介绍一下旧版本的粒子系统。   在UE4的时候&#xff0c;虚幻引擎的粒子系统叫做Cascade&#x…

【iOS】——SDWebImage源码学习

文章目录 一、SDWebIamge简介二、SDWebImage的调用流程SDWebImage源码分析1.UIImageViewWebCache层2.UIViewWebCache层3.SDWebManager层4.SDWebCache层5.SDWebImageDownloader层 一、SDWebIamge简介 SDWebImage是iOS中提供图片加载的第三方库&#xff0c;可以给UIKit框架中的控…

思维导图ai生成软件分享5款好用的!

思维导图ai生成软件分享5款好用的&#xff01; 在快节奏的信息时代&#xff0c;思维导图作为一种有效的思维整理工具&#xff0c;越来越受到人们的青睐。它能够将复杂的思维过程可视化&#xff0c;帮助我们更好地梳理思路、规划工作。近年来&#xff0c;随着人工智能技术的飞速…

整数运算超越存储单元表示范围:上溢出、下溢出、回绕

示例&#xff1a; /*** brief how about integer-underflow-overflow? show you here.* author wenxuanpei* email 15873152445163.com(query for any question here)*/ #define _CRT_SECURE_NO_WARNINGS//support c-library in Microsoft-Visual-Studio #include <std…

408数据结构,怎么练习算法大题?

其实考研的数据结构算法题是有得分技巧的 得分要点 会写结构定义&#xff08;没有就自己写上&#xff09;写清楚解题的算法思想描述清楚算法实现最后写出时间和空间复杂度 以上这四步是完成一道算法题的基本步骤&#xff0c;也是其中得分的主要地方就是后面两步。但是前面两…

java-spring 图灵 04

在Spring框架中&#xff0c;可以使用org.springframework.core.io.support.ResourcePatternResolver接口的resolveBasePackage方法来将指定的基础包解析为用于包搜索路径的模式规范。 例如&#xff0c;如果基础包是com.example.app&#xff0c;则可以使用resolveBasePackage方法…