当前位置:   article > 正文

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

uniapp 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

  1. // pages.json
  2. {
  3. // 组件自动导入
  4. "easycom": {
  5. "autoscan": true,
  6. "custom": {
  7. // uni-ui 规则如下配置 // [!code ++]
  8. "^uni-(.*)": "@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue" // [!code ++]
  9. }
  10. },
  11. "pages": [
  12. // …省略
  13. ]
  14. }

        安装类型声明文件

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

        配置类型声明文件

  1. // tsconfig.json
  2. {
  3. "compilerOptions": {
  4. // ...
  5. "types": [
  6. "@dcloudio/types", // uni-app API 类型
  7. "miniprogram-api-typings", // 原生微信小程序类型
  8. "@uni-helper/uni-app-types", // uni-app 组件类型
  9. "@uni-helper/uni-ui-types" // uni-ui 组件类型 // [!code ++]
  10. ]
  11. },
  12. // vue 编译器类型,校验标签类型
  13. "vueCompilerOptions": {
  14. "nativeTags": ["block", "component", "template", "slot"]
  15. }
  16. }

3.小程序端 Pinia 持久化

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

pnpm i pinia-plugin-persistedstate

        src/stores/modules/member.ts

  1. import type { LoginResult } from '@/types/member'
  2. import { defineStore } from 'pinia'
  3. import { ref } from 'vue'
  4. // 定义 Store
  5. export const useMemberStore = defineStore(
  6. 'member',
  7. () => {
  8. // 会员信息
  9. const profile = ref<LoginResult>()
  10. // 保存会员信息,登录时使用
  11. const setProfile = (val: LoginResult) => {
  12. profile.value = val
  13. }
  14. // 清理会员信息,退出时使用
  15. const clearProfile = () => {
  16. profile.value = undefined
  17. }
  18. // 记得 return
  19. return {
  20. profile,
  21. setProfile,
  22. clearProfile,
  23. }
  24. },
  25. {
  26. // 网页端配置
  27. // persist: true,
  28. // 小程序端配置
  29. persist: {
  30. storage: {
  31. getItem(key) {
  32. return uni.getStorageSync(key)
  33. },
  34. setItem(key, value) {
  35. uni.setStorageSync(key, value)
  36. },
  37. },
  38. },
  39. },
  40. )

        src/stores/index.ts

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

        src/main.ts

  1. import { createSSRApp } from 'vue'
  2. import App from './App.vue'
  3. // 导入 pinia 实例
  4. import pinia from './stores'
  5. export function createApp() {
  6. // 创建 vue 实例
  7. const app = createSSRApp(App)
  8. // 使用 pinia
  9. app.use(pinia)
  10. return {
  11. app,
  12. }
  13. }

4.uni.request 请求封装

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

  1. /**
  2. * 添加拦截器:
  3. * 拦截 request 请求
  4. * 拦截 uploadFile 文件上传
  5. *
  6. * TODO:
  7. * 1. 非 http 开头需拼接地址
  8. * 2. 请求超时
  9. * 3. 添加小程序端请求头标识
  10. * 4. 添加 token 请求头标识
  11. */
  12. import { useMemberStore } from '@/stores'
  13. const baseURL = 'https://pcapi-xiaotuxian-front-devtest.itheima.net'
  14. // 添加拦截器
  15. const httpInterceptor = {
  16. // 拦截前触发
  17. invoke(options: UniApp.RequestOptions) {
  18. // 1. 非 http 开头需拼接地址
  19. if (!options.url.startsWith('http')) {
  20. options.url = baseURL + options.url
  21. }
  22. // 2. 请求超时, 默认 60s
  23. options.timeout = 10000
  24. // 3. 添加小程序端请求头标识
  25. options.header = {
  26. ...options.header,
  27. 'source-client': 'miniapp',
  28. }
  29. // 4. 添加 token 请求头标识
  30. const memberStore = useMemberStore()
  31. const token = memberStore.profile?.token
  32. if (token) {
  33. options.header.Authorization = token
  34. }
  35. },
  36. }
  37. uni.addInterceptor('request', httpInterceptor)
  38. uni.addInterceptor('uploadFile', httpInterceptor)
  39. /**
  40. * 请求函数
  41. * @param UniApp.RequestOptions
  42. * @returns Promise
  43. * 1. 返回 Promise 对象
  44. * 2. 获取数据成功
  45. * 2.1 提取核心数据 res.data
  46. * 2.2 添加类型,支持泛型
  47. * 3. 获取数据失败
  48. * 3.1 401错误 -> 清理用户信息,跳转到登录页
  49. * 3.2 其他错误 -> 根据后端错误信息轻提示
  50. * 3.3 网络错误 -> 提示用户换网络
  51. */
  52. type Data<T> = {
  53. code: string
  54. errorMessage: string
  55. data: T
  56. }
  57. // 2.2 添加类型,支持泛型
  58. export const http = <T>(options: UniApp.RequestOptions) => {
  59. // 1. 返回 Promise 对象
  60. return new Promise<Data<T>>((resolve, reject) => {
  61. uni.request({
  62. ...options,
  63. // 响应成功
  64. success(res) {
  65. // 状态码 2xx, axios 就是这样设计的
  66. if (res.statusCode >= 200 && res.statusCode < 300) {
  67. // 2.1 提取核心数据 res.data
  68. resolve(res.data as Data<T>)
  69. } else if (res.statusCode === 401) {
  70. // 401错误 -> 清理用户信息,跳转到登录页
  71. const memberStore = useMemberStore()
  72. memberStore.clearProfile()
  73. uni.navigateTo({ url: '/user/login' })
  74. reject(res)
  75. } else {
  76. // 其他错误 -> 根据后端错误信息轻提示
  77. uni.showToast({
  78. icon: 'none',
  79. title: (res.data as Data<T>).errorMessage || '请求错误',
  80. })
  81. reject(res)
  82. }
  83. },
  84. // 响应失败
  85. fail(err) {
  86. uni.showToast({
  87. icon: 'none',
  88. title: '网络错误,换个网络试试',
  89. })
  90. reject(err)
  91. },
  92. })
  93. })
  94. }

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 配置

  1. /* eslint-env node */
  2. require('@rushstack/eslint-patch/modern-module-resolution')
  3. module.exports = {
  4. root: true,
  5. extends: [
  6. 'plugin:vue/vue3-essential',
  7. 'eslint:recommended',
  8. '@vue/eslint-config-typescript',
  9. '@vue/eslint-config-prettier',
  10. ],
  11. // 小程序全局变量
  12. globals: {
  13. uni: true,
  14. wx: true,
  15. WechatMiniprogram: true,
  16. getCurrentPages: true,
  17. UniApp: true,
  18. UniHelper: true,
  19. },
  20. parserOptions: {
  21. ecmaVersion: 'latest',
  22. },
  23. rules: {
  24. 'prettier/prettier': [
  25. 'warn',
  26. {
  27. singleQuote: true,
  28. semi: false,
  29. printWidth: 100,
  30. trailingComma: 'all',
  31. endOfLine: 'auto',
  32. },
  33. ],
  34. 'vue/multi-word-component-names': ['off'],
  35. 'vue/no-setup-props-destructure': ['off'],
  36. 'vue/no-deprecated-html-element-is': ['off'],
  37. '@typescript-eslint/no-unused-vars': ['off'],
  38. },
  39. }

        配置package.json(eslint8版本--ext命令不支持,用下面的)

  1. {
  2. "script": {
  3. // ... 省略 ...
  4. "lint": "eslint . --ext .vue,.js,.ts --fix --ignore-path .gitignore"
  5. }
  6. }
  1. {
  2. "scripts": {
  3. // ... 省略 ...
  4. "lint": "eslint . --fix --ignore-path .gitignore"
  5. }
  6. }

pnpm lint

7.Git 工作流规范

        安装并初始化 husky

pnpm dlx husky-init

npx husky-init

        安装 lint-staged

pnpm i -D lint-staged

         配置package.json

  1. {
  2. "script": {
  3. // ... 省略 ...
  4. },
  5. "lint-staged": {
  6. "*.{vue,ts,js}": ["eslint --fix"]
  7. }
  8. }

        修改 .husky/pre-commit 文件  

#!/usr/bin/env sh

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

pnpm lint-staged

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号