Skip to content

从原生小程序向 VueMini 迁移

由于不需要多端扩展和多小程序扩展,目标平台只有微信小程序,我们的小程序从创建之初就用的原生小程序。随着需求越来越复杂,我也被原生小程序的简陋折磨得有点力不从心,于是考虑迁移到 Taro。

考察了一遍 Taro,发现在 Taro 中安装 vant weapp 有点费劲,就算迁移成功,也不能使用 Taro Vue 的双向绑定。这我图啥。如果不用 vant,就得将全部页面上的 vant 组件换到 nutUI,这更费劲了。

然后考察 VueMini,发现这东西很轻量,它只接管 js 部分,让小程序的 wxs 可以使用 Vue 的响应式语法,而且还支持 Pinia。由于没有动模板部分,所以还能像之前一样使用 vant。这简直太适配了!说干就干。

这里是 VueMini的文档。

前期准备

先进行创建项目等前期准备,启动好页面后,将 Vant 先引入。

sh
pnpm i @vant/weapp -S --production

除此之外还需要安装其它的 npm 包。

甚至不需要在开发者工具中处理 npm 构建。VueMini 会自动在 dist 目录中创建一个 miniprogram_npm,并把依赖处理好。

然后是 app.json 里的 usingComponents,直接把之前的完整复制过去就可以了。

接下来是除了 pages 之外的其它目录,主要是 api 和 utils。由于原生小程序引入模块使用的是 require,而 VueMini 用的是 import from,所以需要处理一下模块的导出。

js
export default {
    a: () => {},
    b: 123
}

这样的模块需要改为

js
export const a = () => {}
export const b = 123

这样是为了在导入的时候可以

js
import { a, b } from 'some_package.js'

处理好了除了 pages 之外的目录,启动项目,看看能不能正常启动。

迁移页面

由于 VueMini 支持 html、wxml 作为页面文件,小程序天然支持 scss、wxss、js 文件,所以整个 pages 目录都可以完整复制过去。然后将 app.jsonpages 也完整复制过去。接下来就只剩下最后也是最复杂的工作了 —— 迁移 js。

js 是变化最大的部分,也是本次迁移的目标。原生小程序使用类似 Vue 的选项式 api,VueMini 使用 Vue3 的组合式 api。我先自己手动迁移了一个最大的 js 文件,然后总结了 8 条规则告诉 Gemini:

1. data 中的全部使用 ref 定义变量

2. 所有方法都换成 const funcName = () => {} 的形式

3. 所有 data 和 方法都在 setup 中 return

4. 所有 this.data.propName 都变成 propName.value

5. 所有 this.funcName() 都变成 funcName()

6. 生命周期钩子按这篇文档换一下:https://vuemini.org/guide/page.html#%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F

7. 顶部导入,const require 变成 import

8. 生命周期有一个例外:`onLoad`。`onLoad` 的代码直接写在 `setup` 里,`onLoad(options)` 的 `options` 就是 `setup(query)` 的 `query`。为了规定一个统一的位置,onLoad 的代码就放在 return 上面吧。

然后将 js 一个一个喂给 Gemini,再一个一个页面重新测试了一遍。终于用两天的时间重构完了整个项目。

遗留问题

  1. 忘了告诉 Gemini 一个事情,就是涉及分享朋友圈和好友消息的页面,需要在 setup 的第二个参数里设置 canShareToOtherscanShareToTimeline。好在涉及分享的页面不多,遇到我就手动处理了。

  2. 还有就是 vant 的一些组件支持双向绑定,也就是使用 model:value,但 VueMini 是不支持的,所以需要手动处理一下。全部迁移完毕后,全局搜一下 model:value,发现只有两处,都手动处理了。

总结

迁移过程还算顺利,还有些功能点没测试到。准备在下次上线之前统一测试一遍。

最后更新于:

评论区
评论区空空如也
发送评论
名字
0 / 20
邮箱
0 / 100
评论内容
0 / 140
由于是非实名评论,所以不提供删除功能。如果你需要删除你发送的评论,或者是其他人的评论对你造成了困扰,请 发邮件给我 。同时评论区会使用 AI + 人工的方式进行审核,以达到合规要求。