<img width="200px" height="200px" src="https://gitee.com/dishait/tov-template/raw/main/public/logo.png" />
<h1>
<a href="https://tov-template.netlify.app/" target="_blank">tov-template</a>
</h1>
vite + vue3 + ts 开箱即用现代开发模板
renovate 自动更新依赖CHANGELOGdockerfile 静态 go 服务base 安全的路径解析lightningcss 支持vite 配置层支持 (实验性)git clone git@github.com:dishait/tov-template.git
git clone git@gitee.com:dishait/tov-template.git
npx degit https://github.com/dishait/tov-template#main
Github 仓库 👉
Use this templatenode 版本推荐 🐎因为该模板完全面向现代,所以推荐大家使用 node 当前的长期维护版本 v20
该模板仅支持 pnpm 包管理器 👉 安装教程
pnpm install
pnpm dev
# 开启 host
pnpm dev:host
# 自动打开浏览器
pnpm dev:open
pnpm preview
# 开启 host
pnpm preview:host
# 自动打开浏览器
pnpm preview:open
pnpm build
pnpm build:debug
pnpm test
pnpm coverage
pnpm typecheck
pnpm auto:create
pnpm auto:remove
# 依赖版本更新
pnpm deps:fresh
# 以上命令仅对包信息 package.json 进行写入,需要重新执行包安装命令
pnpm i
pnpm lint
# 校验时修复
pnpm lint:fix
为什么要做这个 模板 呢?
什么时候你应该用?
web 应用,提高开发效率该模板受 vitesse 启发,如果你有 SSG
的场景,推荐你使用 vitesse。
欢迎关注 帝莎编程
该模板采用 vite 作为构建工具,你可以在根目录下的
vite.config.ts 对项目的构建进行配置。
对于众多主流插件的引入和繁杂配置已经整合到根目录下的预设 presets
中,大多数情况下你是不需要重新对它们进行配置的。
目录结构即路由。
eg:
src/pages/index.vue => /src/pages/about.vue => /aboutsrc/pages/users/index.vue => /userssrc/pages/users/profile.vue => /users/profilesrc/pages/users/[id].vue => /users/:idsrc/pages/[user]/settings.vue => /:user/settingssrc/pages/[...notFound].vue => 404 路由具体可见 👉 unplugin-vue-router
src/layouts/default.vue 将作为默认布局。
<template>
我是默认布局
<router-view />
</template>
此时 src/pages/index.vue
<template>
我是首页
</template>
路由到 /时,页面将渲染
我是默认布局 我是首页
此时 src/pages/about.vue
<template>
我是关于页
</template>
路由到 /about 时,页面将渲染
我是默认布局 我是关于页
随便创建一个 src/layouts/custom.vue
<template>
我是非默认布局custom
<router-view />
</template>
此时 src/pages/index.vue 内
<template>
我是首页
</template>
<route lang="json">
{
"meta": {
"layout": "custom"
}
}
</route>
此时路由到 /, 页面将渲染
我是非默认布局custom 我是首页
具体可见 👉 vite-plugin-vue-meta-layouts
在根目录下的 mock 目录下,可以在模块中导出默认的 api 资源。
例如 mock/test.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 中就可以进行模拟请求。
<script setup lang="ts">
import { useRequest } from 'vue-request'
// 请求接口 /api/get
const { data, loading, error } = useRequest('/api/mock/get')
</script>
<template>
data: {{data}}
loading: {{loading}}
error: {{error}}
</template>
这里用到 vue-request 去做请求,不过因为该 mock
拦截的是一整个接口,所以换成 axios 等请求库也是可以的。
更多 mock 设置可见 👉
vite-plugin-mock
原本 vue 的 api 需要自行 import。
import { computed, ref } from "vue";
const count = ref(0);
const doubled = computed(() => count.value * 2);
现在可以直接使用。
const count = ref(0);
const doubled = computed(() => count.value * 2);
而且上边的 api 是按需自动引入的。
目前模板支持自动引入 api 的库列表 👉
vuevuexpiniavue-i18nvue-router@vueuse/core@vueuse/head@vueuse/math只要确保已经安装依赖即可,具体可见 👉 vite-auto-import-resolvers,
当然还有项目中的自动引入,只需要满足以下规范即可。
src/composables 的导出将被按需自动引入。例如有个 src/composables/foo.ts
// default 导出
export default 1000;
此时就不再需要 import了
<script setup lang="ts">
console.log(foo) // 输出 1000
</script>
<template>
{{store.counter}}
</template>
src/stores 的导出将被按需自动引入。例如有个 src/stores/counterStore.ts
// default 导出
export default defineStore("counter", {
state() {
return {
counter: 1,
};
},
actions: {
inc() {
this.counter++;
},
},
});
此时就不再需要 import了
<script setup lang="ts">
const store = counterStore()
</script>
<template>
{{store.counter}}
</template>
src/api 也是自动按需导入,与上述类似具体可见 👉 unplugin-auto-import。
原来需要 import
<script setup lang="ts">
import Hello from '../components/Hello.vue'
</script>
<template>
<Hello />
</template>
现在只要在 src/components 下定义的组件都将会按需引入,即 import 是不需要的。
<template>
<Hello />
</template>
当然也支持嵌套组件,例如 src/components/foo/bar.vue 👇
<template>
<FooBar />
</template>
同时流行组件库自动引入也是支持的,例如 Naive ui。
只需安装依赖。
pnpm add naive-ui
即可在模板中使用。
<template>
<n-button type="success">Success</n-button>
</template>
目前支持的组件库有:
具体可见 👉 unplugin-vue-components
可前往 👉 icones,随意选择点击进入其中一个图标库
![]()
再点击选择其中一个喜欢的图标
![]()
复制其名称
![]()
在模板中即可通过 class 的方式直接使用,注意加上前缀 i-。
<template>
</template>
保存后等待自动下载该图标库后,就可以在页面中看到对应图标。
同时推荐你使用 vscode 插件
Iconify IntelliSense。
该插件会在模板中显示图标的预览。
当然图标动态加载也是支持的 👇
<script>
const icon = ref("i-ep:arrow-left")
// 两秒后换成另一个图标
setTimeout(() => {
icon.value = 'i-icon-park-outline:arrow-circle-down'
}, 2000)
</script>
<template>
</template>
注意动态图标,请确保在开发环境下所有的图标都测过一遍。
具体可见 👉 unocss/presets/icons
VueUse 是一个超级强的 hooks 库,例如你要获取鼠标位置,只需要这样 👇
<script setup lang="ts">
// useMouse 被自动按需引入了,不需要import
const { x, y } = useMouse()
</script>
<template>
x坐标 {{x}}
y坐标 {{y}}
</template>
具体可见 👉 VueUse
不需要重新配置,直接用 ts 书写就行了。
unocss 是一个开发中速度更快的 原子css 库。
直接在模板中用就行了,不需要配置。
<template>
我是红色背景的白色文本
</template>
上述模板将渲染红色背景白色的字。
同时支持 属性化模式,即可以用简写。
<template>
我是红色背景的白色文本
</template>
这在调整边距尺寸以及等方面可以减少代码量。
具体可见 👉 unocss
暗黑模式由 vue-dark-switch 实现。
<script setup>
import { SwitchIcon } from "vue-dark-swicth"
</script>
<template>
<SwitchIcon />
</template>
具体可见 👉 vue-dark-switch
SWR 是更现代的请求方式,具体可见文章 👉 SWR。
而 vue-request 是一个 SWR 的 Vue 版本请求库。
你可以这样用,例如请求 /api/test
<script setup lang="ts">
import { useRequest } from 'vue-request'
const { data, loading, error } = useRequest('/api/test')
</script>
<template>
data: {{data}}
error: {{error}}
loading: {{loading}}
</template>
所有基本的数据,状态和缓存都帮你搞定了,不需要重新封装。
具体可见 👉 vue-request
pinia 是下一代的状态管理库,比 vuex 更简单,ts 支持更好。
你可以在 src/stores 中进行状态的定义。
例如创建 src/stores/counter.ts 👇
// src/stores/counter.ts
import { defineStore } from "pinia";
export const useCounterStore = defineStore("counter", {
state() {
return { count: 0 };
},
actions: {
inc() {
this.count++;
},
},
});
定义完后在 setup 中直接使用即可
<script setup lang="ts">
const Counter = useCounterStore()
<script>
<template>
{{Counter.count}}
</template>
更多具体使用可见 👉 pinia
pnpm 是非常优秀的包管理器,更快、更节省空间、更合理。
具体可见 👉 pnpm
跳转进度条由 nprogress 实现,可在src/styles/main.css 中调整配色。
/** src/styles/main.css **/
/** 省略其他样式 **/
#nprogress .bar {
@apply bg-blue-700 bg-opacity-75; /** 配色 **/
position: fixed;
z-index: 1031;
top: 0;
left: 0;
width: 100%;
height: 2px;
}
关于 @apply 由
@unocss/transformer-directives
实现。
具体可见 👉 nprogress
该面板可以让你在开发过程中,了解项目的方方面面,目前仅在开发环境下有效
具体可见 👉 vite-plugin-vue-devtools
只需要在 src/plugins 中的模块里导出默认函数即可。
例如 pinia,只需要这样做。
// src/plugins/pinia.ts
// 导出 default 接口
export default createPinia(); // pinia 将被自动安装
或者 vue-router
// src/plugins/router.ts
// 省略各种配置
// 导出 default 接口
export default router; // 路由将被自动安装
当然 pinia 和 vue-router 已经预设好了,你不需要重新关注他们。
具体可见 👉 vite-plugin-use-modules
在 src/test 目录中可以书写单元测试。
import { assert, describe, expect, it } from "vitest";
describe("suite name", () => {
it("foo", () => {
expect(1 + 1).toEqual(2);
expect(true).to.be.true;
});
it("bar", () => {
assert.equal(Math.sqrt(4), 2);
});
it("snapshot", () => {
expect({ foo: "bar" }).toMatchSnapshot();
});
});
然后在终端中输入命令即可测试
pnpm test
或者生成报告
pnpm coverage
具体可见 👉 [Vitest](https://vitest
$ claude mcp add tov-template \
-- python -m otcore.mcp_server <graph>