当前位置: 首页 > news >正文

uni-app基础框架搭建(vue3+ts+vite)

1.基础准备

uni-app官网uni-app,uniCloud,serverless,环境安装,创建uni-app,自定义模板,国内特殊情况,更新依赖到指定版本,运行、发布uni-app,运行并发布快应用,运行并发布快应用(webview),运行并发布快应用(webview)-华为,cli创建项目和HBuilderX可视化界面创icon-default.png?t=N7T8https://uniapp.dcloud.net.cn/quickstart-cli.html        安装node、hbuilder

        安装pnpm,相比于npm他的优点是:显著提升了包安装的速度和磁盘空间利用率,同时避免了依赖冲突和重复安装的问题;

npm install -g pnpm

        创建uniapp vue3+ts项目

npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project

2.引入uni-ui 组件库

        安装 uni-ui 组件库

pnpm i @dcloudio/uni-ui

        src/pages.json

// pages.json
{// 组件自动导入"easycom": {"autoscan": true,"custom": {// uni-ui 规则如下配置  // [!code ++]"^uni-(.*)": "@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue" // [!code ++]}},"pages": [// …省略]
}

        安装类型声明文件

pnpm i -D @uni-helper/uni-ui-types

        配置类型声明文件

// tsconfig.json
{"compilerOptions": {// ..."types": ["@dcloudio/types", // uni-app API 类型"miniprogram-api-typings", // 原生微信小程序类型"@uni-helper/uni-app-types", // uni-app 组件类型"@uni-helper/uni-ui-types" // uni-ui 组件类型  // [!code ++]]},// vue 编译器类型,校验标签类型"vueCompilerOptions": {"nativeTags": ["block", "component", "template", "slot"]}
}

3.小程序端 Pinia 持久化

        安装持久化存储插件,pinia-plugin-persistedstate

pnpm i pinia-plugin-persistedstate

        src/stores/modules/member.ts

import type { LoginResult } from '@/types/member'
import { defineStore } from 'pinia'
import { ref } from 'vue'// 定义 Store
export const useMemberStore = defineStore('member',() => {// 会员信息const profile = ref<LoginResult>()// 保存会员信息,登录时使用const setProfile = (val: LoginResult) => {profile.value = val}// 清理会员信息,退出时使用const clearProfile = () => {profile.value = undefined}// 记得 returnreturn {profile,setProfile,clearProfile,}},{// 网页端配置// persist: true,// 小程序端配置persist: {storage: {getItem(key) {return uni.getStorageSync(key)},setItem(key, value) {uni.setStorageSync(key, value)},},},},
)

        src/stores/index.ts

import { createPinia } from 'pinia'
import persist from 'pinia-plugin-persistedstate'// 创建 pinia 实例
const pinia = createPinia()
// 使用持久化存储插件
pinia.use(persist)// 默认导出,给 main.ts 使用
export default pinia// 模块统一导出
export * from './modules/member'

        src/main.ts

import { createSSRApp } from 'vue'
import App from './App.vue'// 导入 pinia 实例
import pinia from './stores'export function createApp() {// 创建 vue 实例const app = createSSRApp(App)// 使用 piniaapp.use(pinia)return {app,}
}

4.uni.request 请求封装

        创建拦截器,src/utils/http.ts

/*** 添加拦截器:*   拦截 request 请求*   拦截 uploadFile 文件上传** TODO:*   1. 非 http 开头需拼接地址*   2. 请求超时*   3. 添加小程序端请求头标识*   4. 添加 token 请求头标识*/import { useMemberStore } from '@/stores'const baseURL = 'https://pcapi-xiaotuxian-front-devtest.itheima.net'// 添加拦截器
const httpInterceptor = {// 拦截前触发invoke(options: UniApp.RequestOptions) {// 1. 非 http 开头需拼接地址if (!options.url.startsWith('http')) {options.url = baseURL + options.url}// 2. 请求超时, 默认 60soptions.timeout = 10000// 3. 添加小程序端请求头标识options.header = {...options.header,'source-client': 'miniapp',}// 4. 添加 token 请求头标识const memberStore = useMemberStore()const token = memberStore.profile?.tokenif (token) {options.header.Authorization = token}},
}
uni.addInterceptor('request', httpInterceptor)
uni.addInterceptor('uploadFile', httpInterceptor)/*** 请求函数* @param  UniApp.RequestOptions* @returns Promise*  1. 返回 Promise 对象*  2. 获取数据成功*    2.1 提取核心数据 res.data*    2.2 添加类型,支持泛型*  3. 获取数据失败*    3.1 401错误  -> 清理用户信息,跳转到登录页*    3.2 其他错误 -> 根据后端错误信息轻提示*    3.3 网络错误 -> 提示用户换网络*/
type Data<T> = {code: stringerrorMessage: stringdata: T
}
// 2.2 添加类型,支持泛型
export const http = <T>(options: UniApp.RequestOptions) => {// 1. 返回 Promise 对象return new Promise<Data<T>>((resolve, reject) => {uni.request({...options,// 响应成功success(res) {// 状态码 2xx, axios 就是这样设计的if (res.statusCode >= 200 && res.statusCode < 300) {// 2.1 提取核心数据 res.dataresolve(res.data as Data<T>)} else if (res.statusCode === 401) {// 401错误  -> 清理用户信息,跳转到登录页const memberStore = useMemberStore()memberStore.clearProfile()uni.navigateTo({ url: '/user/login' })reject(res)} else {// 其他错误 -> 根据后端错误信息轻提示uni.showToast({icon: 'none',title: (res.data as Data<T>).errorMessage || '请求错误',})reject(res)}},// 响应失败fail(err) {uni.showToast({icon: 'none',title: '网络错误,换个网络试试',})reject(err)},})})
}

6.统一代码风格

        安装 eslint+prettier

pnpm i -D eslint prettier eslint-plugin-vue @vue/eslint-config-prettier @vue/eslint-config-typescript @rushstack/eslint-patch @vue/tsconfig

        新建文件.eslintrc.cjs ,添加以下 eslint 配置

/* eslint-env node */
require('@rushstack/eslint-patch/modern-module-resolution')module.exports = {root: true,extends: ['plugin:vue/vue3-essential','eslint:recommended','@vue/eslint-config-typescript','@vue/eslint-config-prettier',],// 小程序全局变量globals: {uni: true,wx: true,WechatMiniprogram: true,getCurrentPages: true,UniApp: true,UniHelper: true,},parserOptions: {ecmaVersion: 'latest',},rules: {'prettier/prettier': ['warn',{singleQuote: true,semi: false,printWidth: 100,trailingComma: 'all',endOfLine: 'auto',},],'vue/multi-word-component-names': ['off'],'vue/no-setup-props-destructure': ['off'],'vue/no-deprecated-html-element-is': ['off'],'@typescript-eslint/no-unused-vars': ['off'],},
}

        配置package.json

{"script": {// ... 省略 ..."lint": "eslint . --ext .vue,.js,.ts --fix --ignore-path .gitignore"}
}

pnpm lint

7.Git 工作流规范

        安装并初始化 husky

pnpm dlx husky-init

npx husky-init

        安装 lint-staged

pnpm i -D lint-staged

         配置package.json

{"script": {// ... 省略 ...},"lint-staged": {"*.{vue,ts,js}": ["eslint --fix"]}
}

        修改 .husky/pre-commit 文件  

#!/usr/bin/env sh

. "$(dirname -- "$0")/_/husky.sh"

pnpm lint-staged

相关文章:

  • 【杂记-浅谈Internet、Intranet、Extranet】
  • 抖音素材网站有哪些?抖音素材下载网站分享
  • mongodb集群
  • LeetCode|938. Range Sum of BST
  • Python中的列表推导式和字典推导式:优雅且高效的数据结构生成方式
  • 每天坚持写java锻炼能力---第一天(6.4)
  • javaweb的新能源充电系统的设计
  • 【JS】JavaScript编程语言-(Object)对象属性标志与对象属性描述符(2024-06-05)
  • 大模型日报2024-06-06
  • RabbitMQ(五)集群配置、Management UI
  • UFS协议—新手快速入门(二)【5-6】
  • Redis使用中的性能优化——搭建Redis的监测服务
  • 显卡分类及特性详解
  • C语言scanf( ) 函数的格式控制包括哪些?
  • 【TensorFlow深度学习】Adam优化器的工作原理与配置细节
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • CentOS 7 防火墙操作
  • C语言笔记(第一章:C语言编程)
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • JavaScript HTML DOM
  • Laravel5.4 Queues队列学习
  • Linux后台研发超实用命令总结
  • linux学习笔记
  • php中curl和soap方式请求服务超时问题
  • Redis 懒删除(lazy free)简史
  • Swift 中的尾递归和蹦床
  • vue数据传递--我有特殊的实现技巧
  • 简单数学运算程序(不定期更新)
  • 入手阿里云新服务器的部署NODE
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 网络应用优化——时延与带宽
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 由插件封装引出的一丢丢思考
  • 正则表达式小结
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #{}和${}的区别是什么 -- java面试
  • $ git push -u origin master 推送到远程库出错
  • (11)MATLAB PCA+SVM 人脸识别
  • (安卓)跳转应用市场APP详情页的方式
  • (八)c52学习之旅-中断实验
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (五)IO流之ByteArrayInput/OutputStream
  • (转)winform之ListView
  • (转载)Google Chrome调试JS
  • .gitignore文件—git忽略文件
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Core引入性能分析引导优化
  • .Net 垃圾回收机制原理(二)
  • .NET 使用 XPath 来读写 XML 文件
  • .Net多线程Threading相关详解