手把手教你搭建一个vue3+ts项目(超祥/必看)

news2024/11/23 12:58:15

目录

一、创建vite项目 

二、启动vite项目 

三、处理一些配置问题

四、增加工程化插件

1、安装sass

2、安装vue-router 

3、安装pinia

4、安装element-plus

5、安装axios

6、设置路径别名,将相对路径改为绝对路径


一、创建vite项目 

1、在一个文件夹下通过cmd打开,输入命令

 npm create vite@latest

 

2、接着选择ts

 3、创建好之后,结构目录如下:

二、启动vite项目 

 1、启动项目前需要先 npm i ,从上图可以发现 vite 不会自动帮助我们install相关的依赖,需要我们手动去安装

npm i

 2、此时再通过npm run dev就启动好了

 

 三、处理一些配置问题

1、当我们打开一个引入vue的页面,会发现如下报错,如何解决?

 翻译过来是找不到 vue模块 需要将 moduleResolution设置成node

 解决方式:

找到 tsconfig.json 文件, 将 moduleResolution设置成 node,报红就没了

2、在main.ts中可能也会报如下错,虽然不影响项目运行,但看着难受

 解决方式:

找到 vite-env.d.ts  文件,在里面追加如下代码,保存即可:

declare module "*.vue" {
  import type { DefineComponent } from "vue";
  const vueComponent: DefineComponent<{}, {}, any>;
  export default vueComponent;
}

3、在写ts语法的时候,一些变量名未使用也会报错,想消除怎么办?

解决方式: 

在 tsconfig.json 中将noUnusedLocals改为false,不去校验未使用的变量。

 这样就不会报错了

 四、增加工程化插件

1、安装sass

这是因为 sass 模块是使用 scss 文件必备的工具,所以我们需要安装 sass,

注意:增加 -D 参数,在开发环境中才使用 sass,因为生产环境,scss 文件会被编译成 css 文件,这个插件是用不到的

npm install sass -D

此时我们就可以创建一个common.scss文件,然后在main.ts中引入即可

 2、安装路由 

npm i vue-router

 成功之后,我们来使用一下:

(1)在src下创建pages文件夹,存放路由页面

在pages下面创建一个login页面,点击登录进入index页面

<template>
      <div @click="tologin">登录</div>
</template>
<script lang="ts" setup>

import { useRoute, useRouter } from 'vue-router'

const router = useRouter()
function tologin() {
      router.push({
            name: 'index'
      })
}
</script>

 (2)写好页面之后,我们来创建路由,在 src 路径下新建 router/index.ts 

index.ts

import { createRouter, createWebHistory, } from 'vue-router'

export const routes = [
      {
            path: '/',
            redirect: '/login',
      },
      {
            name: 'login',
            path: '/login',
            component: () => import("../pages/login.vue")
      },
      {
            name: 'index',
            path: '/index',
            component: () => import("../pages/index.vue")
      }

]

const router = createRouter({
      scrollBehavior: () => ({ left: 0, top: 0 }),
      history: createWebHistory(),
      routes,
})


router.beforeEach((to, from, next) => {
      next()
})


export default router

(3)在main.ts中引入

 (4)在 app.vue 设置 routerview

将app.vue中不必要的东西删除,template只写一个routerview,就可以看到登录页了

 

 

3、安装pinia

本文大概讲一下,不详细介绍了,详情看文章 

vue3【抛弃vuex,使用pinia】_vue3替代vuex_suoh's Blog的博客-CSDN博客 

(1)安装pinia 

npm i pinia

(2)创建文件,在 src 路径下增加 store/index.ts

import { defineStore, acceptHMRUpdate } from "pinia";

export const useStore = defineStore({
      id: "index",
      state: () => ({
            name: "old name",
      }),
      getters: {
            myName: (state) => {
                  return `getters ${state.name}`
            }
      },
      actions: {
            changeName(name: string) {
                  this.name = name
            }
      },
});

if (import.meta.hot) {
      import.meta.hot.accept(acceptHMRUpdate(useStore, import.meta.hot))
}

 注意:这里有个import.meta.hot判断作用如下:

Pinia 是 vuex 新替代方案。Pinia 中热更新实现,借助 import.meta

热更新:(Hot Module Replacement,简写 HMR)代码会自动更新页面。当修改代码时,HMR 能够在不刷新页面的情况下,把页面中发生变化的模块,替换成新的模块,同时不影响其他模块的正常运作。

Pinia 支持热更新,所以你可以编辑你的 store,并直接在你的应用中与它们互动,而不需要重新加载页面,允许你保持当前的state、并添加甚至删除stateactionsgetters

目前,只有Vite被官方支持,不过任何实现import.meta.hot规范的构建工具都应该能正常工作。你只需要在任何 store 声明旁边添加这段代码。比方说,你有三个 store:auth.jscart.jschat.js,你必须在每个 store 声明后都添加(和调整)这段代码即可。即:

if (import.meta.hot) {
      import.meta.hot.accept(acceptHMRUpdate(useStore, import.meta.hot))
}

(3)在main.ts中引入

 (4)在页面中使用

 (5)查看效果,点击修改名称

 4、安装element-plus

npm install element-plus

 (1)安装完成之后,在main.ts中引入

import { createPinia } from 'pinia'
import ElementPlus from 'element-plus'
app.use(ElementPlus)

(2)使用

引入一个树形控件

<template>
      <div @click="tologin">登录</div>
      <h2> {{ store.name }}</h2>
      <h1 @click="changeName">修改名称</h1>
      <el-tree :data="data" :props="defaultProps" @node-click="handleNodeClick" />
</template>
<script lang="ts" setup>
import { useRoute, useRouter } from 'vue-router'
import { useStore } from "../store/index";
const router = useRouter()
const store = useStore()
function tologin() {
      router.push({
            name: 'index'
      })
}
function changeName(): void {
      store.name = '索索'
}
interface Tree {
      label: string
      children?: Tree[]
}

const handleNodeClick = (data: Tree) => {
      console.log(data)
}

const data: Tree[] = [
      {
            label: 'Level one 1',
            children: [
                  {
                        label: 'Level two 1-1',
                        children: [
                              {
                                    label: 'Level three 1-1-1',
                              },
                        ],
                  },
            ],
      },
      {
            label: 'Level one 2',
            children: [
                  {
                        label: 'Level two 2-1',
                        children: [
                              {
                                    label: 'Level three 2-1-1',
                              },
                        ],
                  },
                  {
                        label: 'Level two 2-2',
                        children: [
                              {
                                    label: 'Level three 2-2-1',
                              },
                        ],
                  },
            ],
      },
]

const defaultProps = {
      children: 'children',
      label: 'label',
}
</script>

(3)看效果

 补充:对于下图这个ts的interface不太懂的小盆友,看这里  https://www.cnblogs.com/xuelanying/p/14411850.html  

5、安装axios

npm install axios --save

(1) 安装好之后,在src下创建utils/request.ts封装axios请求

request.ts

/**axios封装
 * 请求拦截、相应拦截、错误统一处理
 */
import axios from 'axios';
import router from '../router/index'
//  let protocol = window.location.protocol; //协议
//  let host = window.location.host; //主机
//  axios.defaults.baseURL = protocol + "//" + host;
axios.defaults.baseURL = '/api'

axios.interceptors.request.use( //响应拦截
    async config => {
        // 每次发送请求之前判断vuex中是否存在token        
        // 如果存在,则统一在http请求的header都加上token,这样后台根据token判断你的登录情况
        // 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断 
        config.headers.token = sessionStorage.getItem('token')
        return config;
    },
    error => {
        return Promise.reject(error);
    })
// 响应拦截器
axios.interceptors.response.use(
    response => {
        if (response.status === 200) {
            return Promise.resolve(response); //进行中        
        } else {
            return Promise.reject(response); //失败       
        }
    },
    // 服务器状态码不是200的情况    
    error => {
        if (error.response.status) {
            switch (error.response.status) {
                // 401: 未登录                
                // 未登录则跳转登录页面,并携带当前页面的路径                
                // 在登录成功后返回当前页面,这一步需要在登录页操作。                
                case 401:
                    // 自定义过期之后的操作
                    break
                // 403 token过期                
                // 登录过期对用户进行提示                
                // 清除本地token和清空vuex中token对象                
                // 跳转登录页面                
                case 403:
                    sessionStorage.clear()
                    break
                // 404请求不存在                
                case 404:
                    break;
                // 其他错误,直接抛出错误提示                
                default:
            }
            return Promise.reject(error.response);
        }
    }
);
/** 
 * get方法,对应get请求 
 * @param {String} url [请求的url地址] 
 * @param {Object} params [请求时携带的参数] 
 */
const $get = (url: string, params: object) => {
    return new Promise((resolve, reject) => {
        axios.get(url, {
            params: params,
        })
            .then(res => {
                resolve(res.data);
            })
            .catch(err => {
                reject(err.data)
            })
    });
}
/** 
 * post方法,对应post请求 
 * @param {String} url [请求的url地址] 
 * @param {Object} params [请求时携带的参数] 
 */
const $post = (url: string, params: object) => {
    return new Promise((resolve, reject) => {
        axios.post(url, params) //是将对象 序列化成URL的形式,以&进行拼接   
            .then(res => {
                resolve(res.data);
            })
            .catch(err => {
                reject(err.data)
            })
    });
}
// 下面是将get和post方法挂载到vue原型上供全局使用、
// vue2.x中是通 Vue.prototype 来绑定的,像这样Vue.prototype.$toast = Toast。在vue3中取消了Vue.prototype,推荐使用globalProperties来绑定,
export default {
    install: (app: any) => {
        app.config.globalProperties['$get'] = $get;
        app.config.globalProperties['$post'] = $post;
        app.config.globalProperties['$axios'] = axios;
    }
}

(2)在main.ts中引入即可

import http from './utils/request.js';
app.use(http)

(3)在页面中使用请求,调登录接口

import { getCurrentInstance } from 'vue'
const { proxy } = getCurrentInstance() as any;

function login(): void {
      let data = {
            roleId: "A",
            username: "dpc",
            password: "dpc12345",
            sysType: "zhfw",
      }
      proxy.$post("/index/login", data).then((response: any) => {
            console.log(response)
            router.push({
                  name: 'index'
            })
      })
}
function tologin() {
      login()
}

6、设置路径别名,将相对路径改为绝对路径

@types/node 模块 在我们使用 node 方法(比如 path.resolve)时提供 ts 类型声明,否则编辑器会报错,虽然不影响代码运行,但是会有红线很影响心情,如下图所示。

(1)安装 @types/node

npm i @types/node -D

(2)在 tsconfig.json 中设置 path

    "paths": {
      "@/*": ["./src/*"]
    }

 (3)在vite.config.ts中添加如下配置

import { resolve } from 'path'

export default defineConfig({
  plugins: [vue()],
  resolve: {
    alias: {
      '@': resolve(__dirname, './src')
    },
    //extensions: [".ts", ".js", ".vue", ".json", ".mjs"],
    extensions: [".mjs", ".js", ".ts", ".jsx", ".tsx", ".json", ".vue"],
  },
})

 (4)此时就不会报红了

 

 到这里,一个基本的vue3项目所需要的技术栈插件都配置好了,期待你的一键三连哦~

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

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

相关文章

React基础教程(二):React的基本使用

React基础教程(二)&#xff1a;React的基本使用 1、HelloReact 1.1 引入react基础依赖包 注意点&#xff1a;①必须要在②之前引入 <!-- 引入react核心库--><script src"../js/react.development.js"></script><!-- 引入react-dom&…

毕业论文里引用文献率为0%的解决小技巧

快要毕业了&#xff0c;带着伤感&#xff0c;大学生们已开始加紧完成论文的编写和毕业答辩&#xff0c;祝大家都可以顺利拿到学位证书和毕业证书。 前两天&#xff0c;有位同学找我&#xff0c;咨询如何解决毕业论文里&#xff0c;引用文献率为0%的问题。 我在知网上将该论文通…

flutter创建、安装扩展包、打包apk

1、创建APK项目 要在VSCode中创建一个Flutter应用程序&#xff0c;请按照以下步骤进行操作&#xff1a; 安装Flutter SDK&#xff1a;请确保你已经安装了Flutter SDK&#xff0c;并配置了Flutter的环境。你可以在Flutter的官方网站上找到安装和设置Flutter的详细说明。 安装V…

完美解决 RabbitMQ 可视化界面中 Overview 不显示图形的问题

&#x1f4a7; 记录一下今天遇到的 b u g \color{#FF1493}{记录一下今天遇到的bug} 记录一下今天遇到的bug&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 数据结构与算法…

VBA基础(宏编程)

VBA介绍&#xff1a; Visual Basic for Applications&#xff08;VBA&#xff09;是 VisualBasic 的一种宏语言&#xff0c;是微软开发出来在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。主要能用来扩展 Windows 的应用程序功能&#xff0c;特别是Microsoft Office…

DolphinDB +机器学习,预测地震波形数据

1. 地震波形数据预测业务场景说明 在地震波形数据异常检测场景中&#xff0c;通常需要使用多种工具和方法来提高检测精度和鲁棒性。其中&#xff0c;FilterPicker 是一种常用的基于模板匹配的异常检测工具&#xff0c;可以实现地震波形数据的实时异常检测和定位。FilterPicker…

为什么看了那么多测试技术帖,自己都没有提升?

作为测试新手&#xff0c;最爱莫过于看各大牛发的技术贴&#xff0c;这篇很牛叉&#xff0c;那篇也很有道理&#xff0c;似乎自己看着看着也会成为高手。然而几年后&#xff0c;发现自己对专业知识的理解乱的很&#xff0c;里面更有很多自相矛盾的地方&#xff0c;这到底是哪里…

RedisSon高并发分布式锁实战

Redis高并发分布式锁实战 1.分布式场景下的synchronized失效的问题–用redis实现分布式锁 synchronized是通过monitor实现的jvm级别的锁&#xff0c;如果是分布式系统&#xff0c;跑在不同的虚拟机上的tomcat上&#xff0c;会导致synchronized无法锁住对象 ----------- 需要分…

01分数规划 易懂+例题讲解 (c++)

01分数规划 &#xff1a;01即取还是不取&#xff0c;分数即所求型式为&#xff0c;规划就是选取最好的方案。 一般情况题目给出n个物品&#xff0c;再给出每个物品的价值以及物重&#xff0c;选取k个物品&#xff0c;问你在所有可能选取的方案中&#xff0c;最大的单位价值为多…

通过零代码ETLCloud实现马帮ERP数据自动化同步

马帮ERP介绍 马帮ERP是一款云端跨境电商管理软件。与传统的ERP系统不同&#xff0c;马帮ERP专注于跨境电商领域&#xff0c;为电商企业提供一站式管理解决方案&#xff0c;包括财务管理、采购管理、进销存管理、订单管理等功能模块。该平台针对跨境电商行业特点&#xff0c;提…

MM32F3273G8P火龙果开发板MindSDK开发教程20 - freertos + letter shell 的移植

MM32F3273G8P火龙果开发板MindSDK开发教程20 - freertos letter shell 的移植 1、freertos下载 官网传送门 2、freertos移植 1、在工程目录device下新建freertos目录&#xff0c;将下载的源码source目录下的七个.c文件copy到新建的freertos目录。 2、将source/protable/G…

Word 2021入门指南:详细解读常用功能

软件安装&#xff1a;办公神器office2021安装教程&#xff0c;让你快速上手_正经人_____的博客-CSDN博客 一、 新建文档 打开Word 2021后&#xff0c;可以看到左上角的“文件”选项&#xff0c;点击它&#xff0c;在弹出的菜单中选择“新建”选项。然后可以选择空白文档或者使…

vue3+ts+vite+element plus中使用luckysheet(预览效果)

前言&#xff1a; 这两天一个项目&#xff0c;需要在页面中以excel的形式展示大量数据&#xff0c;喜欢偷懒的我果断扒拉了一堆适用于vue3的插件&#xff0c;下面简单说说我使用的luckysheet 使用&#xff1a; 一、准备一个vue3tsviteelement plus的项目 此处省略n个字。。。…

如何用 WampServer+快解析 搭建php文件管理器

基于网络&#xff0c;资源是大家最最基本的需求&#xff0c;许多网络爱好者不求利益&#xff0c;把自己收集的一些通过一些平台共享给大家&#xff0c;这就是资源共享。 资源共享程度越高&#xff0c;代表信息发展水平越高。现实工作中&#xff0c;由于用户提供的数据可能来自…

Linux基础IO - 软硬链接 | 动静态库

之前的文章中我们讲述了软硬链接中有关软连接的知识&#xff0c;本文中将继续讲述硬链接部分的知识&#xff0c;并且讲述一下动静态库的相关内容。 硬链接 硬链接本质上就是在当前目录建立一个新的文件名与指定文件inode的关系。 每当我们在当前目录下建立一个硬链接就会让文…

C++11多线程之条件变量

文章目录 一、关于多线程的同步二、初始条件变量三、关于条件变量的例题四、生产者消费者模型 一、关于多线程的同步 //函数被调用&#xff0c;分配相应的栈帧&#xff0c;进行现场保护void func(char c) {char filename[20] {};sprintf(filename, "test%c.txt",c)…

Fiddler Response私人订制

在客户端接口的测试中&#xff0c;我们经常会需要模拟各种返回状态或者特定的返回值&#xff0c;常见的是用Fiddler模拟各种请求返回值场景&#xff0c;如重定向AutoResponder、请求拦截修改再下发等等。小编在近期的测试中遇到的一些特殊的请求返回模拟的测试场景&#xff0c;…

《变形金刚7》票房大跳水!特效敷衍?剧情单薄?汽车人的未来在哪里?

《变形金刚&#xff1a;超能勇士崛起》 6.11&#xff08;上映第3天&#xff09; 单日票房8200万 6.12&#xff08;上映第4天&#xff09; 单日票房2173万 6.13&#xff08;上映第5天&#xff09; 单日票房1700万 说实在的&#xff0c;真没想到《变形金刚7》日票房会如此大幅…

高压放大器在铁电材料中的应用研究

铁电材料是一种具有特殊磁电性能的材料&#xff0c;包括压电陶瓷、磷酸铁钠陶瓷、氧化锌压电陶瓷等。这些材料在电力、电子、机械等领域有广泛的应用&#xff0c;如超声波发生器、声纳、压力传感等。其中&#xff0c;高压放大器在铁电材料中有着重要的应用。 一、高压放大器的基…

完美搭建一个vue3+ts项目(一篇文章搞定你的所有疑惑)

目录 一、创建vite项目 二、启动vite项目 三、处理一些配置问题 四、增加工程化插件 1、安装sass 2、安装vue-router 3、安装pinia 4、安装element-plus 5、安装axios 6、设置路径别名&#xff0c;将相对路径改为绝对路径 一、创建vite项目 1、在一个文件夹下通…