草庐IT

uniapp (vite +vue3+ts+pinia) 搭配微信小程序云开发项目架构搭建-避坑指南

oil欧哟 2023-08-21 原文

前言

最近开始了项目旧改,将以前开发的一些校园小程序由 uniapp + vue2 版本升级为,unipp + vite + ts + vue3 的架构,顺便把代码质量提升一下。

由于是单兵作战,我选择将以前的后端摒弃,选择了微信小程序云开发作为后端,这样可以将我的开发精力聚焦在小程序上。 但这么做也有如下两个缺点:

  1. 使用了微信小程序云开发后,uniapp 只适用于编译成微信小程序,失去了跨端的能力。
  2. uniapp 使用云开发并不方便,尤其是使用了 typescript 后需要做大量的额外配置。

综合考虑之下我还是使用了微信小程序云开发,因为本身我做的就是微信小程序,只不过以 uniapp 为框架进行开发,而第二点的话我也找到了解决的方法,下面就为大家详细讲讲改如何去创建并开发这样的一个项目。

创建项目架构

首先使用官方提供的脚手架创建一个项目,这里我创建的是 vite + ts 的项目:

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

创建完成后,安装依赖并启动项目:

# 安装依赖
yarn install

# 启动开发环境
yarn dev:mp-weixin

因为是要搭配微信小程序云开发使用的,所以这里我启动的是微信小程序的开发环境。我们启动项目后,会编译出一个开发环境的包,目录路径为 dist/dev/mp-weixin ,如下图所示:

我们将这个目录在微信开发者工具打开,就可以预览小程序的效果了。当我们保存时也会实时编译更新。

由于是 ts + vue3 的项目,我没有选择 HBuilder 而是选择了 VScode 作为 ide 工具, VScode 对于 ts 的代码提示可谓浑然天成,而 vue3 还可以使用官方的插件 volar 进行语言支持,整体开发体验绝对是很爽的。

而对于 uniapp api的一些代码提示我使用的是 uniapp-snippet 这款插件,如下图:

配置小程序云开发 ts 类型支持

如果你需要使用微信小程序云开发的话,需要手动去安装一下微信小程序的 api 类型提示,操作步骤如下

  1. 安装云开发 ts 依赖
yarn add -D miniprogram-api-typings
  1. tsconfig 中添加 types
{
  "compilerOptions": {
    "types": [
      "@dcloudio/types",
      "miniprogram-api-typings/types"
    ],
  },
}

安装后,我们使用一些 wx 原生的 api 就可以看到代码提示了,效果如图:

配置云函数目录

首先我们在 src 目录下创建一个新的目录 src/cloudfuntioncs 用于存放我们的云函数,当你创建后我们会发现,这个目录在编译后并没有在微信开发工具中出现,也就意味着并没有被编译到最终产物中。

这个原因是由于云函数文件夹并没有被其他的文件所引用,因此 vite 进行编译时会并不会将这个 cloudfuntioncs 这个目录打包到产物中,因此我们需要自己将这个文件给复制出来。这一步我使用的是 rollup-plugin-copy 这个 rollup 插件。

  1. 首先安装 rollup-plugin-copy
yarn add -D rollup-plugin-copy
  1. 接着在 vite.config.ts 中配置一下需要复制的目录:
import { defineConfig } from 'vite'
import uni from '@dcloudio/vite-plugin-uni'
import copy from 'rollup-plugin-copy'
import path from 'path'

export default defineConfig({
  plugins: [copy({
    targets: [
      {
        src: 'src/cloudfunctions/**/*',
        dest: `dist/${process.env.NODE_ENV === 'production' ? 'build' : 'dev'}/${process.env.UNI_PLATFORM}/cloudfunctions`
      }
    ]
  }), uni()],
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src')
    }
  }
})

这一步我使用了环境变量去动态复制 cloudfunctions 目录到开发或者生产的目录位置。配置完成后我们就可以看到 cloudfuntioncs 目录在微信开发工具也能看到了。

配置项目 eslint

既然配置了 ts ,为了开发更加规范,我们就将 eslint 也一并配置了,操作步骤如下:

  1. 安装 eslint
yarn add -D eslint
  1. 初始化 eslint
npx eslint --init

执行命令后根据提示进行操作选择自己的风格,我选择的风格如下:

  1. 配置全局变量
    由于 uni 或者 wx 这种全局变量是不需要引入就可以使用的,eslint 会提示变量未定义,因此我们需要在 eslintrc.js 中配置一下 globals 变量:
modele.export = 
{
//...
globals: {
    uni: true,
    UniApp: true,
    wx: true,
    ICloud: true
  },
}

配置 pinia 全局数据及数据持久化

因为使用了 vue3 + ts 的技术栈,继续使用 vuex 的话配置起来很麻烦,而且 ts 支持并不算好,因此我们使用 pinia 来替代 vuex,首先安装 pinia

yarn add pinia

pinia 和 vuex 一样都可以以模块的方式去区分不同的全局数据类型,但是我这里全局数据并不多,因此我将所有的全局数据放在一个文件中:

// useStore.ts
import { defineStore, createPinia } from 'pinia'
import { createPersistedState } from 'pinia-plugin-persistedstate'
import { User } from '../types/user'

type StateType = {
	user?: User
}
export default defineStore('global', {
  persist: {
    key: 'pinia',
    paths: ['user']
  },
  state: (): StateType => ({
    user: undefined
  }),
  actions: {
    setData<T extends keyof StateType> ({ key, value }: { key: T, value: any }) {
      this[key] = value
    }
  }
})

export const pinia = createPinia().use(
  createPersistedState({
    storage: {
      getItem (key: string): string | null {
        return uni.getStorageSync(key)
      },
      setItem (key: string, value: string) {
        uni.setStorageSync(key, value)
      }
    }
  })
)

在上面的代码中,我通过 pinia-plugin-persistedstate 进行数据的持久化,由于默认的是使用 localstorage 进行数据存储,因此需要自己重新定义一下,使用 uniapp 的 api 进行数据存取。

persist 字段中 key 是存储在本地的键名,path 则是选择某个数据需要进行持久化,我配置的持久化效果如下图:

接下来在 main.ts 中引入一下:

// main.ts
import { createSSRApp } from 'vue'
import App from './App.vue'
import { pinia } from './hooks/useStore'

export function createApp () {
  const app = createSSRApp(App)
  app.use(pinia)
  return {
    app
  }
}

这样我们就可以通过 pinia 来进行全局数据的存取了,使用的方式如下:


import useStore from '@/hooks/useStore'
const store = useStore()

// 取值
console.log(store.user)

// 赋值
store.setData({ key: 'user', value:{ id: 0, name: 'oil '} })

注意点

在使用 pinia 中的变量时如果使用解构赋值,需要使用 storeToRefs 这个方法包裹一下,否则全局变量会失去响应式,变量更新时并不会重新渲染组件。

import { storeToRefs } from 'pinia'

// bad
const {user} = useStore()

// good
const {user} = storeToRefs(useStore())

总结

在项目重构的过程中我遇到了很多其他的坑,我将会在后面的文章为大家更加详细的介绍 vite + vue3 + ts + pinia 如何进行完整的项目开发,一些避坑注意点。

我的校园小程序完成重构后也将进行开源,方便大家进行学习参考。如果对于运营校园社区有兴趣的小伙伴可以私我噢~

相关文档

uniapp 官方文档:创建 uniapp

pinia 官方文档:storetorefs

微信小程序云开发官方文档

有关uniapp (vite +vue3+ts+pinia) 搭配微信小程序云开发项目架构搭建-避坑指南的更多相关文章

  1. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  2. Ruby 和指南针路径与 yeoman 项目 - 2

    我安装了ruby​​、yeoman,当我运行我的项目时,出现了这个错误:Warning:Running"compass:dist"(compass)taskWarning:YouneedtohaveRubyandCompassinstalledthistasktowork.Moreinfo:https://github.com/gruUse--forcetocontinue.Use--forcetocontinue.我有进入可变session目标的路径,但它不起作用。谁能帮帮我? 最佳答案 我必须运行这个:geminstallcom

  3. (附源码)vue3.0+.NET6实现聊天室(实时聊天SignalR) - 2

    参考文章搭建文章gitte源码在线体验可以注册两个号来测试演示图:一.整体介绍  介绍SignalR一种通讯模型Hub(中心模型,或者叫集线器模型),调用这个模型写好的方法,去发送消息。  内容有:    ①:Hub模型的方法介绍    ②:服务器端代码介绍    ③:前端vue3安装并调用后端方法    ④:聊天室样例整体流程:1、进入网站->调用连接SignalR的方法2、与好友发送消息->调用SignalR的自定义方法 前端通过,signalR内置方法.invoke()  去请求接口3、监听接受方法(渲染消息)通过new signalR.HubConnectionBuilder().on

  4. Simulink方法总结和避坑指南(一)——Simulink入门与基本调试方法 - 2

    文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景  最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。  在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记

  5. ruby - Ruby gems 的问题(损坏?)试图让指南针在 npm 中工作 - 2

    我不是Ruby专家,但想弄清楚发生了什么,因为我试图让指南针在节点应用程序中工作,但我的Ruby似乎坏了。打字:ruby--version让我:ruby2.1.1p76(2014-02-24revision45161)[x86_64-darwin13.0]我安装了Homebrew,之前遇到过Ruby版本的问题,但它似乎已安装并且可以正常工作。但是,当我使用gem输入请求时,出现此错误:$gem-hErrorloadingRubyGemsplugin"/Users/user_dir/.rvm/gems/ruby-2.1.1@global/gems/executable-hooks-1.3

  6. vue 实现内容超出两行显示展开更多功能,可依据需求自定义任意行数! - 2

    平时开发中我们经常会遇到这样的需求,在一个不限高度的盒子中会有很多内容,如果全部显示用户体验会非常不好,所以可以先折叠起来,当内容达到一定高度时,显示展开更多按钮,点击即可显示全部内容,先来看看效果图: 这样做用户体验瞬间得到提升,接下来看看具体细节。0">主要操作在内容这里{{item.username}},……展开更多样式大家可依据自己项目需求进行设计,这里就不贴了,主要说几个关键的。1、在data中定义三个属性isShowMore:false, //控制展开更多的显示与隐藏textHeight:null, //框中内容的高度status:false, //内容状态是否打开2.计算内容是否

  7. ruby - 使用指南针安装 bootstrap sass - 2

    我正在尝试安装bootstrap-sass并收到以下错误。我试过旧版本的sass,但bundler一直在安装3.3.0。WARN:UnresolvedspecsduringGem::Specification.reset:sass(~>3.2)WARN:Clearingoutunresolvedspecs.Pleasereportabugifthiscausesproblems./Library/Ruby/Gems/2.0.0/gems/compass-0.12.2/lib/compass/sass_extensions/monkey_patches/browser_support.r

  8. JMockit 使用指南 - 2

    目录配置模拟模拟类型与实例期望录制-回放-验证指定调用计数验证指定自定义结果验证调用参数联级模拟部分模拟模拟未实现的类其他伪装伪装方法及类伪装未实现类本文主要内容如何在SpringBoot中配置使用JMockit如何mock/faking依赖的对象如何对行为mock如何VerificationJMockit之所以强大,是因其使用了javaagent对类的字节码做了修改,在JVM的所有mock工具中,它是功能最强大的。同时注解又是最少的。配置在SpringBoot项目中使用JMockit隔离代码做单元测试,需要做以下配置引入JMockit依赖。dependencies>dependency>gr

  9. vue3.0 + vite2.0+如何兼容低版本浏览器 - 2

    这里写自定义目录标题一、问题二、解决三、解决方案四、打包预览一、问题在使用vue3.2和vite2开发一个移动端或者钉钉端H5微服务iosapp内置浏览器打开没问题安卓app内置浏览器打开空白页面vconsole打印出现报错globalthisundefind二、解决内置浏览器版本比较低打印出来是63vue3代码不兼容低版本浏览器三、解决方案步骤一:vite.config.ts里build.target配置项指定构建目标为es2015或者步骤二:安装@vitejs/plugin-legacy安装完报错也还在指定版本可以解决“@vitejs/plugin-legacy”:“1.8.0”,步骤三:

  10. 停车系统源码-基于springboot+uniapp开源项目 - 2

    Iparking停车收费管理系统-可商用介绍Iparking是一款基于springBoot的停车收费管理系统,支持封闭车场和路边车场,支持微信支付宝多种支付渠道,支持多种硬件,涵盖了停车场管理系统的所有基础功能。技术栈Springboot,MybatisPlus,Beetl,Mysql,Redis,RabbitMQ,UniApp功能云端功能序号模块功能描述1系统管理菜单管理配置系统菜单2系统管理组织管理管理组织机构3系统管理角色管理配置系统角色,包含数据权限和功能权限配置4系统管理用户管理管理后台用户5系统管理租户管理多租户管理6系统管理公众号配置租户公众号配置7系统管理操作日志审计日志8系统

随机推荐