微信小程序从云开发迁移至Unicloud注意事项

本篇文章写于2024年7月,本人花费1天时间将微信小程序从微信自己的云开发迁移到了Unicloud,中间踩了无数的坑,这里来写一下过程中的注意事项。

迁移流程

第一步 安装node.js

这一步我就不赘述了,直接打开node.js官网下载安装。

第二步 安装迁移工具miniprogram-to-uniapp

npm install miniprogram-to-uniapp -g 

第三步 转换小程序

由于PowerShell默认禁止执行脚本,需要先使用

set-ExecutionPolicy RemoteSigned

来允许执行脚本,之后使用

wtu -i 你的小程序代码路径

来进行转换,他会在相同目录下新建一个_uni后缀的目录,将该目录导入进HBuilderX就可以了

第四步 打开小程序

在manifest.json文件中,第一行是uni-app应用表示,点击右侧重新获取并登录。

之后右键点击uniCloud目录并点“关联云服务空间或项目”

m2u默认建立的是aliyun的云空间,关联其他云空间可能会报错,可以手动点击根目录,右键创建云开发环境,并将云函数全部复制到新环境里。

第五步 手动修改

即使当前版本的m2u已经比很多教程所使用的老版本好用了很多,仍然有很多需要手动修改的地方。

a. 云函数的修改

需要注意的是迁移到dcloud以后,后台没法自动获取openid了,我为了业务逻辑变更最少使用的是前台获取openid然后传给后端的方法。如果为了安全的话推荐使用uni-id体系,但我尚未学习uni-id如何使用。

获取openid的方法请参考以下这篇文章

uniCloud云开发获取小程序用户openid_unicloud 获取openid-CSDN博客

需要注意的是,所有云数据库的add和update等操作,unicloud与微信云开发相比都少嵌套了一层data,如原来的

db.collection('test').add({
    data:{
        test: 123
    }
})
//微信云开发

都需要修改成

db.collection('test').add({
    test: 123
})
//unicloud

b. 自定义tabbar的修改

在uniapp中,this是没有getTabBar方法的,需要改成getCurrentPages()[0].getTabBar,如

if (typeof this.getTabBar === 'function' && this.getTabBar()) {
    this.getTabBar().setData({
        selected: 2
    });
}
//微信

需要修改成

if (typeof getCurrentPages()[0].getTabBar === 'function' && getCurrentPages()[0].getTabBar()) {
    getCurrentPages()[0].getTabBar().setData({
        selected: 2
    });
}
//uniapp

迁移到uniapp后,custom-tab-bar是在每个页面加载以后attach的,导致第一次打开页面的时候设置selected不起作用,我的解决方案是在custom-tab-bar的attached方法中设置selected

//userType是我定义的用户类型
//tabList是我定义的对于每个类型的用户显示的tabbar
for (let i in this.tabList[userType]) {
    if (this.tabList[userType][i].pagePath == getCurrentPages()[0].$page.fullPath) {
        this.setData({
            selected: parseInt(i)
        })
    }
}

c. 自动生成app.json

使用unicloud自动生成的app.json会部分使用pages.json里的值,但是有些值会被忽略,导致迁移后程序样式不一致。我在反复调研后通过在vue.config.js文件里新增自定义插件解决了这个问题。

注意:如果vue.config.js不存在需要在根目录自己新建

我的文件内容参考如下

//vue.config.js
const path = require('path')
const fs = require('fs')

class ModifyWXAppPlugin {
	apply(compiler) {
		compiler.hooks.done.tap('ModifyWXAppPlugin', compilation => {
			if (process.env.UNI_PLATFORM != "mp-weixin") {
				return;
			}
			console.log("正在修改app.json")
			const appjson_path = path.join(__dirname, 'unpackage', 'dist', process.env
				.NODE_ENV ===
				'production' ?
				'build' : 'dev', process.env.UNI_PLATFORM, 'app.json')
			let appjson = fs.readFileSync(appjson_path, {
				encoding: 'utf-8'
			})

			let app = JSON.parse(appjson)

			app.sitemapLocation = "sitemap.json"
			app.style = "v2"
			app.lazyCodeLoading = "requiredComponents"
			app.useExtendedLib = {
				weui: true
			}

			appjson = JSON.stringify(app, null, 2)

			fs.writeFileSync(appjson_path, appjson, {
				"flag": "w"
			})
		})
	}
}

module.exports = {
	configureWebpack: {
		plugins: [new ModifyWXAppPlugin({
			options: true
		})],
	}
}

d. 图片地址的修改

uniapp会把图片放到static目录里去,m2u会自动转换但是匹配过程可能会错过一些比如使用了变量拼接的值,请手动确认所有图片地址都修改了

e. manifest.json设置项

在微信小程序设置里,注意打开上传代码时自动压缩,并关闭位置接口(如果你没用的话)

f. 编辑DB Schema

如果你在后端建好了表的话,先右键uniCloud文件夹下的database点击下载DB Schema然后编辑,编写规则请参考

DB Schema概述 | uniCloud (dcloud.net.cn)

g. 修改本地访问数据库代码

先把wx.cloud替换成uniCloud,然后uniCloud的get方法不支持success参数,请使用then方法

修改前

//微信
wx.cloud.database.collection('test').get({
    success: res => {
        console.log(res)
    }
})

修改后

//unicloud
uniCloud.database.collection('test').get().then(res => {
    console.log(res)
})

小程序注意事项

1. 禁止爬虫

如果你在页面的onLoad函数里调用了云函数的话,微信的爬虫会调用相当多次数,可以通过编辑sitemap.json禁用,文件内容如下

//sitemap.json
{
  "desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html",
  "rules": [{
    "action": "disallow",
    "page": "*"
  }]
}

需要注意的是,uniapp默认生成的app.json里是没有sitemap的,请参考上文进行修改。

2. 添加request合法请求

打开小程序后台,在开发管理-服务器域名中进行修改,请参考

uniCloud发行 | uniCloud (dcloud.net.cn)

关注藤田琴音谢谢喵

<template> <view class="edit"> <view class="title"> <input type="text" v-model="artObj.title" placeholder="请输入完整的标题" placeholder-class="placeholderClass"> </view> <view class="content"> <editor class="myEdit" placeholder="写点什么" show-img-size show-img-toolbar show-img-resize @focus="onFocus" @ready="onEditReady" @statuschange="onStatuschange" ></editor> </view> <view class="btnGroup"> <button @click="onSubmit" type="primary" text="确认发表" :disabled="!artObj.title.length"> 确认发表 </button> </view> <!-- 副文本编缉器 --> <view class="tools" v-if="toolShow" :style="{bottom:stsBotHeight}"> <view class="item" @click="clickHead" > <text class="iconfont icon-zitibiaoti" :class="headShow ? 'active' : ''"></text> </view> <view class="item" @click="clickBold"> <text class="iconfont icon-zitijiacu" :class="boldShow ? 'active': ''"></text> </view> <view class="item" @click="clickItalic"> <text class="iconfont icon-zitixieti" :class="italicShow ? 'active' : ''"></text> </view> <view class="item" @click="clickDivider"> <text class="iconfont icon-yi"></text> </view> <view class="item" @click="clickInsertImage"> <text class="iconfont icon-tupian1"></text> </view> <view class="item" @click="editOk"> <text class="iconfont icon-queren"></text> </view> </view> </view> </template> <script setup> import { ref,computed,getCurrentInstance,onMounted } from 'vue'; import {getImgSrc,removeHtmlTags} from "@/utils/tools.js"; import {showToast} from "@/utils/common.js"; import {useUserStore} from "@/stores/user.js"; const userStore = useUserStore(); const systemInfo = uni.getSystemInfoSync(); const stsBotHeight = ref(systemInfo.safeAreaInsets.bottom); const toolShow = ref(false); const headShow = ref(false); const boldShow = ref(false); const italicShow = ref(false); const secCheckObj = uniCloud.importObject("secCheckContent"); cons
03-17
<think>好的,我需要解决用户在Vue项目中配置和使用微信小程序editor组件的问题,并实现标题、加粗、斜体等功能。首先,我需要明确用户的需求。用户之前使用过vue-quill-editor和wangeditor,现在想在小程序中使用原生的editor组件,这可能是因为跨平台需求或者项目迁移小程序环境。 首先,我得回忆微信小程序的editor组件的基本用法。微信小程序的editor组件是原生提供的富文本编辑器,支持部分格式设置,但功能可能比PC端的编辑器简单。需要查看微信官方文档,确认editor组件的属性和方法。 接下来,配置editor组件。在Vue项目中,通常使用Vue文件结构,但微信小程序有自身的结构,比如WXML、WXSS和JS。如果用户是在使用uni-app或Taro等多端框架,可能需要不同的配置方式。但根据用户的问题,可能是指直接在小程序环境中使用,因此需要在小程序的页面中引入editor组件。 然后,实现标题、加粗、斜体等功能。这些功能通常通过按钮触发,调用editor组件的方法来修改格式。例如,加粗可能调用editorContext.format('bold', true)。需要确保在按钮的事件处理函数中获取到editor实例,然后调用相应的方法。 另外,用户可能遇到的数据绑定问题,比如如何获取编辑后的内容。editor组件可以通过bindinput或bindstatuschange事件来实时获取内容,或者通过保存按钮调用editorContext.getContents()来获取内容。 还需要考虑样式问题,确保editor组件在页面中正确显示,并且工具栏按钮布局合理。可能需要在WXML中添加按钮,并绑定相应的事件处理函数。 最后,测试功能是否正常,比如加粗是否生效,标题格式是否正确应用,以及内容是否能正确保存和获取。如果有问题,需要检查是否正确获取了editorContext,方法调用是否正确,以及事件绑定是否无误。 总结步骤:引入editor组件到页面结构,设置样式,创建按钮并绑定事件,使用editorContext的方法实现格式调整,处理内容获取和保存。同时,注意微信小程序的API调用方式,与Vue组件的生命周期可能有所不同。</think>在微信小程序中使用`editor`组件实现富文本编辑功能时,需注意其原生API调用方式与PC端富文本编辑器(如vue-quill-editor)的差异。以下是具体配置和功能实现方法: --- ### 一、基础配置 1. **WXML中添加组件** ```html <editor id="myEditor" placeholder="开始输入..." bindready="onEditorReady" bindinput="onInput" class="editor-area" ></editor> <div class="toolbar"> <button bindtap="setBold">加粗</button> <button bindtap="setHeading">标题</button> <button bindtap="setItalic">斜体</button> </div> ``` 2. **WXSS样式调整** ```css .editor-area { height: 300px; padding: 10px; border: 1px solid #eee; } .toolbar button { margin-right: 10px; padding: 5px 10px; } ``` --- ### 二、功能实现 #### 1. 获取编辑器实例 ```javascript let editorCtx = null; Page({ onEditorReady() { wx.createSelectorQuery() .select('#myEditor') .context(res => { editorCtx = res.context }).exec() } }) ``` #### 2. 格式设置方法 ```javascript // 加粗 setBold() { editorCtx.format('bold', true) // 第二个参数为布尔值表示状态切换 }, // 标题(需清除其他格式) setHeading() { editorCtx.format('header', 'h2') // 支持h1-h6 editorCtx.format('bold', false) editorCtx.format('italic', false) }, // 斜体 setItalic() { editorCtx.format('italic', true) } ``` #### 3. 内容获取与保存 ```javascript saveContent() { editorCtx.getContents({ success(res) { wx.setStorageSync('editorContent', res.html) } }) } ``` --- ### 三、注意事项 1. **功能限制**:小程序`editor`组件不支持自定义字体、颜色选择器等高级功能,需通过扩展API或第三方库实现[^1] 2. **兼容性**:部分格式在渲染时可能存在样式差异,建议使用`rich-text`组件配合展示 3. **数据安全**:通过`img.upload`接口处理图片上传时需配置合法域名 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值