├── publish/
└── src/
------├── assets/ // 静态资源目录
------├── layout/ // 外层框架目录
------├── common/ // 通用类库目录
------├── components/ // 公共组件目录
------├── router/ // 路由配置目录
------├── store/ // 状态管理目录
------├── style/ // 通用 CSS 目录
------├── utils/ // 工具函数目录
------├── api/ // 用于存储所有的api
------├── views/ // 页面组件目录
------├── App.vue
------├── main.ts
------├── shims-vue.d.ts
├── tests/ // 单元测试目录
├── index.html
├── tsconfig.json // TypeScript 配置文件
├── vite.config.ts // Vite 配置文件
└── package.json
npm init @vitejs/app
或者
yarn create @vitejs/app
npm init @vitejs/app project-name
或者
yarn create @vitejs/app project-name
注意下面图片中的:project-name(项目的名字),select-a-framework(所需要使用的技术栈),select-a-variant(所需要使用的语言类型)
path模块是node中的一个核心模块,需要安装让 TypeScript 支持 node.js 的依赖包—— @types/node,如果编辑器提示 path 模块找不到,则可以安装一下 @types/node --> npm install @types/node -D
npm install @types/node -D
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/', '/')
// }
// }
}
})
{
"compilerOptions": {
"target": "esnext",
"useDefineForClassFields": true,
"module": "esnext",
"moduleResolution": "node",
"strict": true,
"jsx": "preserve",
"sourceMap": true,
"resolveJsonModule": true,
"isolatedModules": true,
"esModuleInterop": true,
"lib": ["esnext", "dom"],
"skipLibCheck": true,
"paths": {
"@/*":[
"./src/*"
]
}
},
"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
"references": [{ "path": "./tsconfig.node.json" }]
}
npm install vue-router@4
或者
yarn add vue-router@4
import { createRouter, createWebHistory, RouteRecordRaw } from "vue-router";
import Home from '@/views/home.vue';
const routes: Array = [
{
path: '/',
name: 'Home',
component: Home
},
{
path: "/home",
name: "home",
component: () => import("../views/home.vue"), // 懒加载组件
},
];
const router = createRouter({
history: createWebHistory(),
routes
})
export default router;
import { createApp } from 'vue';
import App from './App.vue';
import router from "./router";
const app = createApp(App);
app.use(router);
app.mount('#app');
页面A
页面B
关于pinia的具体使用,可观看我的另一篇文章Pinia的基础使用
npm install pinia@next
或者
yarn install pinia@next
//src/store/index.ts
import { defineStore } from "pinia" // 定义容器
// id:必须的,保证在Store中唯一, 两种写法
// export const piniaStore1 = defineStore('userId', {});
// export const piniaStore2 = defineStore({id: 'userId',});
export const piniaStore = defineStore('userId', {
// 1.必须是箭头函数: 为了在服务器端渲染的时候避免交叉请求导致数据状态污染
// 2.TS 类型推导, 结合了TS
state: () => {
return {
count: 0,
count2: 2
}
},
// 用来封装计算属性 有缓存功能 类似于computed
getters: {
getNum(state) {
return state.count;
},
getNum2(state) {
return state.count2;
}
},
// 编辑业务逻辑 类似于methods
actions: {
updateCount() {
this.count ++;
},
updateCount2(data: number) {
this.count2 = data;
}
}
})
import { createApp } from 'vue';
import App from './App.vue';
import Antd from 'ant-design-vue';
import 'ant-design-vue/dist/antd.css';
import router from "./router";
import { createPinia } from 'pinia'
const app = createApp(App);
const pinia = createPinia();
app.use(Antd);
app.use(router);
app.use(pinia);
app.mount('#app');
npm install axios
或
yarn add axios
import axios from "axios";
const token = window.localStorage.getItem('id_token');
// 创建 axios 实例
const service = axios.create({
baseURL: window.location.origin, // process.env.VUE_APP_BASEURL
timeout: 30 * 1000, // 设置请求超时时间
headers: {
// IE中存在GET请求缓存问题,禁用请求缓存
"Cache-Control": "no-cache",
"Authorization": 'Bearer ' + token,
},
});
// 请求错误
const err = (error) => {
const ret = {};
if (error.response) {
if (error.response.status === 401) {
window.location.href = window.location.origin;
} else if (
error.response.status === 403 ||
error.response.status === 404 ||
error.response.status === 405 ||
error.response.status === 500
) {
ret.error = error.response;
return Promise.reject(ret);
}
ret.error = error.response;
}
return Promise.reject(ret);
};
// 请求拦截器
service.interceptors.request.use((config) => {
return config;
}, err);
// 响应拦截器
service.interceptors.response.use((response) => {
const { config } = response
if (response.data) {
// response.data.msg = i18n.t(`exception.${response.data.code}`)
}
const { raw } = config
return raw ? response : response.data;
}, err);
export { service as axios };
import { axios } from "@/utils/request.js";
export const fdsApi = {
// 获取上传链接
getUploadUrl(fileName) {
return axios({
url: "/api/test/getFileUploadUri",
method: "get",
params: {
fileName,
},
});
},
getDownloadUrl(objectName) {
return axios({
url: '/miracletest/api/test/getDownloadPresignedUri',
method: 'get',
params: {
objectName
}
})
}
};
npm i less -D
或
npm i sass -D
或
npm i stylus -D
npm install ant-design-vue@next --save
或
yarn add ant-design-vue@next
import { createApp } from 'vue';
import App from './App.vue';
import Antd from 'ant-design-vue';
import 'ant-design-vue/dist/antd.css';
import router from "./router";
import store from './store';
const app = createApp(App);
app.use(Antd);
app.use(router);
app.use(store);
app.mount('#app');