vite-vue3-vueRouter4-pina搭建项目
前言
一个项目的代码编写,需要经过需求-技术选型-项目搭建-业务功能实现,这次的重点在于项目的搭建,在经历了一年的前端工作,对于项目的搭建并不是很熟悉,是部门的前端前辈去搭建的,在公司参与了好几个项目的研发,每个项目,或者说是每个人的项目架构都不太一样,一个好的项目架构真的能帮助到后期的业务实现。
对前端项目的搭建的个人理解
- 我觉得前端项目的搭建就像为一栋房子打地基,项目基于这个‘地基’拔地而起,只有地基的质量好,这栋房子才能盖的又高又坚固。回归正题,前端项目的构建的组成部分在于,技术框架(vue) +包管理器(npm、yarn)+ 构建工具(vite/webpack)+ 基于技术框架的生态链(vueRouter、pinia、axios等)、基于技术框架的组件库(vant、elementui、ivew等)、以及帮助开发实现效果或是辅助开发的一些依赖(dayjs、prettier、nprogress)
- 这些组成部分很多都需要对其进行配置,一个依赖的配置方式可能有多种,例如对elementplus的引入进行配置,可以对其进行全部引入、按需引入、或是官方推荐的自动引入,每种方式在性能以及协助开发的程度上都有不同,建议使用官方推荐的引入方式,这些都可以参考官方文档的进行配置。
实战
一、通过vite创建项目
ps:用了vite 后真的回不去webpack 了 当然一些基本nodejs、yarn的安装就不细说了,可自行百度。 技术选型是Vue3+TypeScript
通过yarn install 引入依赖包 通过yarn dev 运行项目
Network: use --host to expose 的原因在于没有配置server
server: {
host: '0.0.0.0'
}
二、 配置server
import vue from '@vitejs/plugin-vue';
import path from 'path';
import AutoImport from 'unplugin-auto-import/vite';
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';
import Components from 'unplugin-vue-components/vite';
import { defineConfig } from 'vite';
const resolve = (dir: string) => path.join(__dirname, dir)
export default defineConfig({
plugins: [
vue(),
AutoImport({
resolvers: [ElementPlusResolver()],
}),
Components({
resolvers: [ElementPlusResolver()],
}),],
server: {
host: '0.0.0.0',
https: false,
cors: true,
open: true,
port: 8088,
strictPort: false,
force: true,
hmr: true
},
resolve: {
alias: {
'@': resolve('src'),
}
},
})
在通过@ 引用模块时,会爆红:找不到模块“@/api”或其相应的类型声明 还需对tsconfig.json 进行+配置
"compilerOptions": {
"baseUrl": "./",
"paths": {
"@/*": ["src/*"]
},
}
三、引入elementPlus组件库
关于elementPlus的自动导入可查看elementplus的官方文档elementPlus
四、引入Router路由管理器
# 使用 npm
npm install vue-router@4
# 使用 yarn
yarn add vue-router@4
创建router 文件夹以及文件夹下的index.ts 文件
import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'
const routes: RouteRecordRaw[] = [
{
path: '/',
component: () => import('@/layout/index.vue'),
children: [
{
name: '首页',
path: 'home',
component: () => import('@/views/home/index.vue'),
}
],
},
{
path: '/login',
component: () => import('@/views/login.vue'),
}
]
const router = createRouter({
history: createWebHashHistory(),
routes,
})
export default router
在mian 入口文件引入
import Router from './router'
app.use(Router).mount('#app')
在App.vue 主文件通过路由占位符来展示路由的视图
<template>
<el-config-provider :locale="locale">
<router-view />
</el-config-provider>
</template>
<script lang="ts">
import { ElConfigProvider } from 'element-plus';
import zhCn from 'element-plus/lib/locale/lang/zh-cn';
export default {
components: {
[ElConfigProvider.name]: ElConfigProvider,
},
setup() {
const locale = zhCn
return {
locale,
}
},
}
</script>
<style scoped>
</style>
如图可知 其起始路由为@/layout/index.vue ,@ 的配置在vite.config 文件中可知,其指向src 路径 新建一个layout 文件夹,用于存放视图布局文件。 通过yarn dev 运行项目
搭建路由守卫,防止用户手输进无权限页面
import router from './router';
router.beforeEach((to, from, next) => {
try {
const pages = JSON.parse(sessionStorage.getItem('BTNS') || '[]')
if (to.path !== '/login' && !sessionStorage.getItem('USER')) {
return next('/login')
} else if (
!to.meta.root && !['/', '/login', '/home', '/404'].includes(to.path) &&
!pages[to.path]
) {
alert('没有权限')
return next(from.path)
}
console.log(to)
next()
} catch (err: any) {
console.log(to)
next()
}
})
router.afterEach(() => {
})
在mian.ts引入
import './permission';
五、安装sass依赖
安装sass 依赖,用于编写样式
npm install node-sass sass-loader sass -D
六、引入Pinia状态管理
# 使用 npm
npm install pinia@next
# 使用 yarn
yarn add pinia@next
import { createPinia } from 'pinia';
const pinia = createPinia()
app.use(Router).use(pinia).mount('#app')
新建一个stores文件夹以及文件夹下的index.ts用于存放state以及action
import { defineStore } from 'pinia'
export const useStore = defineStore('main', {
state: () => {
return {
page: {
pageNum: 1,
pageSize: 20
},
test: 1
}
},
actions: {
changeTest(param: number) {
this.test = param
}
}
})
<template>
state:{{test}}
<el-button type="primary" @click="change">改变state</el-button>
</template>
<script lang="ts" setup>
import stores from '@/stores';
import { storeToRefs } from 'pinia';
const store = stores()
const { test } = storeToRefs(store)
function change() {
stores().changeTest(10)
}
</script>
<style lang="scss" scoped>
.common-layout {
height: 100%;
width: 100%;
.layout-header {
height: 100%;
}
}
</style>
测试结果:
其pinia数据持久化配置:
# 使用 npm
npm i pinia-plugin-persistedstate
# 使用 yarn
yarn add pinia-plugin-persistedstate
import { createApp } from "vue";
import App from "./App.vue";
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
const pinia = createPinia();
pinia.use(piniaPluginPersistedstate);
createApp(App).use(pinia);
import { defineStore } from 'pinia'
export default defineStore('main', {
state: () => {
return {
page: {
pageNum: 1,
pageSize: 20
},
test: 1
}
},
actions: {
changeTest(param: number) {
this.test = param
}
},
persist: {
key: 'storekey',
storage: window.sessionStorage,
paths: ['page.pageNum'],
},
})
七、引入Axios
# 使用 npm
npm install axios
VITE_BASE_URL = 'http://1010101010'
src 下新建一apis 文件夹用于存放请求相关的信息
login页面
<template>
<div>
<el-button @click="login">登录</el-button>
</div>
</template>
<script lang="ts" setup>
import api from '@/apis';
function login() {
console.log(api.user.login({}).then((res: any) => {
console.log(res);
}));
}
</script>
通过手输url 跳转至login 页面测试请求是否发起
login请求成功发起
此接口为虚假接口 故爆红
结尾
项目git仓库地址:https://gitee.com/li-yubin/vite-project.git 基本的项目搭建就完成了,此文章仅为记录自己的实操,如有不合理的地方,望指正!
|