vite+vue3+Ts搭建基础项目框架

news2024/11/18 1:38:16

随着前端技术的更新,程序员们的技术栈也要不断跟上,本来想躺平,不料却被推着走。

上个月开发团队新来一个项目需求,要求开发技术栈vue2更换成vue3,毫无准备的小编一脸懵,嗯?怎么说 换就换了?没提前通知也没给时间学习,直接上手就是干?就离谱0.0!

vue3项目基础框架搭建流程

一.创建项目

首先使用vite初始化项目,然后在初始化过程中选择vue+typeScript

npm init vite 

二.安装依赖

需要注意的是上面这种创建项目的方式跟传统方式不一样,它不会自动安装依赖,也就是没有node_modules包的,需要我们自己手动安装依赖,这也就是为什么使用vite创建项目会很快的原因,所以我们需要使用npm i 安装依赖

npm i 

初始化依赖后再安装平时项目开发都经常会使用的基础依赖vue-router、vuex、axios

npm i -save vue-router vuex axios 

安装开发所需依赖。我经常使用是less,如果有习惯使用sass的可以替换掉

npm i -D less less-loader 

三.ts全局配置

在tsconfig.json中添加配置,全局类型、接口。这个是配置项目中需要编译的文件

"include": [
    "src/**/*.ts",
    "src/**/*.d.ts",
    "src/**/*.tsx",
    "src/**/*.vue",
    "types/**/*.d.ts",
    "types/**/*.ts"
], 

四.配置项目路径别名

在tsconfig.json中添加配置,处理通过"@/"引入文件时ts编译报错问题

"compilerOptions": {
...
"baseUrl": "./",
    "paths": {
      "@/*": [
        "src/*"
    ],
      "#/*": [
        "types/*"
    ]
  }
} 

在vite.config.ts中添加配置,处理通过"@/"引入文件时运行报错问题

// 引入path时会标红,需要安装响应的type依赖 npm i @types/node
import * as path from 'path'
// 或 const path = require('path')
export default ({ mode }) => {
  return defineConfig({
      resolve: {
          alias: {
              '@': path.join(__dirname, 'src'),
              '#': path.join(__dirname, 'types'); 
        }
    },})
} 

五.创建页面文件夹

在src文件夹下面创建views文件夹,其下传创建home/index.vue文件。创建项目并没有views,所以需要自己创建,当然也可以命名其他语义化的文件夹例如pages

<template>
  <div>首页</div>
</template>
<script lang='ts' setup> import { reactive, ref, toRefs } from 'vue' </script>
<style scoped lang="less">
</style> 

六.配置路由

在src文件夹下面创建router文件夹,其下创建index.ts文件。用于管理路由的一些配置项

//index.ts
import { createRouter, createWebHashHistory, RouteRecordRaw } from "vue-router"
const routers = [{
    path: '/',
    name: 'home',
    component: () => import('@/views/home/index.vue'),},
];
​
const router = createRouter({
  history: createWebHashHistory(),
  routes: routers as unknown as RouteRecordRaw[]
})
​
// 路由守卫
router.beforeEach((to, from, next) => {
  next()
})
​
export default router; 

在main.ts文件中引入使用。这里提醒一下app.use(router)需要写在app.mount(‘#app’)前面,问题在于需要先安装router之后才能把app挂载到’#pp’标签中,否则无法使用router

import { createApp } from 'vue'
import App from './App.vue'
const app = createApp(App);
​
import router from './router'
// 初始化路由
app.use(router)
app.mount('#app')
​ 

如果上面app.use(router)写在app.mount(‘#app’)后面,那么这里使用将没有效果,因为是router里面的组件

APP.vue文件使用router-view组件。

<template>
  <router-view />
</template>
<script lang='ts' setup>
</script>
<style scoped lang="less">
</style> 

七.配置vuex

在src文件夹下面创建store文件夹,其下创建index.ts文件

//index.ts
import { createStore } from 'vuex'
export const store = createStore({
  state() {
    return {
​
  }},
  getters: {},
  mutations: {},
  actions: {},
  modules: {}
}) 

在main.ts文件中引入

...
// 初始化vuex
import store from './store'
app.use(store) 

八.封装axios请求接口,配置请求拦截器

在src文件夹下面创建api文件夹,其下创建index.ts及request.ts文件

1.在request.ts文件配置请求拦截器

// request.ts
import axios, { AxiosRequestConfig, AxiosResponse } from "axios";
const service = axios.create({
  timeout: 60000,
  baseURL: ''
})
​
// 请求失败回调函数处理
const error = (error: { request: AxiosRequestConfig, response: AxiosResponse }) => {
  if (error.response.status === 401) {
    // 登录状态过期或未登录}
  return Promise.reject(error)
}
​
// 请求前
service.interceptors.request.use((request: AxiosRequestConfig) => {
  return request
}, error)
​
// 响应后
service.interceptors.response.use((response: AxiosResponse) => {
  return response
}, error)
​
export { service as axios } 

2.在src文件夹下面创建interface文件夹,其下创建request.ts文件,配置请求接口需要的类型

// request.ts
/** 普通数据响应 */
export interface ResDataStruct<T = any> {
  /** 响应内容体 */
  data: T,
  /** api响应信息 */
  message: string,
  /** api响应编码 */
  code: number,
  /** api接口返回是否成功 */
  success: boolean,
  /** api接口查询数据库总数 */
  total: number | string | null,
} 

3.在index.ts文件封装axios请求。封装axios请求的方式有很多种,我这里是使用创建对象实例的方式去封装,我觉得这样更加方便管理。如果有更好的封装方法也可以在下面评论留言

// index.ts
import { ResDataStruct } from "@/interface/request";
import { axios } from "@/utils/request"
export const httpApi = new class {
    constructor() {
        // 请求接口路径
        this.loginApi = '/login/login' // 登录
  }
    Login( data: Object)){
        return axios<ResDataStruct<T>>({ url: this.loginApi, method: "post", data })
  }
} 

九.创建全局配置文件

在src文件夹下另外创建一些配置文件夹,以及在相应的文件夹下创建index.ts文件。如:

  • hooks(配置全局共用函数)
  • interface(定义全局接口类型)
  • types(定义全局类型别名)

当然这里这些配置只是为了更方便去管理数据而已,我是喜欢分得清楚一点,这样在后续迭代中就会比较好维护一些。

十.扩展

基础的框架搭建到这里就可以了,下面是一些扩展插件,看需要自己添加,但大部分项目我觉得应该都是需要的。

1.vite插件@vitejs/plugin-legacy的作用是为打包后的文件提供传统浏览器兼容性支持

// npm 安装依赖
npm i -save @vitejs/plugin-legacy
​
// vite.config.ts
import legacy from '@vitejs/plugin-legacy'
export default defineConfig({
    plugins: [
        legacy({
            targets: ['defaults', 'not IE 11'],
            additionalLegacyPolyfills: ['regenerator-runtime/runtime']
      }),
        ...
  ],
}) 

2.vite插件vite-plugin-compression的作用是做 gzip 压缩, vite-plugin-compress的增强版,

// npm 安装依赖
npm i -save vite-plugin-compression
​
// vite.config.ts
import viteCompression from 'vite-plugin-compression'
export default defineConfig({
    plugins: [
        viteCompression(),
        ...
  ],
}) 

3.vite插件vite-plugin-rsw的作用 - 基于 vite 实现的 webAssembly 插件,支持热更新,友好的报错提示

// npm 安装依赖
npm i -save vite-plugin-rsw 

4.vite插件@vitejs/plugin-vue-jsx的作用是为编译JSX文件

// npm 安装依赖
npm i -save @vitejs/plugin-vue-jsx
​
// vite.config.ts
import vueJsx from '@vitejs/plugin-vue-jsx'
export default defineConfig({
    plugins: [
        vueJsx(),
        ...
  ],
}) 

最后

最近找到一个VUE的文档,它将VUE的各个知识点进行了总结,整理成了《Vue 开发必须知道的36个技巧》。内容比较详实,对各个知识点的讲解也十分到位。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

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

相关文章

读写分离有哪些坑?

在上一篇文章中,我和你介绍了一主多从的结构以及切换流程。今天我们就继续聊聊一主多从架构的应用场景:读写分离,以及怎么处理主备延迟导致的读写分离问题。 我们在上一篇文章中提到的一主多从的结构,其实就是读写分离的基本结构了。这里,我再把这张图贴过来,方便你理解…

【Linux】Linux环境下如何实现自动化编译——make/makefile入门

文章目录 前言 一、make/Makefile 的使用 1.示例 2.编写 Makefile 文件 2.1生成 2.2清理 二、make 如何知道生成的可执行文件是否最新 前言 在Linux 环境下编写好C语言代码之后&#xff0c;我们需要使用编译工具gcc 将其翻译为可执行文件。可是&#xff0c;如果对代码进…

Apache Spark 机器学习 特征抽取 4-1

特征数据集是用于在机器学习中进行训练&#xff0c;有关特征的算法的分类如下所示&#xff1a; 抽取&#xff08;Extraction&#xff09;&#xff0c;从原始数据集中提取出对应的特征集 转换&#xff08;Transformation&#xff09;&#xff0c;缩放特征、转换特征以及修改特征…

线程池(关于变量捕获、线程数、针对ThreadPoolExecutor的构造方法参数的解释、自实现线程池)

目录&#xff1a;一、前言二、关于变量捕获三、针对ThreadPoolExecutor的构造方法参数的解释四、自实现线程池一、前言相比较于进程&#xff0c;创建线程 / 销毁线程 的开销是相对较小的&#xff0c;但是太过频繁的创建线程 / 销毁线程&#xff0c;其开销也很大。这时候我们就需…

C 语言编译链接

前言 一个 C 程序究竟是怎么变成可执行程序的&#xff0c;这其间发生了什么&#xff1f;本文将带你简要了解 C 程序编译过程&#xff0c;文章为 《程序员的自我修养—链接、装载与库》的读书笔记&#xff0c;更为详细的过程可以阅读原书。 比如下面一个经典的 C 程序&#xf…

百度飞浆在pycharm中的使用(含官网安装和cuda)

uieGitHub 安装cuda 1 获取版本 我的是 CUDA Toolkit 11.7.1 (August 2022), Versioned Online Documentation 为了防止后期版本不对应&#xff0c;我这里小心谨慎安装了August对应的月份。 C:\Users\89735>nvidia-smi Mon Dec 19 21:31:28 2022 ------------------------…

一眼万年,这3款顶级神软,内存满了也绝不卸载

免费软件都不好用&#xff1f;不&#xff01;下面3款良心软件&#xff0c;颠覆你的认知&#xff0c;功能强大到离谱&#xff0c;值得收藏往后有需要直接使用。 1、桌面运维助手 这是一款堪称神器的国产电脑优化工具&#xff0c;集硬件管理、系统管理、辅助工具于一体&#xff0…

Effective C++条款39:明智而审慎地使用private继承(Use private inheritance judiciously)

Effective C条款39&#xff1a;明智而审慎地使用private继承&#xff08;Use private inheritance judiciously&#xff09;条款39&#xff1a;明智而审慎地使用private继承1、private 继承2、在private继承和复合之间做出正确选择3、使用private继承比组合更加合理的例子4、牢…

wsl安装CUDA

NVCC 昨天已经安装好了gpu版的pytorch&#xff0c;对于一般的代码应该就可以运行了。但有些代码中需要用到cuda算子&#xff0c;需要配置nvcc环境。对于这个我也没能搞太清楚&#xff0c;网上的说法不一&#xff0c;我使用conda安装pytorch时也安装了cudatoolkit&#xff0c;按…

c++11 标准模板(STL)(std::forward_list)(八)

定义于头文件 <forward_list> template< class T, class Allocator std::allocator<T> > class forward_list;(1)(C11 起)namespace pmr { template <class T> using forward_list std::forward_list<T, std::pmr::polymorphic_…

当面试官问:“你还有什么要问我”,怎样回答才最加分?

面试到最后&#xff0c;面试官常常会问求职者&#xff1a;“你还有什么要问我&#xff1f;”许多人面对这个问题&#xff0c;不知该怎样回答&#xff0c;怕回答不好影响自己的面试结果&#xff0c;那么怎么回答才最加分呢&#xff1f;有人说&#xff0c;可以问问这个职位应该具…

springboot整合gateway网关

2.3 搭建Gateway 本项目使用Spring Cloud Gateway作为网关&#xff0c;下边创建网关工程。 新建一个网关工程。 工程结构 添加依赖&#xff1a; XML org.springframework.cloud spring-cloud-starter-gateway com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discove…

TryHackMe-Blog

Blog 比利乔尔&#xff08;Billy Joel&#xff09;在他的家用电脑上写了一个博客&#xff0c;并开始工作。这将是非常棒的&#xff01; 枚举此框并找到隐藏在其上的 2 个标志&#xff01;比利的笔记本电脑上有一些奇怪的事情。你能四处走动并得到你需要的东西吗&#xff1f;还…

蓝队常用的攻击手段

目录 一&#xff0c; 漏洞利用 1.1 SQL 注入漏洞 1.2 跨站漏洞 1.3 文件上传或下载漏洞 1.4 命令执行漏洞 1.5 敏感信息泄露漏洞 在实战过程中&#xff0c;蓝队专家根据实战攻防演练的任务特点逐渐总结出一套成熟的做法:外网纵向突破重点寻找薄弱点&#xff0c;围绕薄弱点…

2022 VeLO: Training Versatile Learned Optimizers by Scaling Up

VeLO: Training Versatile Learned Optimizers by Scaling Up 通过扩展模型的规模来训练一个通用的优化器。 设计上&#xff0c;优化器的原理基于元学习的思路&#xff0c;即从相关任务上学习经验&#xff0c;来帮助学习目标任务。 相比迁移学习&#xff0c;元学习更强调获取元…

2023年批量下载和改名音频专辑(单页列表)

一、下载原理 1&#xff09;找到目标音频的专辑网页&#xff0c;这里以 kite runner mp3为例。&#xff08;需要自己找&#xff09; https://www.xi___ma___la_____ya.com/album/71718770 2&#xff09;进入详细页&#xff08;称为一次请求URL&#xff09;&#xff08;不需要…

JUC(java.util.concurrent)的常见类

文章目录一、JUC常见类Callable 接口ReentrantLockSemaphore(信号量)CountDownLatch一、JUC常见类 concurrent代表了并发&#xff0c;这个包下为我们提供了并发编程(多线程)相关的组件. Callable 接口 我们的Callable接口和Runnable是一样的&#xff0c;但也有一些区别: Run…

C/C++实现跨年表白烟花

跨年表白烟花使用c/c实现烟花效果&#xff08;小白进&#xff09;分析诉求&#xff0c;拆分问题头文件贯穿全文的媒体部分文字部分&#xff1a;进入烟花弹部分烟花弹的属性初始化烟花弹让烟花弹飞起来烟花爆炸烟花弹的属性初始化烟花让烟花炸起来完成代码&#xff1a;使用c/c实…

840个最优的机器学习python开源项目整理分享

本资源包含了840个很棒的机器学习开源项目&#xff0c;总共270万颗星分为32个类别。所有项目均按项目质量得分排名&#xff0c;该得分是根据从GitHub和不同程序包管理器自动收集的各种指标计算得出的。资源整理自网络&#xff0c;资源获取见源地址&#xff1a;https://github.c…

三星手机提取微信聊天数据

三星手机提取微信聊天数据的方法&#xff0c;无需root。 注意&#xff0c;暴力破解密码需要英伟达显卡&#xff0c;一小时内破解&#xff0c;无显卡可能要两天。 1. 安装USB驱动&#xff0c;通过S换机助手&#xff0c;备份微信软件至电脑。注意&#xff0c;选择不加密。 三星…