使用 Vue 官方脚手架初始化 Vue3 项目
Vite 官网:https://cn.vitejs.dev/
Vue 官网:https://vuejs.org/
Vue 官方文档:https://cn.vuejs.org/guide/introduction.html
Element Plus 官网:https://element-plus.org/
Tailwind CSS 官网:https://tailwindcss.com/
Tailwind CSS 中文文档 (73zls.com):https://tailwind.docs.73zls.com/docs/responsive-design
NPM 官网:https://www.npmjs.com/
Vite 官方中文文档:https://cn.vitejs.dev/
安装 Node 环境
首先,确保已经安装了 Node.js,可以在命令行中运行 node -v 和 npm -v 来检查它们是否已经正确安装:

安装 Node.js 通常会自动附带安装 npm,所以你不需要单独安装 npm。只需确保 Node.js 版本符合要求即可。
切换 NPM 镜像源
使用 nrm 来管理 npm 镜像源可以帮助加速 npm 包的下载速度。
-
执行命令通过 npm 全局安装
nrm:npm install -g nrm -
使用
nrm ls命令列出当前可用的镜像源,以及它们的地址和当前使用的镜像源:nrm ls -
使用
nrm use命令来切换想要使用的镜像源,例如,切换到淘宝镜像源:nrm use taobao -
使用以下命令来验证切换是否成功:
npm config get registry
安装 Pnpm 包管理工具
-
在命令行中执行以下命令全局安装 pnpm:
npm install -g pnpm -
安装完成后,可以使用 pnpm 来代替 npm 进行包管理。例如,使用以下命令来安装项目依赖:
pnpm install这将使用 pnpm 来安装项目所需的包,而不是使用默认的 npm。
使用 Vue 官方脚手架初始化项目
-
切换到打算创建项目的目录,输入
cmd打开命令行,之后在命令行中运行以下命令:pnpm create vue@latest -
运行命令后使用方向键和回车键选择【否/是】开启或关闭某个功能:

-
创建完项目之后,在命令行中继续输入以下命令运行项目:
cd <your-project-name> pnpm i pnpm run dev --open
认识 Vue 项目目录结构
Vue 3 项目的典型目录结构如下:
project-name/
├── public/ # 静态资源目录
│ └── favicon.ico # 网站图标
├── src/ # 源代码目录
│ ├── assets/ # 资源文件目录(图片、样式等)
│ ├── components/ # 组件目录
│ │ └── HelloWorld.vue # 示例组件
│ ├── router/ # 路由配置目录
│ │ └── index.ts # 路由配置文件
│ ├── store/ # 状态管理目录
│ │ └── index.ts # 状态管理配置文件(Pinia)
│ ├── views/ # 视图目录
│ │ └── Home.vue # 示例视图组件
│ ├── App.vue # 根组件
│ └── main.ts # 项目入口文件(使用 TypeScript)
├── .eslintrc.js # ESLint 配置文件
├── .gitignore # Git 忽略文件配置
├── .prettierrc.json # Prettier 配置文件
├── env.d.ts # 声明文件,用于声明全局环境变量的类型
├── index.html # 入口 HTML 文件
├── package.json # 项目配置文件
├── README.md # 项目说明文件
├── tsconfig.json # TypeScript 配置文件
└── vite.config.js # Vite 配置文件
统一包管理器工具下载依赖
-
创建
scripts\preinstall.js文件,添加:if (!/pnpm/.test(process.env.npm_execpath || '')) {console.warn(`\u001b[33mThis repository must using pnpm as the package manager` +`for scripts to work properly.\u001b[39m\n`)process.exit(1) } -
在 package.json 中配置命令:
"scripts": {"preinstall":"node ./scripts/preinstall.js" }preinstall是 npm 提供的生命周期钩子,当我们使用 yarn 或 npm 来安装依赖的时候就会触发preinstall。
项目环境变量配置
没有基础的同学可以先去阅读下环境变量的文章:认识和使用 Vite 环境变量配置
-
在项目根目录(
index.html文件所在的位置)下创建对应环境的.env文件,然后在文件中定义对应环境下的变量,默认情况下只有以VITE_为前缀的变量才会暴露给 Vite:-
.env【默认配置】:# 项目标题 VITE_APP_TITLE = OCTOPUS# 运行端口号 VITE_PORT = 8080 -
.env.development【开发环境】:# 开发环境 VITE_USER_NODE_ENV = development# 项目基本 URL VITE_BASE_URL = /dev/# 启动时自动打开浏览器 VITE_OPEN = true -
.env.production【生产环境】:# 生产环境 VITE_USER_NODE_ENV = production# 项目基本 URL VITE_BASE_URL = / -
.env.test【测试环境】:# 测试环境 VITE_USER_NODE_ENV = test# 项目基本 URL VITE_BASE_URL = /test/
-
-
创建
src\types\global.d.ts文件声明环境变量类型:// 定义泛型 Recordable,键类型为字符串、值类型为 T declare type Recordable<T = any> = Record<string, T>// 定义接口 ViteEnv,描述项目的环境变量结构 declare interface ViteEnv {VITE_USER_NODE_ENV: 'development' | 'production' | 'test' // 当前运行环境,可选值为 'development', 'production' 或 'test'VITE_GLOB_APP_TITLE: string // 应用标题VITE_PORT: number // Vite 端口号VITE_OPEN: boolean // 是否自动在浏览器打开应用VITE_REPORT: boolean // 是否开启 report 功能VITE_BUILD_COMPRESS: 'gzip' | 'brotli' | 'gzip,brotli' | 'none' // 可选值为 'gzip', 'brotli', 'gzip,brotli' 或 'none'VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE: boolean // 是否删除原始文件VITE_DROP_CONSOLE: boolean // 是否删除控制台VITE_BASE_URL: string // 基本 URLVITE_API_URL: string // API 地址VITE_PROXY: [string, string][] // 表示代理配置VITE_USE_IMAGEMIN: boolean // 是否使用图像压缩 } -
创建
build\getEnv.ts文件用于完成环境变量类型转换:/*** 从 Vite 的环境变量对象中读取值并进行类型转换* @param envConf 原始环境变量配置对象* @returns ViteEnv 适用于 Vite 的环境变量对象*/ export function wrapperEnv(envConf: Recordable): ViteEnv {// 创建一个空对象,用于存储处理后的环境变量const ret: any = {}// 遍历环境变量对象的键for (const envName of Object.keys(envConf)) {// 将环境变量值中的 '\n' 替换为换行符 '\n'let realName = envConf[envName].replace(/\\n/g, '\n')realName = realName === 'true' ? true : realName === 'false' ? false : realNameif (envName === 'VITE_PORT') realName = Number(realName)if (envName === 'VITE_PROXY') {try {realName = JSON.parse(realName)} catch (error) {// ignore}}ret[envName] = realName}return ret } -
在
tsconfig.json中添加 TypeScript 编译器配置:{"include": ["src/**/*.ts","src/**/*.d.ts","src/**/*.tsx","src/**/*.vue","build/**/*.ts","build/**/*.d.ts","vite.config.ts"],"exclude": ["node_modules", "dist", "**/*.js"] } -
在
vite.config.ts中获取环境变量,并修改 Vite 启动配置:import { defineConfig, loadEnv, ConfigEnv, UserConfig } from 'vite' import { wrapperEnv } from './build/getEnv'// https://vitejs.dev/config/ export default defineConfig(({ mode }: ConfigEnv): UserConfig => {const root = process.cwd()// 获取.env文件中的内容const env = loadEnv(mode, root)const viteEnv = wrapperEnv(env)return {root, //项目根目录base: viteEnv.VITE_BASE_URL, //基础 URLserver: {host: '0.0.0.0', //指定服务器主机地址port: viteEnv.VITE_PORT, //指定开发服务器端口strictPort: true, //若端口已被占用则会直接退出open: viteEnv.VITE_OPEN //服务器启动时,自动在浏览器中打开应用程序}} }) -
在项目中使用 Vite 提供的
import.meta.env对象获取这些环境变量:<script setup lang="ts"> const title = import.meta.env.VITE_APP_TITLE </script><template><h1>{{ title }}</h1> </template>
安装 Element Plus
-
使用包管理器 pnpm 安装 Element Plus:
pnpm install element-plus -
在
main.ts文件中引入 Element Plus:import { createApp } from 'vue' import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' import App from './App.vue'const app = createApp(App)app.use(ElementPlus) app.mount('#app') -
设置 Element Plus 默认语言为中文:
import ElementPlus from 'element-plus' import zhCn from 'element-plus/es/locale/lang/zh-cn'app.use(ElementPlus, {locale: zhCn, }) -
在
tsconfig.json中通过compilerOptions.type指定全局组件类型:{"compilerOptions": {// ..."types": ["element-plus/global"]} } -
在
App.vue中添加 Element Plus 按钮组件:<template><div class="mb-4"><el-button>Default</el-button><el-button type="primary">Primary</el-button><el-button type="success">Success</el-button><el-button type="info">Info</el-button><el-button type="warning">Warning</el-button><el-button type="danger">Danger</el-button></div> </template> -
执行命令启动项目:
pnpm run dev
集成 sass 配置全局变量
-
通过以下命令安装
sass:pnpm add sass -
创建
src\assets\styles\variable.scss全局变量文件://全局scss变量 $color:red -
在
vite.config.ts中使用additionalData引入全局的 Sass 变量文件:export default defineConfig({css: {preprocessorOptions: {scss: {javaScriptEnabled: true,// 向全局 scss 文件内容注入变量additionalData: `@import "@/assets/styles/variable.scss";`}}} }) -
在 Vue 组件中使用变量:
<script setup lang="ts"> // This starter template is using Vue 3 <script setup> SFCs </script><template><div><h1>Hello world!</h1></div> </template><style scoped lang="scss"> /* SCSS */ div {font: 2em sans-serif;h1 {color: $color;} } </style> -
执行命令启动项目:
pnpm run dev
清除默认样式
通常,浏览器会对一些 HTML 元素应用一些默认的样式,但这些默认样式在不同浏览器之间可能存在差异,导致页面在不同浏览器中呈现不一致。
清除默认样式可以将所有元素的样式重置为统一的基础样式,然后再根据需要逐个重新定义。这样可以确保在编写样式时,不会受到浏览器默认样式的影响,从而更容易实现跨浏览器的一致性。
-
进入 NPM 官网:https://www.npmjs.com/,搜索 reset.scss,复制即可:

-
创建
src\assets\styles\reset.scss文件,添加样式:*, *:after, *:before {box-sizing: border-box;outline: none; }html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {font: inherit;font-size: 100%;margin: 0;padding: 0;vertical-align: baseline;border: 0; }article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {display: block; }body {line-height: 1; }ol, ul {list-style: none; }blockquote, q {quotes: none;&:before,&:after {content: '';content: none;} }sub, sup {font-size: 75%;line-height: 0;position: relative;vertical-align: baseline; }sup {top: -.5em; }sub {bottom: -.25em; }table {border-spacing: 0;border-collapse: collapse; }input, textarea, button {font-family: inhert;font-size: inherit;color: inherit; }select {text-indent: .01px;text-overflow: '';border: 0;border-radius: 0;-webkit-appearance: none;-moz-appearance: none; }select::-ms-expand {display: none; }code, pre {font-family: monospace, monospace;font-size: 1em; } -
创建
src\assets\styles\index.scss文件,用于统一管理和维护项目的样式文件:@import './reset.scss'; -
在
main.ts文件中引入index.scss样式文件:import './assets/styles/index.scss'
安装 Tailwind CSS
-
打开 Tailwind CSS 官网【https://tailwindcss.com/】,点击【Docs】查看文档:

-
点击【Framework Guides】查看框架指南,我们的项目是使用 Vite 构建,所以点击【Vite】:

-
点击【Using Vue】查看安装步骤:

-
执行命令安装 Tailwind CSS:
pnpm i -D tailwindcss postcss autoprefixer
-
运行命令生成 Tailwind CSS 配置文件:
tailwind.config.js、postcss.config.jsnpx tailwindcss init -p
-
在
tailwind.config.js配置文件中添加模板文件路径:content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'] -
创建
src\assets\styles\tailwind.scss文件, 添加 Tailwind CSS 提供的用于导入基础样式、组件和实用工具的特殊指令:@tailwind base; @tailwind components; @tailwind utilities; -
在
src\assets\styles\index.scss文件引入tailwind.scss,或者在main.ts文件中直接引入:@import './tailwind.scss'; -
在项目中使用 Tailwind.css 设置内容样式:
<template><h1 class="text-3xl font-bold underline">Hello world!</h1> </template> -
执行命令启动项目:
pnpm run dev
相关文章:
使用 Vue 官方脚手架初始化 Vue3 项目
Vite 官网:https://cn.vitejs.dev/ Vue 官网:https://vuejs.org/ Vue 官方文档:https://cn.vuejs.org/guide/introduction.html Element Plus 官网:https://element-plus.org/ Tailwind CSS 官网:https://tailwindcss.…...
C语言中的宏定义(#define)和函数调用的区别
C语言中的宏定义(#define)和函数调用在概念、工作方式以及它们对代码的影响上有显著的区别。以下是它们之间的主要差异: 宏定义(#define) 工作方式:宏定义是在预处理阶段进行的文本替换。预处理器会在编译…...
196. 删除重复的电子邮箱
196. 删除重复的电子邮箱 题目链接:196. 删除重复的电子邮箱 代码如下: # Write your MySQL query statement below delete from Person as p where p.id not in(select e.id from (select min(id) as idfrom Person group by email ) as e )...
Android 大话binder通信 (上)
戳蓝字“牛晓伟”关注我哦! 用心坚持输出易读、有趣、有深度、高质量、体系化的技术文章 本文摘要 用故事的方式把binder通信的整个过程都描述出来,binder通信都经历了哪些节点,在这些节点上的数据有哪些变化,同时还对binder通…...
DevOps学习回顾01-技能发展路线-岗位能力-体系认知
事为先,人为重–事在人为 参考来源: 极客时间专栏:DevOps实战笔记,作者:石雪峰 课程链接:https://time.geekbang.org/column/intro/235 时代的典型特征 VUCA VUCA 是指易变性(Volatility&…...
【MySQL】复合查询和内外连接
文章目录 MySQL复合查询和内外连接1. 复合查询1.1 多表查询1.2 自连接1.3 子查询单行子查询多行子查询多列子查询from中使用子查询合并查询 2. 内外连接1. INNER JOIN2. LEFT JOIN3. RIGHT JOIN4. FULL JOIN5. CROSS JOIN MySQL复合查询和内外连接 1. 复合查询 1.1 多表查询 …...
【星海随笔】云解决方案学习日志篇(二) kafka、Zookeeper、Fielbeat
Elastic 中国社区官方博客 https://blog.csdn.net/ubuntutouch/category_9209092.html Kafka kafka的源代码是基于Scala语言编写的,运行在Java虚拟机(即:JVM)上。因此,在安装kafka之前需要先安装JDK Kafka 为什么依赖 Zookeepe…...
【测试专题】系统测试报告(原件Word)
软件测试报告在软件开发过程中起着至关重要的作用,主要有以下几个主要原因: 1、确保软件质量 2、提供决策支持 3、记录测试过程和结果 4、促进沟通和协作 5、符合标准和法规要求 6、改进测试流程和策略 7、降低风险 软件开发全套资料获取进主页或者本文末…...
C++中的模板方法模式
目录 模板方法模式(Template Method Pattern) 实际应用 数据处理流程 在线教育系统的课程模板 软件开发生命周期 总结 模板方法模式(Template Method Pattern) 模板方法模式是一种行为设计模式,它定义了一个操作…...
【数据结构】第十七弹---C语言实现选择排序
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、选择排序 1.1、基本思想 1.2、代码实现 1.3、代码测试 1.4、时空复杂度分析 总结 1、选择排序 1.1、基本思想 选择排序是一种简单直观的比…...
信号处理中的梯型权重操作(Tapering)
目录 1. 引言2. 一个Tapering操作的例子3. Tapering操作的简单实现延伸阅读1. 引言 Tapering 操作是对信号数据在水平和垂直方向上应用梯形权重,这个操作可以减弱数据边界效应,从而在进行傅里叶变换时减少伪影和边缘效应。本文将通过一个简单的例子来展示 Tapering 操作的具…...
深入解析分布式链路追踪:原理、技术及应用
目录 分布式链路追踪简介分布式链路追踪的基本概念 Span 和 Trace上下文传播采样策略 分布式链路追踪的工作原理常见的分布式链路追踪系统 ZipkinJaegerOpenTelemetry 分布式链路追踪的技术实现 数据收集数据传输数据存储数据展示 分布式链路追踪的应用场景 性能优化故障排除依…...
2024信息系统、信号处理与通信技术国际会议(ICISPCT2024)
2024信息系统、信号处理与通信技术国际会议(ICISPCT2024) 会议简介 2024国际信息系统、信号处理与通信技术大会(ICISPCT2024)将在青岛隆重开幕。本次会议旨在汇聚全球信息系统、信号处理和通信技术领域的专家学者,共同探索行业…...
用这个神级提示词插件,能让你的AI绘画工具Stable diffusion提示词直接写中文!
大家好,我是设计师阿威 最近,有同学在使用AI绘画工具 Stable Diffusion的时候和我说:老师,我英文不好,能不能直接让我写中文提示词啊?最好可以直接在SD的输入框就能直接写中文,不用切换网页或者…...
Android里的设计模式
一:设计模式分类 经典的23种设计模式是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides(合称“Gang of Four”)在他们的书《设计模式:可复用面向对象软件的基础》中定义的。以下是这些设计模式的分类和简要介绍。 1.…...
token无感刷新
Token无感刷新通常指的是在用户不知情的情况下自动刷新认证Token,以保持用户的会话状态。这通常在使用JWT(JSON Web Tokens)作为认证方式时使用。以下是实现无感刷新的一种常见方法: 1. 前端请求拦截: 在发送请求前&a…...
Golang的协程调度器GMP
目录 GMP 含义 设计策略 全局队列 P的本地队列 GMP模型以及场景过程 场景一 场景2 场景三 场景四 场景五 场景六 GMP 含义 协程调度器,它包含了运行协程的资源,如果线程想运行协程,必须先获取P,P中还包含了可运行的G…...
C++ 后端,Vue前端
参考2篇博客 1-VUE、C前后端调用 2-Vue解决CORS header ‘Access-Control-Allow-Origin’ missing及同源、跨域问题 这里给出App.vue代码 <script setup lang"ts"> import HelloWorld from ./components/HelloWorld.vueimport axios from axios import { ref…...
使用Navicat Premium向mysql插入2000000条数据
DELIMITER // DROP PROCEDURE IF EXISTS sys_log; CREATE PROCEDURE sys_log() BEGIN DECLARE n int DEFAULT 1; WHILE(n<2000000) DO INSERT INTO sys_log VALUES (n, 超级系统管理员, 查询实时工况数据, /keyParameterMonitoring/getNewestUnitData, {\"role\"…...
docker命令记录
基本命令和参数 docker run: 运行一个新的容器实例。-itd: 组合参数,含义如下: -i: 以交互模式运行容器,保持标准输入打开。-t: 分配一个伪终端。-d: 后台运行容器,即使容器启动后依然返回控制台。 设备映射 --device/dev/dri…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...
【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...
游戏开发中常见的战斗数值英文缩写对照表
游戏开发中常见的战斗数值英文缩写对照表 基础属性(Basic Attributes) 缩写英文全称中文释义常见使用场景HPHit Points / Health Points生命值角色生存状态MPMana Points / Magic Points魔法值技能释放资源SPStamina Points体力值动作消耗资源APAction…...
