
create-vtems是一个基于Vue.js的项目快速搭建工具,它提供了:
# 使用npm
npm init vtems@latest my-vue-project -- --template default
# 使用yarn
yarn create vtems my-vue-project --template default
# 使用pnpm
pnpm create vtems my-vue-project --template defaultmy-vue-project/
├── node_modules/
├── public/
├── src/
│ ├── assets/
│ ├── components/
│ ├── composables/
│ ├── router/
│ ├── stores/
│ ├── views/
│ ├── App.vue
│ ├── main.js
│ └── env.d.ts
├── .env.development
├── .env.production
├── .eslintrc.cjs
├── .gitignore
├── .prettierrc.cjs
├── index.html
├── package.json
├── pnpm-lock.yaml
├── README.md
└── vite.config.js# 启动开发服务器
npm run dev
# 构建生产版本
npm run build
# 预览生产版本
npm run preview
# 代码检查
npm run lint
# 代码格式化
npm run format// vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import path from 'path';
export default defineConfig({
plugins: [vue()],
resolve: {
alias: {
'@': path.resolve(__dirname, './src'),
},
},
server: {
port: 3000,
proxy: {
'/api': {
target: 'http://localhost:5000',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, ''),
},
},
},
});// .eslintrc.cjs
module.exports = {
root: true,
env: {
node: true,
},
extends: [
'plugin:vue/vue3-essential',
'eslint:recommended',
'@vue/eslint-config-prettier',
],
parserOptions: {
ecmaVersion: 'latest',
},
rules: {
'vue/multi-word-component-names': 'off',
'prettier/prettier': [
'error',
{
endOfLine: 'auto',
},
],
},
};<!-- src/components/BaseButton.vue -->
<template>
<button
:class="[
'px-4 py-2 rounded transition-all duration-200',
variantClass,
sizeClass,
{ 'opacity-75 cursor-not-allowed': disabled },
]"
:disabled="disabled"
@click="handleClick"
>
<slot />
</button>
</template>
<script setup>
import { computed, defineProps, defineEmits } from 'vue';
const props = defineProps({
variant: {
type: String,
default: 'primary',
validator: (value) => ['primary', 'secondary', 'success', 'danger'].includes(value),
},
size: {
type: String,
default: 'medium',
validator: (value) => ['small', 'medium', 'large'].includes(value),
},
disabled: {
type: Boolean,
default: false,
},
});
const emits = defineEmits(['click']);
const variantClass = computed(() => {
const classes = {
primary: 'bg-primary text-white hover:bg-primary/90',
secondary: 'bg-secondary text-white hover:bg-secondary/90',
success: 'bg-success text-white hover:bg-success/90',
danger: 'bg-danger text-white hover:bg-danger/90',
};
return classes[props.variant];
});
const sizeClass = computed(() => {
const classes = {
small: 'text-sm',
medium: 'text-base',
large: 'text-lg',
};
return classes[props.size];
});
const handleClick = (event) => {
if (!props.disabled) {
emits('click', event);
}
};
</script>// src/composables/useFetch.js
import { ref, onMounted, onUnmounted } from 'vue';
export function useFetch(url) {
const data = ref(null);
const error = ref(null);
const loading = ref(true);
let controller;
const fetchData = async () => {
loading.value = true;
error.value = null;
try {
controller = new AbortController();
const response = await fetch(url, { signal: controller.signal });
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
data.value = await response.json();
} catch (err) {
if (err.name !== 'AbortError') {
error.value = err;
}
} finally {
loading.value = false;
}
};
onMounted(fetchData);
onUnmounted(() => {
if (controller) {
controller.abort();
}
});
return { data, error, loading };
}// src/stores/counter.js
import { defineStore } from 'pinia';
export const useCounterStore = defineStore('counter', {
state: () => ({
count: 0,
name: 'Counter Store',
}),
getters: {
doubleCount: (state) => state.count * 2,
},
actions: {
increment() {
this.count++;
},
reset() {
this.count = 0;
},
},
});// src/router/index.js
import { createRouter, createWebHistory } from 'vue-router';
import HomeView from '../views/HomeView.vue';
import AboutView from '../views/AboutView.vue';
const routes = [
{
path: '/',
name: 'Home',
component: HomeView,
},
{
path: '/about',
name: 'About',
component: AboutView,
},
];
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes,
});
export default router;npm run build// vite.config.js
export default defineConfig({
build: {
target: 'esnext',
outDir: 'dist',
assetsDir: 'assets',
sourcemap: false,
minify: 'terser',
terserOptions: {
compress: {
drop_console: true,
drop_debugger: true,
},
},
rollupOptions: {
output: {
manualChunks: {
vendor: ['vue', 'vue-router', 'pinia'],
},
},
},
},
});# 安装gh-pages
npm install gh-pages --save-dev
# package.json中添加部署脚本
{
"scripts": {
"deploy": "gh-pages -d dist"
}
}
# 部署
npm run build
npm run deploy通过create-vtems,你可以快速搭建一个现代化的Vue 3项目,它提供了:
无论是小型项目还是大型应用,create-vtems都能帮助你快速起步并保持项目的可维护性和扩展性。
Vue, 快速构建项目,create vtems, 前端开发,JavaScript,Vue CLI, 项目搭建,Vue 组件,前端框架,Web 开发,Vue 生态,前端工程化,单页应用,SPA, 前端技术栈
资源地址:
https://pan.quark.cn/s/3a1d0a6e69c7
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。