vite项目框架搭建

news2025/1/18 13:59:46

vite项目框架搭建

在这里插入图片描述

1. 使用vite初始化项目

开始 | Vite 官方中文文档 (vitejs.dev)

pnpm create vite
# 依次设置项目名称、选择框架【vue】、选择语言【typescript】
√ Project name: ... vite-project
√ Select a framework: » Vue
√ Select a variant: » TypeScript

2. element-plus安装

安装

pnpm install element-plus

使用(官方推荐-自动导入)

  • 首先你需要安装unplugin-vue-componentsunplugin-auto-import这两款插件

    • unplugin-vue-components
    • unplugin-auto-import
pnpm install -D unplugin-vue-components unplugin-auto-import
  • 然后把下列代码插入到你的 Vite 的配置文件中
// vite.config.ts
import { defineConfig } from 'vite'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'

export default defineConfig({
  // ...
  plugins: [
    // ...
    AutoImport({
      resolvers: [ElementPlusResolver()],
    }),
    Components({
      resolvers: [ElementPlusResolver()],
    }),
  ],
})
  • 还需要自动导入样式

不导入的话,当使用指令类型组件(ElMessageBox等),会出现没有样式的问题

安装插件:unplugin-element-plus

pnpm add -D unplugin-element-plus

配置vite-config-ts

// vite.config.ts
//import ElementPlus from 'unplugin-element-plus/vite'
//按官网上面的导入会报错,下面的才可以,不清楚为什么
import ElementPlus from "unplugin-element-plus/dist/vite

export default {
  plugins: [
    ElementPlus({
      // options
    }),
  ],
}

3. 引入Tailwind CSS

旧版本中文文档(v2.2.16):https://www.tailwindcss.cn/

安装 Tailwind 以及其它依赖项:

pnpm install -D tailwindcss@latest postcss@latest autoprefixer@latest

创建配置文件

生成 tailwind.config.jspostcss.config.js 文件

npx tailwindcss init -p

修改tailwind.config.js,配置模板路径:

/** @type {import('tailwindcss').Config} */
export default {
  content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
  theme: {
    extend: {},
  },
  plugins: [],
}

将Tailwind指令添加到CSS

将Tailwind的每个层的 @tailwind 指令添加到主CSS文件中(根目录style.css)。

/**style.css头部 */
@tailwind base;
@tailwind components;
@tailwind utilities;

确保style.css文件被导入到您的 ./src/main.js 文件中。

// src/main.ts
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'

createApp(App).mount('#app')

项目中使用

<template>
  <!-- 使用tailwind的flex样式 -->
  <div class="flex">
    <label>测试tailwindCss</label>
    <el-input value="测试tailwindCss的flex属性"></el-input>
    <el-button>测试</el-button>
  </div>
</template>

4. vue-router

TODO: 后面会对这里做优化,加入路由守卫

安装

pnpm add vue-router@4

新建视图文件

新建views文件夹,新建视图Home和About

  • Home.vue:
<script setup lang="ts"></script>
<template>
  <div>home</div>
</template>
<style lang="css" scoped></style>
  • About.vue:
<script setup lang="ts"></script>
<template>
  <div>About</div>
</template>
<style lang="css" scoped></style>

新建路由文件

新建router文件夹,新建router/index.ts和routes.ts

  • routes.ts:
// routes.ts
import Home from '../views/Home.vue'
import About from '../views/About.vue'
const routes = [
    { path: '/', name:'home',component: Home },
    { path: '/about',name:'about', component: About },
]

export default routes
  • index.ts:
import {createRouter,createWebHashHistory} from 'vue-router'
import routes from './routes'

// 创建路由实例并传递 `routes` 配置
const router = createRouter({
  // 内部提供了 history 模式的实现。为了简单起见,我们在这里使用 hash 模式。
  history: createWebHashHistory(),
  routes
})

export default router
  • 路由守卫

提为一个单独文件,新建router/guard.ts

import router from './index'

/**前置守卫 */
router.beforeEach((to,from)=>{
    console.log({to,from});
    return true;
})
/**后置守卫 */
router.afterEach((to,from)=>{
    // console.log({to,from});
})
  • src/main.ts中导入,使用router实例
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
// 导入router实例
import router from './router/index'
// 路由守卫
import './router/guard'

// 5. 创建并挂载根实例
const app = Vue.createApp({})
//确保 _use_ 路由实例使
//整个应用支持路由。
app.use(router)
app.mount('#app')

5. 添加Nprogress

可参考:如何在Vue3+TS的项目中使用NProgress进度条 - 掘金 (juejin.cn)

安装

pnpm install nprogress
# 使用typescript还需要安装类型文件
pnpm install -D @types/nprogress

使用

在路由守卫中使用。

guard.ts:

import router from './index'
import nprogress from 'nprogress'
import 'nprogress/nprogress.css';

/**前置守卫 */
router.beforeEach((to,from)=>{
    console.log({to,from});
    nprogress.start()
    return true;
})
/**后置守卫 */
router.afterEach((to,from)=>{
    nprogress.done()
    // console.log({to,from});
})

TODO:优化Nprogress封装

6. Pinia

安装

pnpm add pinia

创建一个 pinia 实例(根 store)

src/main.ts

/** main.ts*/
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import router from './router/index'
import './router/guard'
import {createPinia} from 'pinia'

const app = createApp(App)
app.use(createPinia())
app.use(router)
app.mount('#app')

自定义pinia模块

新建src/store;新建store/user.ts

/** user.ts*/
import {defineStore} from 'pinia'
export const useUserStore = defineStore('user',{
    state:()=>({
        name:'zhangqd'
    })
})

页面中使用

app.vue:

<script setup lang="ts">
import { useUserStore } from "./store/user";
const userStore = useUserStore();
</script>

<template>
  <div>
    姓名:{{ userStore.name }}
  </div>
</template>

7. eslint

  • 初始化安装和配置ESLint
# 初始化
npm init @eslint/config
# 步骤:选择1
? How would you like to use ESLint? … 
  To check syntax only
❯ To check syntax and find problems
  To check syntax, find problems, and enforce code style
# 2
✔ How would you like to use ESLint? · problems
? What type of modules does your project use? … 
❯ JavaScript modules (import/export)
  CommonJS (require/exports)
  None of these
# 3
✔ How would you like to use ESLint? · problems
✔ What type of modules does your project use? · esm
? Which framework does your project use? … 
  React
❯ Vue.js
  None of these
# 4
✔ How would you like to use ESLint? · problems
✔ What type of modules does your project use? · esm
✔ Which framework does your project use? · vue
? Does your project use TypeScript? › No / Yes
# 5(使用空格键选中,全部)
✔ How would you like to use ESLint? · problems
✔ What type of modules does your project use? · esm
✔ Which framework does your project use? · vue
✔ Does your project use TypeScript? · No / Yes
? Where does your code run? …  (Press <space> to select, <a> to toggle all, <i> to invert selection)
✔ Browser
✔ Node
# 6
✔ How would you like to use ESLint? · problems
✔ What type of modules does your project use? · esm
✔ Which framework does your project use? · vue
✔ Does your project use TypeScript? · No / Yes
✔ Where does your code run? · browser, node
? What format do you want your config file to be in? … 
❯ JavaScript
  YAML
  JSON
# 7
✔ How would you like to use ESLint? · problems
✔ What type of modules does your project use? · esm
✔ Which framework does your project use? · vue
✔ Does your project use TypeScript? · No / Yes
✔ Where does your code run? · browser, node
✔ What format do you want your config file to be in? · JavaScript
The config that you've selected requires the following dependencies:

eslint-plugin-vue@latest @typescript-eslint/eslint-plugin@latest @typescript-eslint/parser@latest
? Would you like to install them now? › No / Yes

# 8
✔ How would you like to use ESLint? · problems
✔ What type of modules does your project use? · esm
✔ Which framework does your project use? · vue
✔ Does your project use TypeScript? · No / Yes
✔ Where does your code run? · browser, node
✔ What format do you want your config file to be in? · JavaScript
The config that you've selected requires the following dependencies:

eslint-plugin-vue@latest @typescript-eslint/eslint-plugin@latest @typescript-eslint/parser@latest
✔ Would you like to install them now? · No / Yes
? Which package manager do you want to use? … 
  npm
  yarnpnpm

# 成功
# 1. Installing eslint-plugin-vue@latest, @typescript-eslint/eslint-plugin@latest, @typescript-eslint/parser@latest
# 2. Successfully created .eslintrc.cjs

上面安装的依赖:eslint-plugin-vue、@typescript-eslint/eslint-plugin、@typescript-eslint/parser

  • 自动生成的.eslintrc.cjs
module.exports = {
    "env": {
        "browser": true,
        "es2021": true,
        "node": true
    },
    "extends": [
        "eslint:recommended",
        "plugin:vue/vue3-essential",
        "plugin:@typescript-eslint/recommended"
    ],
    "overrides": [
    ],
    "parser": "@typescript-eslint/parser",
    "parserOptions": {
        "ecmaVersion": "latest",
        "sourceType": "module"
    },
    "plugins": [
        "vue",
        "@typescript-eslint"
    ],
    "rules": {
    }
}
  • 这时打开任一vue文件报错:

Parsing error: '>' expected.eslint,需要修改.eslintrc.cjs:

module.exports = {
    "env": {
        "browser": true,
        "es2021": true,
        "node": true
    },
    "extends": [
        "eslint:recommended",
        'plugin:vue/vue3-recommended',
        "plugin:@typescript-eslint/recommended"
    ],
    "overrides": [
    ],
    "parser": "vue-eslint-parser",
    "parserOptions": {
        "parser": "@typescript-eslint/parser",
        "ecmaVersion": "latest",
        "sourceType": "module"
    },
    "plugins": [
        "vue",
        "@typescript-eslint"
    ],
    "rules": {
        "vue/multi-word-component-names": "off",
        "@typescript-eslint/no-unused-vars": "warn"
    }
}

8. prettier

安装

# --save-exact:固定版本,不使用^/~
pnpm add -D --save-exact prettier

根目录创建一个空的配置文件.prettierrc.

echo {}> .prettierrc.json

根目录创建.prettierignore

让Prettier CLI和编辑器知道哪些文件不需要格式化

# 创建
touch .prettierignore

内容:

# 忽略文件:
# 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?

9. 解决Prettier和Eslint冲突

如果您使用ESLint,请安装eslint-config-prettier,以使ESLint和Prettier相互配合。它关闭所有不必要的或可能与Prettier冲突的ESLint规则。Stylelint也有类似的配置:stylelint-config-prettier

安装

pnpm add -D eslint-config-prettier

配置

"prettier" 添加到 .eslintrc.* 文件中的“extends”数组中。确保将其放在最后,以便它有机会覆盖其他配置。

{
  "extends": [
    //...
    "prettier"
  ]
}

10. husky

提交代码前校验代码格式/提交信息格式。一旦检查不通过,就可以阻止当前的代码提交,避免了不规范的代码和 git 提交出现在项目中。

安装

pnpm add -D husky

启用Git钩子

npx husky install

修改package.json

要在安装后自动启用Git钩子,需要编辑 package.json,在 script中添加以下指令:

// package.json
{
  "scripts": {
    "prepare": "husky install"
  }
}

创建pre-commit挂钩

要向钩子添加命令或创建一个新的钩子,请使用 husky add <file> [cmd]

npx husky add .husky/pre-commit "npm lint"

校验提交信息

  • 安装commitlint依赖@commitlint/cli ,@commitlint/config-conventional
pnpm add -D @commitlint/cli @commitlint/config-conventional
  • 生成/新建配置文件
echo "module.exports = {extends: ['@commitlint/config-conventional']};" > commitlint.config.cjs

或手动新建配置文件(和上面命令等效) commitlint.config.cjs:

module.exports = {
  extends: ["@commitlint/config-conventional"],
};
  • 添加commit-msg钩子
npx husky add .husky/commit-msg 'npx --no -- commitlint --edit "$1"'
  • 测试
# 测试(如果commlit-msg生效,回报错)
git commit -m '测试commitlint是否生效'
# 报错:
✖   subject may not be empty [subject-empty]type may not be empty [type-empty]
# 修改为正确格式type: subject(注意:feat后的引号一定是英文引号)
git commit -m 'feat: 测试commitlint是否生效'

绕过预先提交和提交msg钩子

如果某次提交想绕过 pre-commitcommit-msg 钩子,可以使用Git -n/--no-verify 选项:

git commit -m "feat: 提交的msg" --no-verify

11.lint-staged

husky代码提交钩子,pre-commit 在提交前,执行 shell,npm run lint,用于校验修正代码, 但缺点是每次提交前会对所有代码校验,用时长。所以需要借助 lint-staged(只校验当前提交的代码)。

安装

pnpm add -D lint-staged

package.json 文件中添加lint-staged设置

{
  "name": "vite-project",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {},
  "dependencies": {},
  "devDependencies": {},
  "lint-staged": {
    "*.{js,jsx,ts,tsx,vue}": "eslint --fix",
    "*.{js,jsx,ts,tsx,md,html,css}": "prettier --write"
  }
}

修改pre-commit钩子

.husky/pre-commit

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

pnpm lint-staged

12. axios

安装

pnpm add axios

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

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

相关文章

【strtok函数和strerror函数的介绍和使用以及扩展】

strtok函数和strerror函数的介绍和使用以及扩展 一.strtok函数 1.strtok函数介绍 资源来源于cplusplus网站 它的作用&#xff1a; 对此函数的一系列调用将 str 拆分为标记&#xff0c;这些标记是由分隔符中的任何字符分隔的连续字符序列。 在第一次调用时&#xff0c;该函数…

vue学习之Javascript 表达式内容渲染和属性绑定

Javascript 表达式内容渲染和属性绑定 创建 demo4.html,内容如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

Vuex核心概念 - actions 和 getters

文章目录 actions 和 getters一、actions作用使用目的&#xff1a; 二、actions的使用执行原理代码示例&#xff1a; 三、actions中的辅助函数mapActions代码示例&#xff1a; 四、核心-getters1. 什么是getters&#xff1f;2. getters的作用&#xff1a;3. 访问 getters 的两种…

Compose的一些小Tips - 可组合项的生命周期

系列文章 Compose的一些小Tips - 可组合项的生命周期&#xff08;本文&#xff09; 前言 本系列介绍Compose的一些常识&#xff0c;了解这些tips并不会让人摇身一变成为大佬&#xff0c;但可以帮助到一些学习Compose的安卓开发者避免一些误区&#xff0c;也是对入门详解中遗漏…

python的包管理

要在 mypackage 包外使用 mypackage 包里的 speak.py 文件以及 newpackage 包里的 jump.py 文件&#xff0c;你需要确保以下几个步骤&#xff1a; 确保目录结构正确&#xff0c;如下所示&#xff1a; mypackage/__init__.pyspeak.pynewpackage/__init__.pyjump.py在 speak.py…

解决在cmd中输入mongo出现‘mongo‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件的问题~

当我想通过shell连接mongoDB时&#xff0c;输入mongo命令&#xff0c;出现下述错误&#xff1a; 起初我以为我是忘记配置环境变量了&#xff0c;但检查后发现自己配置了&#xff0c;如果你和我是一样的问题&#xff0c;明明配置了环境变量&#xff0c;但上述问题依然没有被解决…

Go语言的[GPM模型]

在go中,线程是运行Groutine的实体,调度器的功能是把可以运行的Groutine分配到工作线程上 GPM模型 M与P的数量没有绝对的数量关系,当一个M阻塞时,P就会创建一个或者切换到另一个M,所以即使设置了runtime.GOMAXPROCS(1) 也可能创建多个M出来; 当M发现给自己输送G协程的那个P队列为…

懒加载指令实现

问题&#xff1a;页面过长&#xff0c;下面的图片不一定访问到&#xff0c;存在一定浪费。 解决方案&#xff1a;图片懒加载&#xff0c;仅当进入视口区&#xff0c;才发送请求显示图片。 全局指令 // 全局指令 app.directive(指令名称,{mounted(el, binding){// el:指令绑定…

《JUC》万万万万字长文解析!

JUC 四万字长文解析 juc&#xff0c;涵盖线程、内存模型、锁、线程池、原子类、同步器、并发容器、并发编程模式、并发编程应用等。 版本: jdk: 11spring boot: 2.7.0 JUC 是 java.util.concurrent 包的缩写&#xff0c;是 java 提供的用来并发编程的工具包。juc 提供了多种用…

ClickHouse的Join算法

ClickHouse的Join算法 ClickHouse是一款开源的列式分析型数据库&#xff08;OLAP&#xff09;&#xff0c;专为需要超低延迟分析查询大量数据的场景而生。为了实现分析应用可能达到的最佳性能&#xff0c;分析型数据库&#xff08;OLAP&#xff09;通常将表组合在一起形成一个…

MOS管为什么会存在寄生电感

说到MOS管的寄生参数&#xff0c;我们一般都只想到mos管各极间的寄生电容&#xff0c;很少会想到MOS管的寄生电感。 其实分立的MOS管它是存在寄生电感的&#xff0c;并且栅极&#xff0c;源极和漏极都存在。 在一些MOS的数据手册会提到这个寄生电感。 那么MOS管寄生电感是怎么产…

9月4日上课内容 第七章 案例:MHA高可用配置及故障切换

本章结构 案例概述 案例前置知识点 1&#xff0e;什么是 MHA&#xff08;MHA概念&#xff09; MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中&…

ComPtr源码分析

ComPtr源码分析 ComPtr是微软提供的用来管理COM组件的智能指针。DirectX的API是由一系列的COM组件来管理的&#xff0c;形如ID3D12Device&#xff0c;IDXGISwapChain等的接口类最终都继承自IUnknown接口类&#xff0c;这个接口类包含AddRef和Release两个方法&#xff0c;分别用…

BUUCTF easyre 1

使用die工具进行文件信息的查看 可以看到是64位程序 使用IDA64打开 f5 反汇编 得到flag

超详细Python第三方库的安装,多图,逐步骤

Python第三方库的安装 前言1. PyCharm中安装模块2. PyCharm终端中命令安装3. 命令行安装4. 命令补充 总结 前言 Python有丰富的第三方库&#xff0c;在Python编程中&#xff0c;经常需要安装第三方库&#xff0c;本文详细介绍了第三方模块/软件包的安装。 提示&#xff1a;大家…

手写Spring:第17章-通过三级缓存解决循环依赖

文章目录 一、目标&#xff1a;通过三级缓存解决循环依赖二、设计&#xff1a;通过三级缓存解决循环依赖2.1 通过三级缓存解决循环依赖2.2 尝试使用一级缓存解决循环依赖 三、实现&#xff1a;通过三级缓存解决循环依赖3.1 工程结构3.2 通过三级缓存解决循环依赖类图3.3 设置三…

Kafka3.0.0版本——消费者(手动提交offset)

目录 一、消费者&#xff08;手动提交 offset&#xff09;的概述1.1、手动提交offset的两种方式1.2、手动提交offset两种方式的区别1.3、手动提交offset的图解 二、消费者&#xff08;手动提交 offset&#xff09;的代码示例2.1、手动提交 offset&#xff08;采用同步提交的方式…

JavaScript-----jQuery

目录 前言&#xff1a; 1. jQuery介绍 2. 工厂函数 - $() jQuery通过选择器获取元素&#xff0c;$("选择器") 过滤选择器&#xff0c;需要结合其他选择器使用。 3.操作元素内容 4. 操作标签属性 5. 操作标签样式 6. 元素的创建,添加,删除 7.数据与对象遍历…

torch.cuda.is_available() 解决方

本人使用的显卡如下&#xff0c;打开任务管理器查看 Anaconda下载哪个版本都可以 使用命令conda create -n pytorch python3.6创建一个名为pytorch的环境&#xff0c;解释器使用3.6的 使用命令conda activate pytorch进入该环境 进入pytorch官网&#xff0c;选择下列选项 复…

九 动手学深度学习v2 ——卷积神经网络之AlexNet

文章目录 AlexNetVGG AlexNet AlexNet新引入dropout、ReLU、maxpooling和数据增强。 VGG VGG神经网络连接 图7.2.1的几个VGG块&#xff08;在vgg_block函数中定义&#xff09;。其中有超参数变量conv_arch。该变量指定了每个VGG块里卷积层个数和输出通道数。全连接模块则与Ale…