一、使用 Vite 快速初始化项目雏形
npm init @vitejs/app
- 输入项目名称
- 选择模板 vue-ts
- npm install
- npm run dev
修改 Vite 配置文件 vite.config.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' // 如果编辑器提示 path 模块找不到,则可以安装一下 @types/node -> npm i @types/node -D import { resolve } from 'path'
// https://vitejs.dev/config/ export default defineConfig({ plugins: [vue()], resolve: { alias: { '@': resolve(__dirname, 'src') // 设置 `@` 指向 `src` 目录 } }, base: './', // 设置打包路径 server: { port: 4000, // 设置服务启动端口号 open: true, // 设置服务启动时是否自动打开浏览器 cors: true // 允许跨域
// 设置代理,根据我们项目实际情况配置 // proxy: { // '/api': { // target: 'http://xxx.xxx.xxx.xxx:8000', // changeOrigin: true, // secure: false, // rewrite: (path) => path.replace('/api/', '/') // } // } } })
|
规范目录结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| ├── publish/ └── src/ ├── assets/ // 静态资源目录 ├── common/ // 通用类库目录 ├── components/ // 公共组件目录 ├── router/ // 路由配置目录 ├── store/ // 状态管理目录 ├── style/ // 通用 CSS 目录 ├── utils/ // 工具函数目录 ├── views/ // 页面组件目录 ├── App.vue ├── main.ts ├── shims-vue.d.ts ├── tests/ // 单元测试目录 ├── index.html ├── tsconfig.json // TypeScript 配置文件 ├── vite.config.ts // Vite 配置文件 └── package.json
|
二、集成路由工具 Vue Router
npm i vue-router@4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| └── src/ ├── router/ ├── index.ts // 路由配置文件 <!-- src/router/index.ts --> import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router' import Home from '@/views/home.vue' import Vuex from '@/views/vuex.vue'
const routes: Array<RouteRecordRaw> = [ { path: '/', name: 'Home', component: Home }, { path: '/vuex', name: 'Vuex', component: Vuex }, { path: '/axios', name: 'Axios', component: () => import('@/views/axios.vue') // 懒加载组件 } ]
const router = createRouter({ history: createWebHashHistory(), routes })
export default router
<!-- main.ts --> import { createApp } from 'vue' import App from './App.vue'
import router from './router/index'
createApp(App).use(router).mount('#app')
|
三、集成状态管理工具 Vuex
npm i vuex@next
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| └── src/ ├── store/ ├── index.ts // store 配置文件 <!-- src/store/index.ts --> import { createStore } from 'vuex'
const defaultState = { count: 0 }
// Create a new store instance. export default createStore({ state() { return defaultState }, mutations: { increment(state: typeof defaultState) { state.count++ } }, actions: { increment(context) { context.commit('increment') } }, getters: { double(state: typeof defaultState) { return 2 * state.count } } }) <!-- main.ts --> import { createApp } from 'vue' import App from './App.vue'
import store from './store/index'
createApp(App).use(store).mount('#app')
|
四、集成 HTTP 工具 Axios
npm i axios
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| └── src/ ├── utils/ ├── axios.ts // Axios 配置文件 <!-- src/utils/axios.ts --> import Axios from 'axios' import { ElMessage } from 'element-plus'
const baseURL = 'https://xx.xx.com'
const axios = Axios.create({ baseURL, timeout: 20000 // 请求超时 20s })
// 前置拦截器(发起请求之前的拦截) axios.interceptors.request.use( (response) => { /** * 根据你的项目实际情况来对 config 做处理 * 这里对 config 不做任何处理,直接返回 */ return response }, (error) => { return Promise.reject(error) } )
// 后置拦截器(获取到响应时的拦截) axios.interceptors.response.use( (response) => { /** * 根据你的项目实际情况来对 response 和 error 做处理 * 这里对 response 和 error 不做任何处理,直接返回 */ return response }, (error) => { if (error.response && error.response.data) { const code = error.response.status const msg = error.response.data.message ElMessage.error(`Code: ${code}, Message: ${msg}`) console.error(`[Axios Error]`, error.response) } else { ElMessage.error(`${error}`) } return Promise.reject(error) } )
export default axios
|
使用 axios
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <template></template> <script lang="ts"> import { defineComponent } from 'vue' import axios from '../utils/axios'
export default defineComponent({ setup() { axios .get('/users/XPoet') .then((res) => { console.log('res: ', res) }) .catch((err) => { console.log('err: ', err) }) } }) </script>
|
至此,一个基于 TypeScript + Vite + Vue3 + Vue Router + Vuex + Axios + Stylus/Sass/Less 的前端项目开发环境搭建完毕。