vite+vue3.x+uni搭建项目

news/2024/11/6 15:27:16/文章来源:https://www.cnblogs.com/wxyblog/p/18525156

vite-uniapp-template

🚀 基于 vitejs 驱动的 uniapp 最佳实践集成模板 查看演示

特点

  • 💪 Assets: 提供了全局静态资源加载工具,无感切换加载本地静态资源/远程静态资源,解决小程序环境下包大小限制问题。
  • 📦 SubPackages: 符合心智模型的分包风格,合理的 pages 目录结构,与分包配置轻松实现功能分包。
  • 🛣 Router: 使用 uniapp-router-next,并通过优化封装,API 同 VueRouter 类似,扩展了拦截器、中间件、路由别名功能。
  • 📊 Store: 使用 Pinia 强力驱动,轻松实现应用状态管理。
  • ⚡️ Request: 请求库使用 uni-network 完全基于 uniapp API 编写的高性能请求库, API 同 axios。
  • 👇 Z-paging: 内置了高性能且易于使用的业务常用下拉分页组件模块,轻松实现下拉刷新、上拉加载等功能。
  • 💅 Unocss: 使用原子化 CSS 引擎,小程序环境下依然完美支持原子化的 class 命名书写规则。
  • 🎨 UI-libs: 预设了 uv-ui 和 uni-ui 两者相辅相成,轻松满足绝大多数业务场景,并支持主题色定制功能。
  • 📝 NoTs: 只使用 JavaScript,在常规业务场景或人员水平差距过大情况下,TypeScript 并不会提升开发体验。

使用方法

克隆项目

git clone https://github.com/viarotel/vite-uniapp-template.git

安装项目依赖

打开并进入克隆的项目根目录下执行以下命令
以下命令推荐 使用 pnpm 进行操作 不过你依然可以使用 npm/yarn

pnpm install

运行项目

任意编辑器直接运行本项目

# h5端
pnpm dev:h5
# 微信小程序端
pnpm dev:mp-weixin
# 安卓端
pnpm dev:app-android
#... 更多端请参阅 package.json/script

在 HBuilder 中运行本项目

  1. 将项目拖动到 HBuilder 中
  2. 使用 pnpm install 安装好依赖
  3. 点击项目 /src 目录中的任意文件
  4. 点击编辑器上方点击运行选择需要运行的环境

功能示例

静态资源处理

// 使用远程静态资源
// import { useAssets } from './utils/assets/remote'// 使用本地静态资源
import { useAssets } from './utils/assets/local'// 全局挂载
app.config.globalProperties.$assets = useAssets// template中使用
//  <img :src="$assets('/temp.png')" />

全局主题色定制

由 unocss-preset-shades 提供支持

<!-- 设置文本色为主题色色调为 500 -->
<div class="text-primary-500"></div>
<!-- 设置背景色为主题色色调为 500 -->
<div class="bg-primary-500"></div>
<!-- 设置边框色为主题色色调为 500 -->
<div class="border border-primary-500"></div>
<!-- 更多使用方式请参阅 https://tailwindcss.com/docs -->

请求后端数据

详细使用请参阅 uni-network

import request from '@/utils/request/index.js'// GET
request.get('/mock',{ id: 'mock-id' },{/* More option */}
)// POST
request.post('/mock',{ id: 'mock-id' },{/* More option */}
)// Upload
request.upload({url: '/mock',dataType: 'json',headers: {'content-type': 'multipart/form-data',},
})// Common
request({method: 'post',url: '/mock',data: {id: 'mock-id',},headers: {'content-type': 'application/json',},
})// 扩展方法// 继承于 request.post,请求头默认添加 'Content-Type': 'multipart/form-data'
request.form('/mock',{ id: 'mock-id' },{/* More option */}
)// 继承于 request.post,请求头默认添加 'Content-Type': 'application/x-www-form-urlencoded'
request.query('/mock',{ id: 'mock-id' },{/* More option */}
)

路由间功能跳转

// 跳转页面
const methods = {routerDemo() {this.$Router.push({path: '/login',query: {id: 'id',},})// 获取页面参数this.$Route.query.id// 关闭当前页面跳转到某个页面this.$Router.replace('/login')// 关闭所有打开的页面跳转到某个页面this.$Router.replaceAll('/login')},
}// 为路由设置别名
// pages.config.js 中
const aliasConfig = {path: 'pages/login/index',// 通过添加 aliasPath 字段aliasPath: '/login',
}

使用路由守卫

位于 router/guards 中

import store from '@/store/index.js'const homePath = '/pages/index/index'
const loginPath = '/pages/login/index'const whiteList = [loginPath]export default (router) => {const userStore = store.useUserStore()const loginRoute = to => ({path: loginPath,navType: 'reLaunch',force: true,query: {redirect: {path: to.path,query: to.query,},},})router.beforeEach((to, from, next) => {// console.log('permission.beforeEach.to', to)// console.log('permission.beforeEach.from', from)const token = userStore.tokenconst userId = userStore.userIdconsole.log('token', token)console.log('userId', userId)if (token) {if (to.path === loginPath) {next(homePath)}else if (userId) {next()}else {userStore.getUserInfo().then(() => {next()}).catch((error) => {console.warn(error)userStore.logout({ silenced: true })next(loginRoute(to))})}}else if (whiteList.includes(to.path)) {next()}else {next(loginRoute(to))}})router.afterEach(() => {})
}

使用基于路由的中间件

pages.config.js 中

// 使用名为 realname 的中间件
const pageConfig = {path: '/pages/user/index',aliasPath: '/user',meta: {middleware: ['realname'],},
}

定义中间件

router/guards/index.js 中

// 使用 defineMiddleware 定义并包装为中间件
import realname from './realname/index.js'
import { defineMiddleware } from '$uni-router/middleware'export default (app, router) => {// 使用 defineMiddleware 定义了路由中间件defineMiddleware(realname, { router, app })
}

编写路由中间件代码

router/guards/realname/index.js 中

import store from '@/store/index.js'
import { useDialog, useToast } from '@/utils/modals'export default (router) => {const userStore = store.useUserStore()router.beforeEach((to, from, next) => {console.log('realname.beforeEach.to', to)console.log('realname.beforeEach.from', from)const realStatus = userStore.userInfo.realStatusswitch (realStatus) {case 3:next()breakcase 2:useToast('实名审核中, 请稍后再试').then(() => {next(false)})breakcase 4:useDialog(`${userStore.userInfo.auditResult || '提交的实名信息不符'}`, {title: '实名失败',showCancelButton: true,confirmText: '重新认证',}).then(() => {next({ path: '/pages/realname/index' })}).catch(() => {next(false)})breakdefault:useDialog('请先进行实名认证', { showCancelButton: true }).then(() => {next({ path: '/pages/realname/index' })}).catch(() => {next(false)})break}})// router.afterEach(() => {})
}

主要使用的包

  • vitejs
  • uniapp
  • pinia
  • uview-plus
  • uni-ui
  • @uni-helper/uni-network
  • uniapp-router-next
  • z-paging
  • unocss
  • unocss-applet

常见问题

无法正常安装依赖/无法启动

删除 pnpm-lock.yaml / yarn.lock / package-lock.json 文件后重新安装依赖

sass提示

Deprecation Warning: Sass @import rules are deprecated and will be removed in Dart Sass 3.0.0.
More info and automated migrator: https://sass-lang.com/d/import

解决:将sass版本换为稳定版 "sass": "1.77.6"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/826615.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Narak靶机渗透 (Vulnhub内网渗透)

一、渗透目标: Description Back to the Top Narak is the Hindu equivalent of Hell. You are in the pit with the Lord of Hell himself. Can you use your hacking skills to get out of the Narak? Burning walls and demons are around every corner even your trust…

乐维网管平台(四):配置化数据报表应用

在网络管理中,报表功能是一项非常重要的功能,它通过统计与分析各种类型数据,为网络管理员决策提供数据支撑。 一、配置化数据报表概述 基于不同行业、不同客户、不同应用场景,乐维网管平台提供了配置化报表功能。配置化数据报表允许用户根据实际需求,灵活配置并生成多种类…

Nuxt.js 应用中的 nitro:build:before 事件钩子详解

title: Nuxt.js 应用中的 nitro:build:before 事件钩子详解 date: 2024/11/4 updated: 2024/11/4 author: cmdragon excerpt: nitro:build:before 是 Nuxt 3 中的一个生命周期钩子,专门用于在构建 Nitro 实例之前调用。这个钩子允许开发者在 Nitro 实例构建之前执行特定的…

Chrome 130 版本新特性 Chrome 130 版本发行说明YN

Chrome 130 版本新特性& Chrome 130 版本发行说明 一、Chrome 130 版本浏览器更新 1. 新的桌面提示 Chrome 130 引入了一种新的 Toast 样式,用于在用户操作后提供视觉确认,或快速提供后续操作的途径。 当用户执行某个操作时,Toast 会在屏幕上短暂弹出,确认操作成功或提…

不同阻尼比的图形代码

import numpy as np import matplotlib.pyplot as plt# 定义二阶系统参数 omega_n = 1.0 # 无阻尼自然频率 t = np.linspace(0, 20, 1000)# 不同阻尼比 zeta_values = [0,1, 0.5, 1.0, 2.0]for zeta in zeta_values:if zeta == 1.0:# 临界阻尼x = (1 + omega_n * t) * np.exp(…

连续邮资问题-分支限界法求解

此为课题组所指导本科生和低年级硕士生学习组合优化问题汇报 所用教材:北京大学屈婉玲教授《算法设计与分析》 课程资料:https://www.icourse163.org/course/PKU-1002525003 承诺不用于任何商业用途,仅用于学术交流和分享 更多内容请关注许志伟课题组官方中文主页:https://…

《AI创作背景后的版权陷阱》学习笔记

1. AI内容生产,会侵犯他人版权吗? 2. 我用AI生产内容,我享有版权吗? 3. 如果我享有版权的话,我该怎么保护?别人盗用我的作品怎么办?(一)只是产权主要包括 ## 版权的标志 01 版权:版权即著作权 指文学、艺术、科学作品的作者对其作品享有的权利。 保护对象:具有独创性…

ubuntu 安装postgre

1.安装PostgreSQL并设置用户和密码1.1 使用ctrl+alt+t打开终端并安装安装sudo apt-get install postgresql-clientsudo apt-get install postgresql启动sudo service postgresql start进入控制台 sudo -u postgres psql创建用户create user dxqa with password dxq@123456;修改…

美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,…

Ubuntu20.04挂载新硬盘

一、硬盘分区 | Hard disk add new partition 1、显示硬盘及所属分区情况。在终端窗口中输入如下命令: sudo fdisk -l 显示当前的硬盘及所属分区的情况。如下图所示:系统提示:DIsk /dev/sdb doesnt contain a valid partition table。 2、对硬盘进行分区。在终端窗口中输入…

[快速阅读九] 自适应中值滤波及保守滤波在去除椒盐噪音或脉冲噪音上的应用。

去除椒盐噪音或脉冲噪音最经典的算法是中值滤波,通常在噪声的密度不是很大的情况下,使用中值效果不错。但当概率较大时,普通中值已经难以胜任,此时自适应中值滤波的处理效果简直就是逆天,基本完美的复现了原图,有的时候我自己都不敢相信这个结果,而保守滤波采用了稍微不…

[快速阅读] 自适应中值滤波及保守滤波在去除椒盐噪音或脉冲噪音上的应用。

去除椒盐噪音或脉冲噪音最经典的算法是中值滤波,通常在噪声的密度不是很大的情况下,使用中值效果不错。但当概率较大时,普通中值已经难以胜任,此时自适应中值滤波的处理效果简直就是逆天,基本完美的复现了原图,有的时候我自己都不敢相信这个结果,而保守滤波采用了稍微不…