微信原生小程序转其他平台的小程序实践(上)

简介: 如何将现有的微信原生小程序转其他平台的小程序?我想如果打算做这么一件事,或许大多数同学和我一样可能没什么思路。我第一次听说是在一次小程序生态技术大会上,一公司的一位前端技术人员谈到他们公司主要是将自己的微信小程序通过团队开发的工具转成其他平台的小程序,所以当时我也很想了解这个工具是怎么做的,实现过程是什么?

恰好近期有这么一次需求要将现有的微信小程序上开发别家的小程序,这个事要么通过现在比较好的方案uni-app来做,要么就用对应的原生小程序来写。但是从零开始做,工作量实在太大了,周期好长呀,那么多页面,得搞到啥时候。就在决定开始调研uni-app来做的时候,恰好有一天在微信上看见了一篇技术文章:开源|wwto:小程序跨端迁移解决方案——微信转其他小程序 最后放弃了使用uni-app来做,尝试通过这个工具来转换。


下面也将围绕 wwto 这个工具库,通过将我们现有的微信小程序转支付宝小程序来了解其转换原理,同时呢会说下在转换的过程中遇到的各种问题是如何解决的,希望对有需要的同学能有所帮助


在了解 wwto 这个工具库后,它大致的架构是这样的,下面这张图是使用作者的,更权威一点。



通过了解 编译 以及 运行时 这两个模块的实现过程就能够明白小程序转换的过程中做了那些事情以及怎么去做的了


下面对这两个阶段所做的事简单说下:



1、在 编译 阶段主要对4个文件做了处理,分别是:*.js、 *.json、 *.wxml、 *wxss

*.wxml 的处理部分代码如下,可看源码wxml.js


function convert(wxmlText, isWpy) {
  return wxmlText
    .replace(/wx:/g, 'a:')
    .replace(/a:for-items/g, 'a:for')
    .replace(/a:for-key/g, 'a:key')
    //  data-set 全部转为小写
    .replace(/data-[^=\s]=/g, (match) => match.toLocaleLowerCase())
    // // s:for-index="{{idx}}" -> s:for-index="idx"
    .replace(/a:for-index=['"]({{\w+}})['"]/ig, (match) => match.replace('{{', '').replace('}}', ''))
    // 自定义组件命名不能用驼峰
    .replace(/<[\w]+/ig, (match) => {
      return isWpy ? match : match.replace(/[A-Z]/g, (m) => ['-', m.toLowerCase()].join(''));
    })
    // 事件绑定名称对齐
    .replace(/\s+catch[\w]+=['"]/ig, (match) => match.replace(/catchsubmit/ig, 'onSubmit')
      .replace(/catch(\w)/g, (m, p1) => ['catch', p1.toUpperCase()].join('')));
    ... 省略
}
module.exports = convert;


通过对文件的处理:例如


<view bind:cellTap='onTabMyCrad' wx:if="{{hasJoin}}">...</view>  变成了 <view onCellTap='onTabMyCrad' a:if="{{hasJoin}}">...</view>
也就是把微信的语法转换为目标小程序的语法结构。


*.js 的处理部分代码如下,源代码script.js


function convert(jsText, isWpy) {
  return jsText
    .replace(/(require\(['"])(\w+)/g, '$1./$2')
    .replace(/(from\s+['"])(\w+)/g, (match, p1) => {
      // 相对路径以./开头
      return match.replace(p1, [p1, isWpy ? '' : './'].join(''));
    })
    .replace(/\.properties/g, (match) => {
      return match.replace('.properties', '.props');
    })
    .replace(/Component\([\s\S]+methods:[^{]*{/, (match) => {
      return [
        match,
        `,\r\ntriggerEvent: function(name, opt) {
            this.props['on' + name[0].toUpperCase() + name.substring(1)]({detail:opt});
          },\r\n`
      ].join('');
    })
    .replace(/[\s\S]+/, (match) => {
      // 只处理组件
      if (!match.match(/Component\(/)) return match;
      ... 省略
    });
}
module.exports = convert;


通过对组件的处理如图:



这么转换的目的也就是原文中开源|wwto:小程序跨端迁移解决方案——微信转其他小程序 提到的 :支付宝小程序组件的生命周期函数与微信小程序完全不一样,也没有一一对应的关系。这种情况无法使用简单的方法名正则替换,本方案是注入支付宝小程序组件的生命周期函数,在这些生命周期函数中在调用微信小程序的生命周期函数,这样以来就避免了方法名替换无法一一对应的问题,也能更方便地书写适配代码。


对 *.json 以及 *wxss 的处理就不列出代码了,可看源码: json.jswxss.js

相关文章
预约按摩小程序开发,为什么很多上门按摩平台根本招聘不到优秀技师?
上门按摩平台面临招不到优秀技师的问题,主要原因是平台众多,技师选择多样。为解决此问题,平台可引入技师等级制度,根据订单数量和好评率划分高、低等级技师。高等级技师可享受70%-90%的高提成及首页推荐,这不仅能激励技师的积极性,还能帮助平台筛选出优质技师,提升服务质量和口碑,形成良性循环。
|
5天前
|
人工智能 安全 机器人
LangBot:无缝集成到QQ、微信等消息平台的AI聊天机器人平台
LangBot 是一个开源的多模态即时聊天机器人平台,支持多种即时通信平台和大语言模型,具备多模态交互、插件扩展和Web管理面板等功能。
306 14
LangBot:无缝集成到QQ、微信等消息平台的AI聊天机器人平台
|
7天前
|
人工智能 开发框架 机器人
AstrBot:轻松将大模型接入QQ、微信等消息平台,打造多功能AI聊天机器人的开发框架,附详细教程
AstrBot 是一个开源的多平台聊天机器人及开发框架,支持多种大语言模型和消息平台,具备多轮对话、语音转文字等功能。
2070 13
AstrBot:轻松将大模型接入QQ、微信等消息平台,打造多功能AI聊天机器人的开发框架,附详细教程
|
4月前
|
JSON 小程序 JavaScript
uni-app开发微信小程序的报错[渲染层错误]排查及解决
uni-app开发微信小程序的报错[渲染层错误]排查及解决
967 7
|
4月前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
924 1
|
5天前
|
人工智能 小程序 程序员
【视频测评 DEMO 参考】VSCode 神级 AI 插件通义灵码:完全免费+实战教程+微信贪吃蛇小程序
VSCode 神级 AI 插件通义灵码:完全免费+实战教程+微信贪吃蛇小程序
97 7
|
12天前
|
存储 小程序 前端开发
微信小程序与Java后端实现微信授权登录功能
微信小程序极大地简化了登录注册流程。对于用户而言,仅仅需要点击授权按钮,便能够完成登录操作,无需经历繁琐的注册步骤以及输入账号密码等一系列复杂操作,这种便捷的登录方式极大地提升了用户的使用体验
129 12
|
23天前
|
存储 缓存 关系型数据库
社交软件红包技术解密(六):微信红包系统的存储层架构演进实践
微信红包本质是小额资金在用户帐户流转,有发、抢、拆三大步骤。在这个过程中对事务有高要求,所以订单最终要基于传统的RDBMS,这方面是它的强项,最终订单的存储使用互联网行业最通用的MySQL数据库。支持事务、成熟稳定,我们的团队在MySQL上有长期技术积累。但是传统数据库的扩展性有局限,需要通过架构解决。
63 18
|
1月前
|
移动开发 开发框架 小程序
轻松搭建婚恋交友系统源码,H5/小程序/APP自动适配,智能匹配恋爱交友平台快速落地
婚恋交友系统涵盖在线交友、线下活动、专业服务、社交娱乐等,满足用户多样化需求。系统设计简洁易用,提供实名认证、多注册方式及安全保护,确保用户隐私和数据安全。功能丰富,支持图文展示、筛选匹配、聊天互动、虚拟礼物等,提升互动趣味性。平台可分类管理用户、审核信息、智能推荐,优化用户体验。基于TP6+Uni-app框架,实现跨平台同步,支持二次开发,适应不同市场需求。 [了解更多](https://gitee.com/multi-customer-software/jy)
|
29天前
|
JSON 小程序 JavaScript
原生微信小程序笔记完整总结
原生微信小程序笔记完整总结
43 1

热门文章

最新文章