微信小程序转uni-app

module.exports.author = "TTtai"

Uni-App

uni-app(uniapp.dcloud.io) 是Dcloud开发的基于 Vue.js 开发跨平台应用的前端框架,编写一套代码,就可编译到iOS、Android、H5、小程序等多个平台。

uni-app在跨端数量、兼容性、学习成本、扩展能力、开发社区、开发成本等方面拥有极强的竞争优势。

Miniprogram-to-uniapp

本文介绍的是基于miniprogram-to-uniapp,将微信小程序转为uni-app的操作过程。

https://github.com/zhangdaren/miniprogram-to-uniapp

步骤

  1. 安装miniprogram-to-uniapp
$ npm install miniprogram-to-uniapp -g
  1. 转换
$ wtu -i "项目路径"

例如

$ wtu -i "E:\bigeggProject\1911_SC.wechat

转换成功后会在 E:\bigeggProject\1911_SC.wechat同级目录生成

E:\bigeggProject\1911_SC.wechat_uni

  1. 迁移cloudfunctions

有云开发的小程序项目转换为uni-app项目cloudfunctions目录将被忽略,因此需手动配置

3.1. 拷贝cloudfunctions

手动将cloudfunctions拷贝到uni-app项目中

3.2. 配置manifest.json

{
"mp-weixin":{
// ...
"cloudfunctionRoot": "cloudfunctions/", // 配置云开发目录
// ...
  }
}

3.3. 配置vue.config.js

3.3.1. 初始化npm

npm init

3.3.2. 安装copy-webpack-plugin

npm install copy-webpack-plugin -D

3.3.3. 新建vue.config.js

const path = require('path')
const CopyWebpackPlugin = require('copy-webpack-plugin')

module.exports = {
    configureWebpack: {
        plugins: [
//  构建时将cloudfunctions文件内容拷贝到生成文件内
new CopyWebpackPlugin([
                {
from: path.join(__dirname, 'cloudfunctions'),
                    to: path.join(__dirname, 'unpackage/dist', process.env.NODE_ENV === 'production' ? 'build' : 'dev', process.env.UNI_PLATFORM, 'cloudfunctions')
                }
            ])
        ]
    }
}

FAQ 存在问题&解决方案

Q: 知晓云如何兼容h5

A:云开发部分采用微信插件方式引入,导致因此目前h5部分无法正常运行,考虑使用条件编译h5端引入知晓云sdk

Q: 图片路径错误

A: 因迁移到uni-app项目后图片资源文件路径会移动到`/static`路径下因此会导致

本地图片字符串路径转换错误(如data数据中配置的字符串图片路径),需手动debug排除

Q: 调用子组件方式存在差异

A:调用子组件方式在微信小程序及uni-app内存在以下差异,转换工具无法完成转换,需手动调整

微信小程序内:

// .wxml
 <share v-if="comment" :comment="comment" id="share"></share>
// .js
let share = this.selectComponent('#share');
 share.saveImage()

uni-app内:

// template
 <share v-if="comment" :comment="comment" ref="share"></share>
// script
let share = this.$refs.share;
 share.saveImage()

Q:methods内 _前缀方法名被改变

A: 目前发现微信小程序组件methods内方法名前缀为下划线_命名时,在经过miniprogram-to-uniapp转换后方法名中的_会被去除,并且方法名末尾会添加Fnn `_funcName`变更为`funcNameFun`

值得注意的是虽然组件内部调用方法名会同步被修改,但是如果在父组件调用子组件方法名时依旧是原始`_funcName`,实际运行时会报错,需手动调整为`funcNameFun`,例如

<!-- -----------转换前------------ -->
// share组件
Component({
  ready() {
    this._saveImage()
  },
  methods: {
    async _saveImage(sence) {
        // somethings
    }
  }
})
// 父组件
 share._saveImage()
<!-- -----------转换后------------ -->
// share组件
export default {
  mounted(){
    this.saveImageFun()
  },
  methods: {
    async saveImageFun(sence) {
        // somethings
    }
  }
}
// 父组件
 share._saveImage()
// 应修改为
 share.saveImageFun()

Q: 父子组件传值

A: 在微信小程序中父组件接受子组件传值时 值会在`e.detail`中取到,但在uni-app中为vue的父子组件传值方式,

转换之后接受时代码依旧存在`e.detail`需手动去除`detail`或使用解构方式

微信小程序内

// 子组件
this.triggerEvent('changeTab', {currentTab: this.data.currentTab})
// 父组件
handler(e){
this.setData({
      currentTab: e.detail.currentTab
    })
}

uni-app内

// 子组件
this.$emit('changeTab', {currentTab: this.data.currentTab})
// 父组件
// 转换后
handler(e){
this.setData({
      currentTab: e.detail.currentTab // 实际运行时无detail会报错
    })
}
// 应修改为
handler({currentTab}){
this.setData({
      currentTab: currentTab
    })
}

关注大蛋科技雷达,获得更多有意思的AI项目。

大蛋科技是一家提供技术咨询、设计、开发服务的初创企业。