【Vue3】手把手教你创建前端项目 Vue3 + Ts + vite + pinia

news2025/4/29 6:04:59

文章目录

  • 一、 项目初始化
  • 二、 代码风格
    • 安装eslint
    • 安装prettier
  • 三、 状态管理工具--Pinia
    • 优点
    • 使Pinia 基本使用
  • 四、Vue-Router4 快速上手指南
  • 五、VueUse快速上手指南
    • 什么是 VueUse
    • 简单上手
  • 六、全局样式CSS
    • 原生 css 新特性
    • scss 或 less
  • 封装axios
    • 安装依赖
    • 封装
    • UI 样式库


一、 项目初始化

按步骤创建项目

// 使用 vite-cli 命令
npm init vite@latest

// 项目名称
? Project name:  vite-vue3-ts-pinia

// 选择框架
? Select a framework: » - Use arrow-keys. Return to submit.
     vanilla // 原生js
 >   vue     // 默认就是 vue3
     react   // react
     preact  // 轻量化react框架
     lit     // 轻量级web组件
     svelte  // svelte框架

// 使用 typescript
? Select a variant:- Use arrow-keys. Return to submit.
     vue
 ❯   vue-ts

// 完成上面操作后,项目算是搭建完成了
cd vite-vue3-ts-pinia
npm install
npm run dev

在这里插入图片描述

快速创建项目–推荐


// npm 6.x
npm init vite@latest project-name --template vue-ts
 
// npm 7+, 需要额外的双横线:
npm init vite@latest project-name -- --template vue-ts

在这里插入图片描述

集成配置

npm i @types/node --save-dev

修改tsconfig.json
tsconfig.json全解析

{
  "compilerOptions": {
    "typeRoots": [
      "node_modules/@types",
      "src/types"
   ],
    "target": "esnext",
    "useDefineForClassFields": true,
    "module": "esnext",
    "moduleResolution": "node",
    "strict": true,
    "jsx": "preserve",
    "sourceMap": true,
    "resolveJsonModule": true,
    "esModuleInterop": true,
    "lib": ["esnext", "dom"],
    "baseUrl": "./",
    "paths":{
      "@": ["src"],
      "@/*": ["src/*"],
    }
  },
  "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"]
}

修改 vite.config.ts

import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import * as path from 'path';

// https://vitejs.dev/config/
export default defineConfig({
  resolve: {
    //设置别名
    alias: {
      '@': path.resolve(__dirname, 'src')
    }
  },
  plugins: [vue()],
  server: {
    port: 3000, //启动端口
    hmr: {
      host: "0.0.0.0",
      port: 3000,
    },
    // 设置 https 代理
    proxy: {
      '/api': {
        target: 'your https address',
        changeOrigin: true,
        rewrite: (path: string) => path.replace(/^\/api/, '')
      }
    }
  }
});


二、 代码风格

安装eslint

npm i eslint eslint-plugin-vue --save-dev

因为 ESLint 默认使用 Espree 进行语法解析,无法识别 TypeScript 的一些语法,所以需要安装 @typescript-eslint/parser 替代掉默认的解析器

npm install @typescript-eslint/parser --save-dev

安装对应的插件 @typescript-eslint/eslint-plugin 它作为 eslint 默认规则的补充,提供了一些额外的适用于 ts 语法的规则。

npm install @typescript-eslint/eslint-plugin --save-dev

创建配置文件: .eslintrc.js

module.exports = {
    parser: 'vue-eslint-parser',

    parserOptions: {
        parser: '@typescript-eslint/parser',
        ecmaVersion: 2020,
        sourceType: 'module',
        ecmaFeatures: {
            jsx: true
        }
    },

    extends: [
        'plugin:vue/vue3-recommended',
        'plugin:@typescript-eslint/recommended',
    ],

    rules: {
        // override/add rules settings here, such as:
    }
};

创建忽略文件:.eslintignore

# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules/
dist/
dist-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

命令行式运行:修改 package.json

{
    ...
    "scripts": {
        ...
        "eslint:comment": "使用 ESLint 检查并自动修复 src 目录下所有扩展名为 .js 和 .vue 的文件",
        "eslint": "eslint --ext .js,.vue --ignore-path .gitignore --fix src",
    }
    ...
}

安装prettier

安装:

npm i prettier eslint-config-prettier eslint-plugin-prettier --save-dev

创建配置文件: prettier.config.js 或 .prettierrc.js

module.exports = {
    // 一行最多 80 字符
    printWidth: 80,
    // 使用 4 个空格缩进
    tabWidth: 4,
    // 不使用 tab 缩进,而使用空格
    useTabs: false,
    // 行尾需要有分号
    semi: true,
    // 使用单引号代替双引号
    singleQuote: true,
    // 对象的 key 仅在必要时用引号
    quoteProps: 'as-needed',
    // jsx 不使用单引号,而使用双引号
    jsxSingleQuote: false,
    // 末尾使用逗号
    trailingComma: 'all',
    // 大括号内的首尾需要空格 { foo: bar }
    bracketSpacing: true,
    // jsx 标签的反尖括号需要换行
    jsxBracketSameLine: false,
    // 箭头函数,只有一个参数的时候,也需要括号
    arrowParens: 'always',
    // 每个文件格式化的范围是文件的全部内容
    rangeStart: 0,
    rangeEnd: Infinity,
    // 不需要写文件开头的 @prettier
    requirePragma: false,
    // 不需要自动在文件开头插入 @prettier
    insertPragma: false,
    // 使用默认的折行标准
    proseWrap: 'preserve',
    // 根据显示样式决定 html 要不要折行
    htmlWhitespaceSensitivity: 'css',
    // 换行符使用 lf
    endOfLine: 'auto'
}

修改 .eslintrc.js 配置

module.exports = {
    ...

    extends: [
        'plugin:vue/vue3-recommended',
        'plugin:@typescript-eslint/recommended',
        'prettier',
        'plugin:prettier/recommended'
    ],

    ...
};

**命令行式运行:**修改 package.json

{
    ...
    "scripts": {
        ...
        "prettier:comment": "自动格式化当前目录下的所有文件",
        "prettier": "prettier --write"
    }
    ...
}

三、 状态管理工具–Pinia

Pinia中文文档

优点

  1. Vue2 和 Vue3 都能支持
  2. 抛弃传统的 Mutation ,只有 state, getter 和 action ,简化状态管理库
  3. 不需要嵌套模块,store 之间可以自由使用,更好的代码分割;
  4. 足够轻量,压缩后的体积只有1.6kb;

使Pinia 基本使用


安装

npm i pinia --save

使用

新建 src/store 文件,创建 index.ts并导出 store

import {createPinia} from "pinia";
const store=createPinia()
export default store

在 src/store 下面创建一个 user.ts

import {createPinia} from "pinia";
export const useUserStore = defineStore({
    id: 'user',
    state: () => {
        return {
            name: 'Pinia'
        }
    },
    actions: {
        updateName(name) {
            this.name = name
        }
    }
})

main.ts引用

import { createApp } from 'vue'
import './style.css'
import store from "@/store";
import App from './App.vue'
// 创建vue实例
const app = createApp(App)
// 挂载pinia
app.use(store)
// 挂载实例
app.mount('#app');

组件中获取和修改State

<!--  在需要的页面使用该组件:pinia-demo.vue,-->
<template>
  <div>{{ userStore.name }}</div>
  <button @click="handleChange">修改Pinia</button>
</template>

<script lang="ts" setup>
  import { useUserStore } from '@/store/user'

  const userStore = useUserStore()
  //修改Pinia的state
  const handleChange = () => {
    userStore.name=`"修改后的Pinia==>"${Date.now()};`
  };

  // return {
  //   handleChange
  // }
</script>

<style scoped></style>

在这里插入图片描述

四、Vue-Router4 快速上手指南

安装

npm i vue-router --save

快速上手

新建 src/router/index.ts,导出 router

history 模式hash 模式的升级版,区别在浏览器链接的显示的不同

  • hash 模式:把前端路由路径用 # 号拼接在真实 URL 后面的模式。当 # 后面的路径发生变化时,浏览器不会重新发起请求,而是出发 hashchange 事件。hash
    模式链接样式:http://localhost:8080/#/home
  • history 模式:history API 是 HTML5 的新特性,允许开发者直接更改前端路由。history
    模式链接样式:http://localhost:8080/home
import { createWebHistory, createRouter,RouteRecordRaw } from "vue-router";
const routes: Array<RouteRecordRaw> = [
    {
        path: '/login',
        name: 'Login',
        meta: {
            title: '登录',
            keepAlive: true,
            requireAuth: false
        },
        component: () => import('@/pages/login.vue')
    },
    {
        path: '/',
        name: 'Index',
        meta: {
            title: '首页',
            keepAlive: true,
            requireAuth: true
        },
        component: () => import('@/pages/index.vue')
    },
   
]

const router = createRouter({
    history: createWebHistory(),
    routes
});
export default router;

在这里插入图片描述

五、VueUse快速上手指南

什么是 VueUse


VueUse 是一个基于 Composition API 的实用函数集合。通俗的来说,这就是一个工具函数包,它可以帮助你快速实现一些常见的功能,免得你自己去写,解决重复的工作内容。以及进行了基于 Composition API 的封装。让你在 vue3 中更加得心应手。

简单上手


安装 VueUse

npm i @vueuse/core

使用 VueUse

<template>
  <h1> 测试 vueUse 的鼠标坐标 </h1>
  <h3>Mouse: {{x}} x {{y}}</h3>
  <hr>
  <div v-if="isSupported">
    <note>
      Clipboard Permission: read <b>{{ permissionRead }}</b> | write
      <b>{{ permissionWrite }}</b>
    </note>
    <p>
      Current copied: <code>{{ text || 'none' }}</code>
    </p>
    <input v-model="input" type="text">
    <button @click="copy(input)">
      Copy
    </button>
  </div>
  <p v-else>
    Your browser does not support Clipboard API
  </p>
  </template>

<script lang="ts" setup>
import { useMouse,useLocalStorage,usePreferredDark,useToggle  } from '@vueuse/core'
// 监听当前鼠标坐标的一个方法,他会实时的获取鼠标的当前的位置
const { x, y } = useMouse()
//持久化数据的方法,他会把数据持久化到本地存储中
const store = useLocalStorage(
    'my-storage',
    {
      name: 'Apple',
      color: 'red',
    },
)
// 使用剪贴板
import { ref } from 'vue'
import { useClipboard, usePermission } from '@vueuse/core'
const input = ref('')
const { text, isSupported, copy } = useClipboard()
const permissionRead = usePermission('clipboard-read')
const permissionWrite = usePermission('clipboard-write')



</script>

还有很多很多函数库,具体可以前往看看 官方文档
在这里插入图片描述

六、全局样式CSS

原生 css 新特性


新建样式文件 src/styles/index.css

body, h1, h2, h3, h4, h5, h6, hr, p, blockquote,/* structural elements 结构元素 */
dl, dt, dd, ul, ol, li, /* list elements 列表元素 */
pre, /* text formatting elements 文本格式元素 */
fieldset, lengend, button, input, textarea, /* form elements 表单元素 */
th, td {
    /* table elements 表格元素 */
    margin: 0;
    padding: 0;
}
/* 设置默认字体 */
body,
button,
input,
select,
textarea {
    /* for ie */
    /*font: 12px/1 Tahoma, Helvetica, Arial, "宋体", sans-serif;*/
    /* 用 ascii 字符表示,使得在任何编码下都无问题 */
    /*font: 12px/1 Tahoma, Helvetica, Arial, '\5b8b\4f53', sans-serif;*/
    font: 12px/1  'Microsoft YaHei';
    touch-action: manipulation;
}

scss 或 less

安装

npm add -D scss
npm add -D less
<style lang="scss">
   .scssstyle{}
 </style>


<style lang="less">
   .lessstyle {}
 </style>

封装axios

Axios 是一个基于 promise 的 HTTP 库,简单的讲就是可以发送get、post请求
封装axios,主要是通过拦截器分别处理HTTP请求和响应,并反馈HTTP请求结果

安装依赖


安装axios依赖,安装element-plus,用来反馈请求结果

npm i axios
npm i element-plus

封装


index.ts文件

  • 定义请求返回的数据格式,和服务端约定好数据格式
  • 定义axios的配置信息,用于在创建axios实例时传入
  • 请求拦截器,前端所有的接口请求都会先达到请求拦截器,我们可以在此添加请求头信息
  • 响应拦截器,服务端返回的数据会先达到响应拦截器,我们可以处理服务端的响应信息。如果是报错,就处理常见的报错;如果是成功,就返回数据
  • 封装常用的get、put、post、delete接口方法

方案一:https://blog.csdn.net/weixin_44590591/article/details/121950152

其他方案后续更新

UI 样式库

这里列举几个:element-plus、Vant UI 、Ant Design Vue、vuetify

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

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

相关文章

数据结构(二叉树)——Java实现

作者&#xff1a;~小明学编程 文章专栏&#xff1a;Java数据结构 格言&#xff1a;目之所及皆为回忆&#xff0c;心之所想皆为过往 目录 树型结构 什么是树 树的相关概念 树的表现形式 树的引用 二叉树 概念 二叉树的种类 常规二叉树 满二叉树 完全二叉树 二叉树的性…

京东商品接口加解密算法解析

最近,闲来没事,打开看了一下京东图书的热销榜,想通过接口查看下它接口的加密方式,于是直接打开了M站的地址:https://m.jd.com/,然后打开搜索页面,如下图。 打开页面,打开开发者工具,往下滑动鼠标,获取接口地址。 解析一下接口,接口返回值跟没什么特殊说明,首尾加…

spring boot 整合 shiro 框架

1、整合shiro 1.1、创建spring boot项目 1.2、引入依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-web-starter</artifactId><version>1.9.0</version> </dependency><!--mybatis…

云手机在黑产中的应用

虚拟化技术是当下黑灰产的热门技术。使用虚拟化环境&#xff0c;让黑灰产可以利用虚拟环境在应用运行环境的更底层这一优势&#xff0c;对 App 进行神不知鬼不觉的修改&#xff0c;从而避免在分析、破解 App 上的投入。 较早之前以 VirtualApp 为代表的 Android 虚拟化多开工具…

OpenHarmony源码分析(二):系统安全

1、 概要 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gc6K9a9A-1667380110547)(PNG/11.png)] 2、 进程隔离 OpenHarmony 内核态的进程之间无隔离,共享一块VMM空间,用户态进程每个用户用于自己独立的空间,相互之间不可见,通过MMU 机制实现进…

拓端tecdat|python在Scikit-learn中用决策树和随机森林预测NBA获胜者

全文链接&#xff1a;http://tecdat.cn/?p5222 原文出处&#xff1a;拓端数据部落公众号 在本文中&#xff0c;我们将以Scikit-learn的决策树和随机森林预测NBA获胜者。美国国家篮球协会&#xff08;NBA&#xff09;是北美主要的男子职业篮球联赛&#xff0c;被广泛认为是首屈…

【Transformers】第 5 章:微调文本分类的语言模型

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

Go语言入门【1】数据类型、变量、常量

常见基本数据类型 uint8&#xff1a;无符号8位整形&#xff0c;取值范围&#xff1a;0-255 uint16&#xff1a;无符号16位整形&#xff0c;取值范围&#xff1a;0-65535 uint32&#xff1a;无符号32位整形&#xff0c;取值范围&#xff1a;0-4294967295 uint64&#xff1a;…

高分辨空间代谢组学测试的样品要求以及常见问题

高分辨空间代谢组学可实现定量检测&#xff0c;亦可定性检测&#xff0c;且可一次可同时检出多种类型的化合物&#xff0c;包括脂类、小分子代谢物、蛋白质、药物及其载体等&#xff0c;并且能够呈现出这些物质的空间分布情况。高分辨空间代谢组学测试的样品要求&#xff1a; …

单链表思路讲解+C语言代码实现

单链表的实现什么是单链表单链表的结构图讲解创建链表打印链表尾插链表尾删链表头插链表和头删链表查询链表特定位置插入特定位置删除销毁链表总结学海无涯&#xff0c;苦作舟啊&#xff01; 老铁们加油 源代码放在总结处&#xff0c;需要的同志可以直接跳转到最后什么是单链表…

题库API调用详细教程

题库API调用详细教程 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击…

洛谷千题详解 | P1010 [NOIP1998 普及组] 幂次方【C++、Java、Python、Pascal语言】

博主主页&#xff1a;Yu仙笙 专栏地址&#xff1a;洛谷千题详解 目录 题目描述 输入格式 输出格式 输入输出样例 解析&#xff1a; C源码&#xff1a; Pascal源码&#xff1a; Java源码&#xff1a; Python源码&#xff1a; ------------------------------------------------…

C#基础:类class与结构struct的区别

一、类class 类class是引用类型&#xff0c;可以直接赋值为null&#xff0c;默认值也是null XClass xClass null;//语法正确 一般来说&#xff0c;某个类对象使用另一个类的对象赋值时&#xff0c;则两者共用一个内存地址【节约内存空间】&#xff0c;ReferenceEquals引用比…

JDK的安装-详细版

大家好&#xff0c;我是研究大数据领域的 查德-常&#xff0c;大数据是一个随着数据量快速增长而应运而生的行业&#xff0c;让我来带你了解大数据吧。 JDK的安装JDK安装1.1 搜索jdk1.2 登录Oracle1.3 安装jdk1.4 环境配置1.5 验证是否安装好jdk由于粉丝中初学者比较多&#xf…

《web课程设计》用HTML CSS做一个简洁、漂亮的个人博客网站

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: ​​【主页——&#x1f680;获取更多优质源码】​​ &#x1f393; web前端期…

西祠胡同社区彻底消失

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 今天打开西祠胡同&#xff0c;发现网站备案注销了&#xff0c;域名(www.xici.net)停止解析了&#xff0c;半年前1元转让股权的事也不了了之&#xff0c;西祠胡同就这样静悄悄的消失了&#xff0c;连…

MongoDB 数据库(一):MongoDB的介绍与安装

目录一、MongoDB数据库的介绍与安装1.1 NoSQL数据库简介1.2 MongoDB 简介1.2.1 再议业务应用场景1.2.2 为什么要使用 MongoDB1.2.3 适用场景二、安装和使用MongoDB客户端2.1 Windows 安装 MongoDB2.2 Linux-Centos7 安装 MongoDB2.3 安装Studio 3T一、MongoDB数据库的介绍与安装…

PyCharm连接远程Docker环境

1. docker 配置 使用-p参数暴露一个端口用于ssh连接。 docker run -itd --name wangchao_paddle --gpus all -p 8899:8888 -p 8822:22 -v /data:/root/data registry.baidubce.com/paddlepaddle/paddle:2.3.0-gpu-cuda10.2-cudnn7 /bin/bash如果镜像没有ssh则需要先安装。&am…

后台获取不到请求头中token信息的解决方法

前言 项目要做单点登录功能&#xff0c;于是在shiro的基础上加入了自定义的 Filter&#xff0c;使用 JWT 自定义生成和校验token信息。 功能写好后自己在 postman 中测试了效果&#xff0c;将 token 放在 Headers 中请求后台接口&#xff08;如下图&#xff0c;还没发现问题&…

【微服务】基于Ribbon实现负载均衡

前言 我们在上篇文章中讲解了如何通过Nacos实现服务治理&#xff0c;由此引发的负载均衡的问题。这篇文章就介绍一个SpringCloud alibaba的另一个组件&#xff1a;Ribbon&#xff0c;如何通过Ribbon实现负载均衡。 负载均衡 什么是负载均衡&#xff1f; 通俗的讲&#xff0…