Vue 3 + Vite + TypeScript 实战手册
这篇文章基于当前 companyDashboard 项目整理,面向准备上手 Vue 3 + Vite + TypeScript 的读者。除明确标注“可选扩展”的部分外,文中的目录、命令和代码都以当前仓库为准,适合一边看文档一边对照项目。
GitHub 仓库:https://github.com/kunyashaw/vue3Crush
目录
1. 工程总览
1.1 当前项目在做什么
这是一个典型的后台控制台示例项目,页面流转很清晰:
- 访问 /,先进入 Splash 闪屏页。
- 2 秒后自动跳转到 /login。
- 用户登录成功后进入 /dashboard。
- Dashboard 里同时演示了业务大盘、Pinia、Composable、Teleport 和生命周期钩子。
1.2 技术栈一览
模块技术作用构建工具Vite本地开发、打包构建、模块热更新核心框架Vue 3组件化开发与响应式渲染语言TypeScript类型约束、编辑器提示、重构安全性路由Vue Router页面切换与导航守卫状态管理Pinia全局身份信息与 UI 状态管理UI 框架Vuetify现成的后台组件与 Material 风格控件图标@mdi/fontVuetify 图标依赖测试Vitest + @vue/test-utilsStore、Composable、组件测试模板脚手架Plop自动生成 View / Component / Composable1.3 推荐关注的工程结构
- companyDashboard
- ├── public
- │ └── favicon.ico
- ├── src
- │ ├── App.vue
- │ ├── main.ts
- │ ├── router
- │ │ └── index.ts
- │ ├── views
- │ │ ├── Splash/index.vue
- │ │ ├── UserLogin/index.vue
- │ │ └── Dashboard/index.vue
- │ ├── components
- │ │ ├── TeleportDemo.vue
- │ │ ├── GlobalLoading.vue
- │ │ ├── GlobalToast.vue
- │ │ └── GlobalDialog.vue
- │ ├── stores
- │ │ ├── useAuthStore.ts
- │ │ ├── useUiStore.ts
- │ │ └── counter.ts
- │ ├── composables
- │ │ └── useInfoList.ts
- │ └── __tests__
- │ ├── router.spec.ts
- │ ├── UserLogin.spec.ts
- │ ├── useAuthStore.spec.ts
- │ └── useInfoList.spec.ts
- ├── plop-templates
- │ ├── component
- │ │ ├── index.vue.hbs
- │ │ └── component.spec.ts.hbs
- │ ├── composable
- │ │ ├── index.ts.hbs
- │ │ └── composable.spec.ts.hbs
- │ └── view
- │ └── index.vue.hbs
- ├── plopfile.js
- ├── package.json
- └── vue3Crash.md
复制代码 1.4 这个项目最值得学习的点
- Router + Pinia + Composable 的职责划分很典型。
- Dashboard 页面把「局部状态」和「全局状态」拆得比较明确。
- Teleport 的演示很适合用来理解“代码写在哪”和“DOM 渲染在哪”是两件事。
- Plop 把重复劳动自动化了,适合团队约束目录结构。
- useUiStore + GlobalLoading/Toast/Dialog 这一套很适合作为全局交互层的基础设施。
2. 初始化与依赖安装
2.1 环境要求
在开始之前,最好先把本地环境对齐,否则你可能会在安装依赖或运行脚本时遇到版本问题。
- Node.js:^20.19.0 || >=22.12.0
- npm:跟随 Node.js 自带版本即可
- 包管理器:本文统一使用 npm
上面的 Node 版本要求来自当前项目 package.json 里的 engines.node 配置。如果你的 Node 版本偏旧,建议先升级再继续。
2.2 创建项目
- # 1) 创建工程
- npm create vue@latest companyDashboard
- # 2) 按提示勾选
- # - TypeScript
- # - Router
- # - Pinia
- # - Vitest
- # - ESLint / Prettier
- # 3) 进入项目
- cd companyDashboard
- # 4) 安装脚手架生成的依赖
- npm install
- # 5) 安装 UI 相关依赖
- npm install vuetify @mdi/font
- # 6) 安装 Plop
- npm install -D plop
- # 7) 如果测试中需要 createTestingPinia
- npm install -D @pinia/testing
复制代码 2.3 为什么这里单独提到 @pinia/testing
很多教程里会直接在测试代码中写 createTestingPinia(),但如果没有安装 @pinia/testing,测试会直接报模块找不到。
所以只要你准备写组件测试,并且想方便地 mock Pinia,就把它作为测试依赖补上。
2.4 推荐命令清单
- {
- "scripts": {
- "dev": "vite",
- "build": "run-p type-check "build-only {@}" --",
- "preview": "vite preview",
- "test:unit": "vitest",
- "build-only": "vite build",
- "type-check": "vue-tsc --build",
- "lint": "run-s lint:*",
- "lint:oxlint": "oxlint . --fix",
- "lint:eslint": "eslint . --fix --cache",
- "format": "prettier --write --experimental-cli src/",
- "plop": "plop"
- }
- }
复制代码 3. Plop 模块与 hbs 模板
Plop 的价值很简单:把“新建一个 View / Component / Composable 时重复复制粘贴”的动作交给脚手架。
为了避免部分博客平台把“双花括号模板语法”误当成可执行模板,下面的展示代码统一用 __PROPER_CASE_NAME__、__CAMEL_CASE_NAME__ 这类占位符代替。
如果你回到仓库里看真实文件,会看到 Handlebars helper 版本的写法,也就是把 properCase name、camelCase name、dashCase name 这些 helper 包在双花括号里。
3.1 plopfile.js
[code]export default function (plop) { plop.setWelcomeMessage('
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |