# Vue3初始化 **Repository Path**: lyn-sakura/vue3-init ## Basic Information - **Project Name**: Vue3初始化 - **Description**: Re0:Vue3项目初始化 使用:Vite2,Vue3,ts,less,axios,arco, nprogress 项目搭建参考 - **Primary Language**: JavaScript - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2022-01-21 - **Last Updated**: 2024-10-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: vite2, vue3, TypeScript, Vuex, Pinia ## README ### Re0:Vue3项目初始化 [参考](https://www.jianshu.com/p/155b63046268)

目录

一、初始化项目

二、引入router

三、引入pinia

四、引入arco ui

五、引入Aixos

六、引入nprogress

七、引入其他

#### 一、初始化项目 2022.01.21 目录 下一步 1. npm init vite 2. 输入项目名称 3. 询问是否安装 `create-vite`,没有略过 4. 选择项目框架 `vue-ts`,如果这一步没有 `vue-ts`则选择 `vue`,在下一步选择 `vue-ts` 5. 进入项目 npm i 6. `index.html` 中更改项目名字 7. 删除多余文件`components`,`style.css`,`assets`下的图片,`App.vue`中的代码 8. `.gitignore` 中增加 .vscode 9. 新建三个环境文件,属性名必须以`VITE_`开头 * `.env` 全局默认配置文件 * `.env.development` 开发环境 * `.env.production` 生产环境 10. 设置路径别名 * `tsconfig.json` ```js { "compilerOptions": { ... "baseUrl": ".", "paths": { "@/*": ["src/*"] } } } ``` * npm i @types/node -D * `vite.config.ts` ```js // 注意:只在`tsconfig.json`设置会出现绝路路径vsCode报错,使用别名浏览器报错 import { resolve } from "path"; // 此包 @types/node 中的 path 模块 ... export default defineConfig({ ... resolve: { alias: [ { find: /@\//, replacement: resolve("src") + "/", }, ], }, }); ``` > 注 * `src`目录下的`vite-env.d.ts` 使ts识别项目中的 `.vue`结尾的文件 ```js ... declare module "*.vue" { import type { DefineComponent } from "vue"; const component: DefineComponent<{}, {}, any>; export default component; } ``` * `vite.config.ts`相当于`vue-cli`的`vue.config.js`文件 * 当前版本的 setup 语法糖 [参考](https://www.cnblogs.com/onesea/p/15602810.html) #### 二、引入router 上一步 目录 下一步 1. npm install vue-router@4 --save 2. 修改 `App.vue` ```js ``` 3. 新建 `pages/home.vue` 文件 ```html ``` 4. 新建 `/router/index.ts` 文件 ```js import { createRouter, createWebHistory, Router, RouteRecordRaw } from "vue-router"; /** 动态引入 module 文件下的 子路由 */ // const doc = import.meta.globEager("./module/*.ts"); // const childrenRouter: RouteRecordRaw[] = []; // Object.values(doc).forEach((item: any) => { // item.default.forEach((val: RouteRecordRaw) => { // childrenRouter.push(val); // }); // }); const router: Router = createRouter({ //history模式使用HTML5模式 history: createWebHistory(), routes: [ { path: "/", redirect: "/home", }, { path: "/home", name: "home", component: () => import("@/pages/home.vue"), }, ] }); export default router; ``` 3. 修改`main.ts` ```js import { createApp } from "vue"; import App from "./App.vue"; import router from "@/router/index"; const app = createApp(App); app.use(router).mount("#app"); ``` #### 三、引入pinia 上一步 目录 下一步 1. npm i pinia 2. `main.js` ```js import { createPinia } from "pinia"; ... app.use(createPinia()); ``` 3. 创建`store/index.ts`, 自动注册 ```js import { defineStore } from 'pinia' export const useIndexStore = defineStore('index', { state: () => { return { count: 0 } }, }) ``` 4. 页面中使用 ```html ``` #### 四、引入arco 上一步 目录 下一步 1. npm i less-loader less --save-dev (安装less,也可以选择安装sass) 2. npm install --save-dev @arco-design/web-vue 3. 可以使用 unplugin-vue-components 和 unplugin-auto-import 这两款插件来开启按需加载及自动导入的支持 * 注意:这种方法并不会处理用户在 script 中手动导入的组件,比如 Message 组件,用户仍需要手动导入组件对应的样式文件,例如 @arco-design/web-vue/es/message/style/css.js * npm install -D unplugin-vue-components unplugin-auto-import * 修改`vite.config.ts ```js ... import AutoImport from 'unplugin-auto-import/vite' import Components from 'unplugin-vue-components/vite' import { ArcoResolver } from 'unplugin-vue-components/resolvers' export default { plugins: [ AutoImport({ imports: [ // 自动导入 Vue vue-router 相关函数,如:ref, reactive, toRef 等 "vue", "vue-router", ], resolvers: [ArcoResolver()], // 设置存储自动引入Vue vue-router 等 相关函数的文件 的路径 dts: "./src/auto-imports.d.ts", }), Components({ resolvers: [ ArcoResolver({ sideEffect: true, }), ], // 设置存储自动引入组件的文件 的路径 dts: "./src/components.d.ts", }) ], } ``` 4. 页面使用 ```html ``` #### 五、引入Aixos 上一步 目录 下一步 1. npm i axios 2. `.env` 或`.env.development`(开发环境)、`.env.production`(生产环境) 中写入 ```js VITE_AXIOS_URL = '后台接口地址' ``` 3. 新建`api/index.ts` ```js // 后台返回接口数据接口 根据后台自行修改 export interface ApiResult { /* 状态码 */ code: number; /* 后台返回数据 */ data: T; /* 后台返回提示信息 */ msg: string; } ``` 3. 新建`src/request.d.ts` ```js import { ApiResult } from "@/api"; declare module "axios" { export interface AxiosInstance { (config: AxiosRequestConfig): Promise>; request(config: AxiosRequestConfig): Promise>; get(url: string, config?: AxiosRequestConfig): Promise>; delete(url: string, config?: AxiosRequestConfig): Promise>; head(url: string, config?: AxiosRequestConfig): Promise>; post(url: string, data?: any, config?: AxiosRequestConfig): Promise>; put(url: string, data?: any, config?: AxiosRequestConfig): Promise>; patch(url: string, data?: any, config?: AxiosRequestConfig): Promise>; } } ``` 4. 新建`enum/index.ts` ```ts /** 接口返回状态码 */ export enum ApiCodeEnum { /** 成功 */ SUCCESS = 200, /** 登录过期 */ OVERDUE = 401, } ``` 5. 新建`api/request.ts` ```js import axios from "axios"; import router from "@/router"; import { Message } from "@arco-design/web-vue"; import "@arco-design/web-vue/es/message/style/css.js"; import { ApiCodeEnum } from "@/enum"; console.log("当前地址", import.meta.env.VITE_AXIOS_URL); // 创建axios实例 const service = axios.create({ // 服务接口请求,VITE_AXIOS_URL 在环境文件(.env)中配置 baseURL: import.meta.env.VITE_AXIOS_URL, // 超时设置 timeout: 10 * 1000, headers: { "Content-Type": "application/json;charset=utf-8" }, }); // 请求拦截 service.interceptors.request.use( (config) => { // 是否需要设置 token if (config.headers) { // todo 此处 根据后台要求添加header上的字段 } // get请求映射params参数 if (config.method === "get" && config.params) { let url = config.url + "?"; for (const propName of Object.keys(config.params)) { const value = config.params[propName]; var part = encodeURIComponent(propName) + "="; if (value !== null && typeof value !== "undefined") { if (typeof value === "object") { for (const key of Object.keys(value)) { let params = propName + "[" + key + "]"; var subPart = encodeURIComponent(params) + "="; url += subPart + encodeURIComponent(value[key]) + "&"; } } else { url += part + encodeURIComponent(value) + "&"; } } } url = url.slice(0, -1); config.params = {}; config.url = url; } return config; }, (error) => { console.log(error); Promise.reject(error); } ); // 响应拦截器 service.interceptors.response.use( (res: any) => { // 未设置状态码则默认成功状态 const code = res.data["code"] || ApiCodeEnum.SUCCESS; // 获取错误信息 const msg = res.data["msg"]; if (code === ApiCodeEnum.SUCCESS) { return Promise.resolve(res.data); } else if (code == ApiCodeEnum.OVERDUE) { /** 登录失效 跳转到登录页 */ return router.push("/login"); } else { // 设置全局提示 Message.error(msg); return Promise.reject(res.data); } }, (error) => { console.log("err" + error); let { message } = error; if (message == "Network Error") { message = "后端接口连接异常"; } else if (message.includes("timeout")) { message = "系统接口请求超时"; } else if (message.includes("Request failed with status code")) { message = "系统接口" + message.substr(message.length - 3) + "异常"; } // 设置全局提示 Message.error({ content: message, duration: 5 * 1000 }); return Promise.reject(error); } ); export default service; ``` 6. 使用 ```js import request from "@/api/request"; request.get() ``` > `vite.config.ts` 配置局域网访问 ```js server: { // 端口被占用直接退出 strictPort: true, // 在开发服务器启动时自动在浏览器中打开应用程序 open: true, hmr: { // 屏蔽服务器报错 overlay: false, }, // 局域网访问 host: "192.168.80.136", port: 10000 } ``` > `vite.config.ts` 配置跨域 ```js import { loadEnv } from "vite"; export default({command,mode}) =>{ return defineConfig({ server: { ... proxy: { // 字符串简写写法 // '/foo': '', // 选项写法 "/dev-api": { target: mode === "development" ? loadEnv(mode, process.cwd()).VITE_AXIOS_URL : loadEnv(mode, process.cwd()).VITE_PROD_URL, changeOrigin: true, rewrite: (path) => path.replace(/^\/dev-api/, ""), }, }, }, }); } ``` #### 六、引入nprogress(进度条) 上一步 目录 下一步 1. npm install --save nprogress 2. npm install @types/nprogress -D 3. 路由跳转显示加载条 * 新建 `router/guard/nprogress.ts` ```js import type { Router } from "vue-router"; import 'nprogress/nprogress.css' import NProgress from 'nprogress'; export function createNProgress(router: Router) { router.beforeEach(async (to) => { NProgress.start(); return true; }) router.afterEach(async (to) => { NProgress.done(); return true; }) } ``` * 修改`router/index.ts` ```js import { createNProgress } from "./guard/nprogress"; ... createNProgress(router); ``` #### 七、引入其他插件 上一步 目录 下一步 1. `npm install normalize.css` ```less // 引入第三方初始化样式 @import 'normalize.css'; ``` 2. `npm install xe-utils vxe-table` [vxe-table 官网](https://vxetable.cn/#/modal/api) 3. `npm i --save lodash` [lodash 官网](https://www.lodashjs.com/) 4. `npm install dayjs` [dayjs 官网](https://dayjs.fenxianglu.cn/) 5. `npm i pinia-plugin-persistedstate`[持久化存储 参考](https://prazdevs.github.io/pinia-plugin-persistedstate/zh/guide/)