Vue3 + Vite + Pinia + TS 入门项目搭建
本文将从零开始搭建一个 Vue3
+ Vite
+ Pinia
+ TS
入门项目
源码:https://github.com/hal-wang/vue3-vite-ts-template
1 | git clone https://github.com/hal-wang/vue3-vite-ts-template.git |
- Vue3 + Vite
- Pinia: 新的状态管理工具,替代 Vuex
- Vue Router 4: 路由管理
- TS + setup: TS 语法糖写法
- Prettier: 格式化工具
- ESlint: 格式标准工具
- Windi CSS: 功能类优先的 CSS 框架,与 Tailwind CSS 用法相同,但速度更快
- iconify + svg: iconify 是功能丰富的图标框架,加上 svg 文件解析,让你选图标随心所欲
- huskey + lint-staged 每次提交代码校验格式规范
- huskey + commitlint 每次提交代码校验提交消息规范
文中都是用 yarn,如果你使用 npm,可以相应替换
创建项目
- 在特定目录下运行命令
1 | yarn create @vitejs/app |
按提示,输入项目名
选择 vue -> vue-ts 模板
进入项目,在项目目录下执行
1 | yarn install |
- 运行项目
1 | yarn dev |
基本配置
环境变量
如果你不需要区分多个环境,可以跳过这部分
Vite 使用 ESM
的方式访问环境变量,即不再使用 process.env
1 | import.meta.env.VITE_NAME |
你可以使用多个环境来用于 开发/生产 环境
环境变量文件
在项目根目录下创建环境变量文件
命名格式为 .env.<name>
,如 .env.production
和 .env.development
环境变量文件内容
1 | NODE_ENV=development |
其中 NODE_ENV 值为 development
或 production
,对应 开发/生产 环境
使用环境变量
在组件中,使用方式如下
1 | const url = import.meta.env.VITE_BASE_URL |
指定环境
在 package.json
文件的 scripts 命令中,增加参数 --mode <name>
即可指定环境
如
1 | "dev": "vite", |
改为
1 | "dev": "vite --mode development", |
环境变量智能提示
添加文件 src/types/global
1 | // 添加项目实际需要的内容 |
添加文件 src/build/env.ts
1 | export function wrapperEnv(envConf: Record<string, any>): ViteEnv { |
在使用的地方可以这样
1 | import { wrapperEnv } from '/@/build/env'; |
网络代理
配置网络代理可以解决开发时的跨域问题,此配置仅开发环境有效,生产环境应配合 nginx 等实现转发
如果你的项目不需要与后端交互,或无需考虑跨域问题,可忽略此部分
创建帮助函数
添加文件 src/build/proxy.ts
创建 createProxy
函数用于创建代理
1 | import type { ProxyOptions } from 'vite'; |
配置
修改 vite.config.ts
文件,增加
1 | const viteEnv = wrapperEnv(env); |
1 | server: { |
VITE_GLOB_API_PROXY_PREFIX
为代理的路由段
使用
开发环境调用接口时,需要增加 /api
开头,如
1 | get('/api/user') |
发布环境不能加 /api
开头,因此你需要封装网络访问,以防止每次请求都判断运行环境
代码如
1 | if(dev){ |
路径别名
配置路径别名后可以使用路径如 /@/views/index.ts
, /@/components/comp.ts
等
- 在
vite.config.ts
文件中,增加内容
1 | import { resolve } from 'path'; |
/@/
用于模块,/#/
用于类型
tsconfig.json
中增加compilerOptions.paths
和compilerOptions.baseUrl
,用于支持 TS 语法检查
1 | { |
VSCode 配置和断点调试
配置好编辑器,能让开发更顺畅
基本配置
创建 .vscode/settings.json
文件,用于存储 vscode 配置信息
1 | { |
F5 断点调试
- 创建
.vscode/launch.json
文件
1 | { |
edge
可换为 Chrome
或其他浏览器
- 编辑
vite.config.ts
文件,增加
1 | build: { |
即 development 环境下启用 source map,开启后调试器才能正确找到执行语句所在代码位置
vite.config.ts
整体配置如
1 | import { defineConfig } from 'vite'; |
添加 Pinia
Pinia 是 Vue3 推荐的状态管理工具,对 TS 的支持很完善,用起来也比较舒服
安装
- 在项目下运行
1 | yarn add pinia |
创建文件
在
src
下创建 store 文件夹,在 store 文件夹下创建index.ts
文件,便于统一管理index.ts
文件中添加代码
1 | import type { App } from 'vue'; |
- 在
main.ts
中修改代码如
1 | import { createApp } from "vue"; |
- 在 store 文件夹下创建 modules 文件夹,此后新增模块可以在这个文件夹中统一管理,如
app.ts
1 | import { defineStore } from 'pinia'; |
使用
在需要使用的地方
- 若在 setup 函数中你可以这样
1 | const appStore = useAppStore(); |
- 在非 setup 函数中你可以这样
1 | const appStore = useAppStoreWithOut(); |
- 同时有
get
和set
的computed
1 | const appStore = useAppStore(); |
简单介绍
getters
pinia 中的 getters 和 vuex 中的 getters 功能相同
actions
- pinia 中 actions 可以不依赖 mutations,能够在 action 中直接修改状态值
- pinia 中的 actions 支持多个参数
- pinia 中的 actions 支持异步函数
添加路由
如果你的网站不涉及多页面跳转,可以忽略此部分内容
安装
- 在项目下运行
1 | yarn add vue-router |
使用
- 在
src
下创建 router 文件夹,在 router 文件夹下创建index.ts
文件和modules
文件夹,便于统一管理
1 | import type { App } from "vue"; |
以上代码可以动态加载 router/modules
中的路由文件,此后各个模块的路由可以在此文件夹下创建
- 在
modules
文件夹中创建路由文件,如home.ts
1 | import { RouteRecordRaw } from "vue-router"; |
上面示例同时需要创建 views/home/index.vue
文件
- 在
main.ts
中新增代码
1 | setupRouter(app); |
如
1 | import { createApp } from "vue"; |
- 在
src/App.vue
中添加
1 | <router-view></router-view> |
如
1 | <template> |
router-view
是用来渲染路由对应的页面组件
增加 nProgress
配置 nProgress 可以让页面顶部有个进度条
安装插件
1 | yarn add nprogress |
增加路由钩子
- 创建文件
src/router/guard.ts
1 | import { Router } from 'vue-router'; |
- 修改文件
src/router/index.ts
中的setupRouter
函数,增加以下代码
1 | createProgressGuard(router); |
现在函数为
1 | // config router |
设置进度条样式
- 创建文件
src/design/index.less
1 | #nprogress { |
@primary-color
是后面 增加 stylelint + postcss + less
部分增加的 less
变量
main.ts
中引入
1 | import '/@/design/index.less'; |
添加 Prettier
Prettier 用于格式化代码
安装
在项目目录下执行以下命令安装插件
1 | yarn add prettier --dev |
配置
- 项目目录下创建
prettier.config.js
文件,代码如下
1 | module.exports = { |
- 项目目录下创建
.prettierignore
文件,用于配置那些文件需要忽略检查
1 | /dist/* |
增加格式化脚本
在 package.json 中的 scripts 中新增
1 | "lint:prettier": "prettier --write \"src/**/*.{js,json,tsx,css,less,scss,vue,html,md}\"", |
之后运行 npm run lint:prettier
即可格式化全部代码
添加 ESlint
ESlint 可以规范代码格式
安装
- 在项目目录下执行以下命令安装插件
1 | yarn add @typescript-eslint/eslint-plugin --dev |
- 如果配合 prettier ,也需要安装
1 | yarn add eslint-config-prettier --dev |
- 如果报错
The engine "node" is incompatible with this module. Expected version ">= 16.9.0". Got "***"
,执行以下语句再重试
1 | yarn config set ignore-engines true |
配置
- 项目目录下创建
.eslintrc.js
文件
1 | module.exports = { |
- 项目目录下创建
.eslintignore
文件,用于配置那些文件需要忽略检查
1 | *.sh |
增加检查脚本
在 package.json 中的 scripts 中新增
1 | "lint:eslint": "eslint --cache --max-warnings 0 \"{src,mock}/**/*.{vue,ts,tsx}\" --fix", |
之后运行 npm run lint:eslint
即可检查全部代码是否有不规范的地方
增加 Windi CSS
Windi CSS 是一个功能类优先的 CSS 框架,与 Tailwind CSS 用法相同,但速度更快
安装
- 在项目目录下执行以下命令安装插件
1 | yarn add windicss --dev |
配置
- 修改
vite.config.ts
文件,增加如下代码
1 | plugins: [WindiCSS()], |
整体代码如
1 | import { defineConfig } from 'vite'; |
- 修改
main.ts
文件,增加如下代码
1 | import 'virtual:windi.css' |
- 增加
windi.config.ts
文件
1 | import { defineConfig } from 'vite-plugin-windicss'; |
增加 stylelint + postcss + less
- stylelint 是一个现代的、强大的 CSS 检测工具,用这个比 eslint 检查 css 更强大
- postcss 是一个使 CSS 更容易,更灵活,更快速工作的工具
- less 是一个 CSS 预处理器,便于管理和重用样式表
安装
在项目目录下执行以下命令安装插件
1 | yarn add less --dev |
增加检查脚本
在 package.json 中的 scripts 中新增
1 | "lint:stylelint": "stylelint --cache --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/", |
之后运行 npm run lint:stylelint
即可检查全部代码是否有 CSS 不规范的地方
配置
- 项目目录下创建
stylelint.config.js
文件存放 stylelint 的配置
1 | module.exports = { |
- 项目目录下创建
.stylelintignore
文件,用于配置那些文件需要忽略检查
1 | /dist/* |
- 在
vite.config.ts
文件中,增加下面预处理配置
1 | css: { |
完整代码如:
1 | import { defineConfig } from 'vite'; |
增加 husky + lint-staged
使用 husky
+ lint-staged
,可以实现每次提交 git 前,自动检查代码的格式规范
安装
在项目目录下执行以下命令安装插件
1 | yarn add lint-staged --dev |
配置
lint-staged
在 package.json 中的 scripts 中新增
1 | "lint:staged": "lint-staged", |
之后运行 npm run lint:staged
即可手动检查
修改 package.json 文件,增加如下配置内容
1 | "lint-staged": { |
husky
在 package.json 中的 scripts 中新增
1 | "prepare": "husky install", |
然后执行下面语句自动创建 .husky
文件夹
1 | yarn prepare |
在此之后,每次执行 yarn install
语句,会自动执行上面的语句
然后创建文件 .husky/pre-commit
,每次提交代码前会执行这个脚本
1 | !/bin/sh |
增加 husky + commitlint
使用 husky
+ commitlint
,可以实现每次提交 git 前,自动检查格式规范
规划化提交格式,可用于自动更新 CHANGELOG.md
、自动生成 Release 内容等功能
husky 按前面的 增加 husky + lint-staged
部分安装和配置,此处仅介绍 commitlint
相关
安装
在项目目录下执行以下命令安装插件,
1 | yarn add @commitlint/cli --dev |
配置
增加文件 .commitlintrc.js
用于存放 commitlint
校验规则
1 | module.exports = { |
新增文件 .husky/commit-msg
存放提交代码前执行的脚本
1 |
|
增加 svg 支持
配置后能够解析 svg 图标文件
安装
- 在项目目录下执行以下命令安装插件
1 | yarn add vite-plugin-svg-icons --dev |
配置
- 修改
vite.config.ts
文件,增加如下代码
1 | plugins: [SvgIconsPlugin({ |
iconDirs 是配置图标文件目录,这里是 src/assets/icons
,也可以修改为其他目录
整体代码如
1 | import { defineConfig } from 'vite'; |
- 修改
main.ts
文件,增加如下代码
1 | import 'virtual:svg-icons-register'; |
封装组件
封装组件用起来更方便,否则只能每次用到的地方都这样写
1 | <svg aria-hidden="true"> |
在 components/Icon
下创建 SvgIcon.vue
文件,内容为
1 | <template> |
使用时
1 | <SvgIcon name="name" color="red"/> |
增加 iconify
通过文件的方式使用 svg 还不够方便,用上更强大的 iconify 吧
iconify 是功能丰富的图标框架,可以与任意图标库一起使用
安装
- 在项目目录下执行以下命令安装插件
1 | yarn add @iconify/iconify |
配置
- 修改
vite.config.ts
文件,增加如下代码
1 | plugins: [PurgeIcons({})], |
整体代码如
1 | import { defineConfig } from 'vite'; |
使用 Iconify
在这里搜索图标即可使用,无需下载 https://icon-sets.iconify.design/
1 | <span class="iconify" data-icon="ic:baseline-add-reaction"></span> |
封装组件
封装组件用起来更方便
在 src/components
下创建 Icon
文件夹和 Icon/index.vue
文件
1 | <template> |
使用时
1 | <Icon icon="ant-design:aliyun-outlined"/> |
与 svg 封装为一个组件
Icon/index.vue
修改为
1 | <template> |
使用时
1 | <Icon icon="lavcode|svg" color="red" size="50"/> |
完整的 vite.config.ts
根据此教程,完整的 vite.config.ts
文件内容为
1 | import { ConfigEnv, loadEnv, UserConfig } from 'vite'; |
完整的 package.json
根据此教程,完整的 package.json
文件内容为
1 | { |