## 特点 🐳
1. Vite 的
2. Vue3 的
3. 文件路由
4. 布局系统
5. Mock 支持
6. Api 自动引入
7. 组件自动引入
8. 图标自动引入
9. VueUse 支持
10. TypeScript 的
11. UnoCss 的
12. 暗黑模式支持
13. SWR 请求支持
14. pinia 状态管理
15. pnpm 包管理器
16. 跳转进度条支持
17. 开发面板支持
18. 插件自动加载支持
19. Vitest 单元测试支持
20. 支持 Markdown 渲染
21. 路径别名支持
22. 命令行自动创建与删除
23. i18n 国际化支持
24. 漂亮的 404 页 支持
25. tsx 支持
26. gzip 资源压缩支持
27. 环境变量配置支持
28. 统一的代码规范与风格支持
29. 生产环境自动移除开发日志
30. defineOptions 支持
31. echarts 支持
32. 全局通用 toast 通知
33. 全局通用 axios 请求封装
34. 自动生成环境变量类型声明
35. `renovate` 自动更新依赖
36. 自动版本更新并生成 `CHANGELOG`
37. 最快最小的 `dockerfile` 静态 `go` 服务
38. `base` 安全的路径解析
39. `lightningcss` 支持
40. `vite` 配置层支持 (实验性)
## 克隆模板 🦕
1. Github
```shell
git clone git@github.com:dishait/tov-template.git
```
2. Gitee
```shell
git clone git@gitee.com:dishait/tov-template.git
```
3. degit
```shell
npx degit https://github.com/dishait/tov-template#main
```
4. 新的 `Github` 仓库 👉
[Use this template](https://github.com/dishait/tov-template/generate)
## `node` 版本推荐 🐎
因为该模板完全面向现代,所以推荐大家使用 `node` 当前的长期维护版本 `v20`
## 使用 🐂
该模板仅支持 `pnpm` 包管理器 👉 [安装教程](https://pnpm.io/zh/installation)
1. 安装依赖
```shell
pnpm install
```
2. 开发
```shell
pnpm dev
# 开启 host
pnpm dev:host
# 自动打开浏览器
pnpm dev:open
```
3. 预览
```shell
pnpm preview
# 开启 host
pnpm preview:host
# 自动打开浏览器
pnpm preview:open
```
4. 打包
```shell
pnpm build
pnpm build:debug
```
5. 单元测试
```shell
pnpm test
```
6. 单元测试报告生成
```shell
pnpm coverage
```
7. 类型检查
```shell
pnpm typecheck
```
8. 自动创建
```shell
pnpm auto:create
```
9. 自动移除
```shell
pnpm auto:remove
```
10. 依赖更新
```shell
# 依赖版本更新
pnpm deps:fresh
```
```shell
# 以上命令仅对包信息 package.json 进行写入,需要重新执行包安装命令
pnpm i
```
11. 代码规范校验
```shell
pnpm lint
# 校验时修复
pnpm lint:fix
```
12. 安全初始化
```shell
pnpm safe:init
```
## 动机 🐗
为什么要做这个 **模板** 呢?
1. 为下次开发节省浪费在配置上的时间
2. 结合主流插件整合现代开发架构,提高开发效率
## 使用场景 🐻
什么时候你应该用?
1. 不想浪费时间在项目配置上
2. 希望尝试用更现代的方式开发 `web` 应用,提高开发效率
## 启发 🐃
该模板受 **[vitesse](https://github.com/antfu/vitesse)** 启发,如果你有 `SSG`
的场景,推荐你使用 **[vitesse](https://github.com/antfu/vitesse)**。
## 组织 🦔
欢迎关注 **帝莎编程**
- [官网](http://dishaxy.dishait.cn/)
- [Gitee](https://gitee.com/dishait)
- [Github](https://github.com/dishait)
- [网易云课堂](https://study.163.com/provider/480000001892585/index.htm?share=2&shareId=480000001892585)
## 详情 🐳
### [1. Vite 的](https://cn.vitejs.dev/)
该模板采用 **[vite](https://cn.vitejs.dev/)** 作为构建工具,你可以在根目录下的
`vite.config.ts` 对项目的构建进行配置。
对于众多主流插件的引入和繁杂配置已经整合到根目录下的预设 `presets`
中,大多数情况下你是不需要重新对它们进行配置的。
### [2. Vue3 的](https://v3.cn.vuejs.org/)
### [3. 文件路由](https://github.com/posva/unplugin-vue-router)
目录结构即路由。
eg:
- `src/pages/index.vue` => `/`
- `src/pages/about.vue` => `/about`
- `src/pages/users/index.vue` => `/users`
- `src/pages/users/profile.vue` => `/users/profile`
- `src/pages/users/[id].vue` => `/users/:id`
- `src/pages/[user]/settings.vue` => `/:user/settings`
- `src/pages/[...notFound].vue` => 404 路由
具体可见 👉 [unplugin-vue-router](https://github.com/posva/unplugin-vue-router)
### [4. 布局系统](https://github.com/dishait/vite-plugin-vue-meta-layouts)
#### 默认布局
`src/layouts/default.vue` 将作为默认布局。
```html
我是默认布局
#### 非默认布局
随便创建一个 `src/layouts/custom.vue`
```html
我是非默认布局custom
### [5. Mock 支持](https://github.com/vbenjs/vite-plugin-mock)
在根目录下的 `mock` 目录下,可以在模块中导出默认的 `api` 资源。
例如 `mock/test.ts` 内导出
```ts
import { MockMethod } from "vite-plugin-mock";
export default [
{
url: "/api/mock/get",
method: "get",
response: () => {
return {
code: 0,
data: {
name: "vben",
},
};
},
},
] as MockMethod[];
```
在 `src` 中就可以进行模拟请求。
```html
### [6. Api 自动引入](https://github.com/antfu/unplugin-auto-import)
原本 `vue` 的 `api` 需要自行 `import`。
```ts
import { computed, ref } from "vue";
const count = ref(0);
const doubled = computed(() => count.value * 2);
```
现在可以直接使用。
```ts
const count = ref(0);
const doubled = computed(() => count.value * 2);
```
而且上边的 `api` 是按需自动引入的。
目前模板支持自动引入 `api` 的库列表 👉
- `vue`
- `vuex`
- `pinia`
- `vue-i18n`
- `vue-router`
- `@vueuse/core`
- `@vueuse/head`
- `@vueuse/math`
只要确保已经安装依赖即可,具体可见 👉
[vite-auto-import-resolvers](https://github.com/dishait/vite-auto-import-resolvers#%E9%BB%98%E8%AE%A4%E6%94%AF%E6%8C%81%E5%88%97%E8%A1%A8),
当然还有项目中的自动引入,只需要满足以下规范即可。
1. `src/composables` 的导出将被按需自动引入。
例如有个 `src/composables/foo.ts`
```ts
// default 导出
export default 1000;
```
此时就不再需要 `import`了
```html
### [7. 组件自动引入](https://github.com/antfu/unplugin-vue-components)
原来需要 `import`
```html
### [8. 图标自动引入](https://unocss.dev/presets/icons)
可前往 👉 [icones](https://icones.netlify.app/),随意选择点击进入其中一个图标库

再点击选择其中一个喜欢的图标

复制其名称

在模板中即可通过 `class` 的方式直接使用,注意加上前缀 `i-`。
```html
```
保存后等待自动下载该图标库后,就可以在页面中看到对应图标。
同时推荐你使用 `vscode` 插件
[Iconify IntelliSense](https://marketplace.visualstudio.com/items?itemName=antfu.iconify)。
该插件会在模板中显示图标的预览。
当然图标动态加载也是支持的 👇
```html
```
注意动态图标,请确保在开发环境下所有的图标都测过一遍。
具体可见 👉 [unocss/presets/icons](https://unocss.dev/presets/icons)
### [9. VueUse 支持](https://vueuse.org/)
`VueUse` 是一个超级强的 `hooks` 库,例如你要获取鼠标位置,只需要这样 👇
```html
### [10. TypeScript 的](https://www.tslang.cn/)
不需要重新配置,直接用 `ts` 书写就行了。
### [11. unocss 的](https://unocss.dev/)
`unocss` 是一个开发中速度更快的 `原子css` 库。
直接在模板中用就行了,不需要配置。
```html
### [12. 暗黑模式支持](https://github.com/dishait/vue-dark-switch)
暗黑模式由 [vue-dark-switch](https://github.com/dishait/vue-dark-switch) 实现。
```html
### [13. SWR 请求支持](https://cn.attojs.org/)
SWR 是更现代的请求方式,具体可见文章 👉
[SWR](https://zhuanlan.zhihu.com/p/89570321)。
而 [vue-request](https://cn.attojs.org/) 是一个 `SWR` 的 `Vue` 版本请求库。
你可以这样用,例如请求 `/api/test`
```html
### [14. pinia 状态管理](https://pinia.vuejs.org/)
`pinia` 是下一代的状态管理库,比 `vuex` 更简单,`ts` 支持更好。
你可以在 `src/stores` 中进行状态的定义。
例如创建 `src/stores/counter.ts` 👇
```ts
// src/stores/counter.ts
import { defineStore } from "pinia";
export const useCounterStore = defineStore("counter", {
state() {
return { count: 0 };
},
actions: {
inc() {
this.count++;
},
},
});
```
定义完后在 `setup` 中直接使用即可
```html
```
### 22. 命令行自动创建与删除
只要输入 👇,即可创建一个标准的页面或组件
```shell
pnpm auto:create
```
当然也可以进行删除 👇
```shell
pnpm auto:remove
```
### [23. i18n 国际化支持](https://github.com/intlify/bundle-tools/tree/main/packages/vite-plugin-vue-i18n)
在日常的业务当中,可能会存在一些需要国际化的场景。那么只需要在根目录下的
`locales` 中定义不同语言的 `yml` 即可在项目中做到开箱即用的国际化支持。
比如 `locales/en.yml` 中用来定义需要国际化支持的英文内容。
```yml
# locales/en.yml
# English
index: index
about: about
not-found: Notfound
```
又如 `locales/简体中文.yml` 中用来定义需要国际化支持的中文内容。
```yml
# locales/简体中文.yml
# 中文
index: 主页
about: 关于
not-found: 未找到页面
```
此时在组件中即可这样用 👇
```html
### 24. 漂亮的 `404` 页支持
在日常业务中,当用户访问不存在的页面时,应该给到我们的用户一个不存在的信息提示,而这个提示的页面就是
`404` 页。
你可以随便访问一个不存在的页面,例如 `/bucunzai`

当然还有暗黑模式适应。

也支持简单的响应式适应。例如移动端浏览器上会有正确的显示。
当然如果这个 `404` 的封面不符合你的口味,那么可以在 `pages/[...notFound].vue`
中修改 `img` 标签的 `src`。默认是 `32.svg`,支持 `1 ~ 33` 的 `svg`。
例如,默认 👇
```html
```
修改 `/notFound/32.svg` 为 `/notFound/33.svg`
```html
```
即可切换封面为 👇

### 25. [`tsx` 支持](https://github.com/vitejs/vite/tree/main/packages/plugin-vue-jsx)
只需要 `tsx` 文件放在 `src/components` 下,即可直接在模板中使用。
例如你有一个 `src/components/foo.tsx` 文件,那么即可直接在模板中使用。
```tsx
// src/components/foo.tsx
export default defineComponent({
render() {
return