经常会有朋友问我:如果一个小程序项目要长期维护,技术上到底应该押注原生,还是选个框架?我的回答往往不是直接给答案,而是反问一句:“你是打算做半年,还是打算做三五年?”
这个问题的起因,是我自己在维护一个跨端小程序项目时,从微信原生写法迁到了 mpx,然后一直用了很久。说实话,mpx 在社区里不算最吵的那个框架,没有铺天盖地的教程,也没有天天更新的热搜标题。但它有一个很奇特的标签,就是“一旦用习惯,就不太想换”。
这不是什么玄学。我后来仔细想过,mpx 真正解决的问题,不是帮你把一次开发变成多个小程序端上线,而是它把“原生小程序开发”这个长期重复的过程,变得可拆分、可复用、可维护。换句话说,它会让一个团队愿意长期围绕它沉淀代码和流程。这篇文章,我想围绕“用一辈子 mpx”这件事,说说我的理解、踩过的坑,以及哪些场景适合真的长期用,哪些场景其实不必坚持。
1. 先搞清楚 mpx 到底解决了哪类问题
很多人在评估 mpx 时,习惯先问“它和 Taro、uni-app 比怎么样”,或者“它是不是又一个把 React/Vue 编译成小程序的框架”。这种问法一开始就偏了。
1.1 原生小程序开发里的重复劳作
如果你长期写过原生小程序,会发现一个很直接的痛点:页面和组件不好组织。微信原生的小程序有Page、Component,但页面逻辑和组件逻辑的写法是割裂的,组件通信、数据监听、跨页数据同步都要自己搭一套。更麻烦的是,当项目从单个微信端扩到支付宝端、百度端、字节端时,同样的页面结构要在不同平台各写一份。
我遇到过最典型的情况是:微信端已经上线了活动页,老板说要快速出一版支付宝小程序。当时为了赶时间,直接把微信小程序的代码复制过去,然后改标签、改 API、改样式兼容。结果光是wx.setStorage改成my.setStorage这类替换,就花掉了两个晚上,后面还漏了几处,导致线上 bug。
这种重复劳动看起来很零散,本质上却是整个开发流程缺少抽象层。
1.2 mpx 不是把 React/Vue 带进来,而是把原生语法增强
mpx 给我的第一印象,是它不像一个“重新发明小程序”的框架。它仍然使用原生小程序的标签、样式和大部分生命周期,但它把 Vue 风格里好用的一部分能力,比如响应式数据、计算属性、监听器、组件化,用增强的方式融入了.mpx文件里。
一个常见.mpx文件的结构大概是这样的:
<template> <view class="item"> <text>{{ name }}</text> <button bindtap="handleTap">点击</button> </view> </template> <script> import { createComponent } from '@mpxjs/core' createComponent({ data: { name: 'mpx' }, computed: { nameText() { return '当前:' + this.name } }, methods: { handleTap() { this.name = 'mpx 已点击' } } }) </script> <style scoped> .item { padding: 20rpx; } </style>第一次看到这种写法,很多人的反应是“这不就是 Vue 吗?”其实并不完全一样。mpx 的编译目标依然是各平台原生小程序,你写的东西最终会生成对应平台的页面和组件。它更像是在原生语法之上加了一层能力层,让你组织代码的速度更快,又不至于完全脱离平台本身。
1.3 它真正改变的是工作流的可维护性
从长期角度看,mpx 最大的价值不是编译速度多快,也不是运行体积多小,而是让团队可以把页面、组件、数据层、跨端差异管理成一套持续演进的工程。
举个例子。在没有框架的时候,一个业务组件可能散落在components目录里,然后被各个页面复制粘贴。有了 mpx 的单文件组件之后,组件逻辑、模板、样式被放在一起,问题定位和团队协作都简单很多。这种工作流上的变化,短期看不明显,一旦项目维护到三个月以上,差距就会拉开。
所以,如果你想评估 mpx,不要只看它“能不能多端复用”,更应该问:它能不能让你的团队在半年后改起代码来,仍然知道该去哪里改。
2. 从零开始:怎样把第一个 mpx 项目跑通
我见过不少人是被“跨端框架”这个词吓退的,觉得要配置一堆复杂的编译工具。其实如果只是搭一个最小项目,过程比想象中直接。
2.1 环境准备和最小项目结构
按照常见做法,首先需要一个 Node 环境,然后使用官方 CLI 或脚手架创建工程。不同版本创建命令可能会变,所以落地前最好先看当前官方文档,不要把网上搜到的命令直接复制进去。
工程创建完成后,你会看到类似下面的目录结构:
project-root ├── src │ ├── pages │ │ └── index │ │ ├── index.mpx │ ├── app.mpx │ └── store ├── static ├── package.json └── mpx.config.js这里app.mpx是应用入口,负责全局配置和生命周期,pages/index/index.mpx是页面文件。相对于原生小程序,最大的变化是原来分散的.js、.wxml、.wxss、.json被整合到了一个.mpx文件里。
2.2 页面、组件和 store 的常见写法
页面文件写在.mpx里,用createPage创建;组件用createComponent;数据管理用 mpx 的createStore创建一个全局 store。
几个常见模块的关系可以这样理解:
createPage:负责页面维度的生命周期、事件、数据和计算属性。createComponent:负责组件维度的逻辑,可以接收外部传入的属性。createStore:负责跨页面、跨组件的共享数据,比如用户信息、购物车、配置数据。
从实际开发体验看,mpx 的 store 和 Vuex 的用法比较接近。你可以在 store 里定义state、getters、mutations、actions,然后在页面或组件的computed里读取。这种模式的好处是:数据从哪里来、到哪里去,有迹可查,而不是散落在全局变量里。
2.3 第一次构建和查看输出
在常见工程里,执行构建命令后,框架会把你写的.mpx文件编译成各平台原生代码。第一次构建完成后,不要急着写业务,先打开开发者工具,看看生成后的页面能不能正常渲染,数据绑定是否正确,控制台有没有警告。
这里有一个非常重要的习惯:单次跑通只是开始。你要确认的不是“页面出来了”,而是“编译产物里有没有多余的代码、有没有平台不兼容的 API、不同端的输出差异是否在你的预期范围内”。之后再做正式的业务开发才会顺一些。
提醒:不要一上来就把项目做成一套代码全端上。第一步先在微信端跑通,再加入其他端。
3. 跨端能力的使用边界:一套代码不等于零差异
mpx 最吸引人的卖点当然是跨端,但真正长期用下来,我发现“一套代码跑多端”更像是一个可管理的抽象,而不是一个无脑的承诺。
3.1 平台差异会永远存在
微信有wx.login,支付宝有my.login,抖音有tt.login;不同平台的分享逻辑、支付逻辑、路由跳转方式都有自己的限制。mpx 能做的是帮你抹平一部分通用能力,但它没法替平台做商务审核,也没法让一个不存在的组件在某端凭空出现。
在实际项目里,我一般会把平台差异抽象成接口层。比如需要获取登录凭证时,先统一封装一个auth.js,内部通过条件编译或环境标识去调用对应平台的 API,业务代码只依赖这个统一方法。
3.2 条件编译是跨端开发的关键工具
mpx 支持类似条件编译的写法,让你在同一个文件里为不同平台写不同代码。这个能力非常好用,但也很容易被滥用。
最常见的错误是:在页面里到处写if (isWeixin) ... else if (isAlipay) ...,最后代码变得像一团毛线。更合理的做法是:
- 把平台差异封装成小模块。
- 在模块内部使用条件编译或平台判断。
- 外部业务保持统一。
举个例子,一个支付方法可以统一暴露为pay(params),内部再根据平台去走微信支付或支付宝支付。这样即使以后新增一个平台,你只需要扩展支付模块,而不是去改所有业务页面。
3.3 原生组件和第三方库的取舍
mpx 允许沿用各平台原生的组件和第三方 SDK。这种兼容性很有用,但要注意:不是所有原生组件都能在编译后完美适配其他平台。你用了微信专属的open-data,在支付宝端大概率要另想办法。所以,在选择第三方组件或服务时,要优先选那些本身就支持多端的,否则“跨端”会变成一句空话。
长期维护时,我会维护一个“跨端能力检查表”,把每一期用到的平台 API 都列出来,标记哪些是通用的、哪些是仅有某端支持的,以及是否有替代方案。这个表格的价值,会在项目上线后遇到用户反馈问题时体现出来。
4. 长期使用中,最容易拖垮项目的三个地方
跑通项目容易,长期维护难。我见过不少项目在早期开发速度很快,三个月后却越改越乱。在 mpx 这类跨端框架里,尤其要提前关注下面三个地方。
4.1 数据响应式的更新策略
mpx 提供响应式数据,但它并不是魔法。当数据层级很深、变更很频繁时,如果所有变化都触发视图刷新,性能就会出问题。长期项目里,数据量会越来越大,页面会越来越重,不能等到用户抱怨卡顿再去优化。
我的建议是:
- 把数据按“局部与全局”分开,不是所有状态都丢进 store。
- 列表数据尽量做好分页,不要一次性渲染几千条。
- 当你发现同一份数据在多个地方被反复操作时,先考虑是否需要对数据做归一化,而不是继续堆散落的状态。
从经验看,80% 的性能问题都出现在“数据更新路径不清晰”上,而不是框架本身不够快。
4.2 页面级 store 与全局状态的边界
mpx 的 store 可以管理全局数据,但具体实践里,我会做三个维度拆分:
- 全局数据:用户信息、登录状态、系统配置,这类数据几乎每个页面都会用到。
- 页面数据:当前页面独有的列表、筛选条件、表单内容,没必要放到全局 store。
- 组件数据:按钮加载状态、组件内部展开项,停留在组件内部即可。
如果一上来把所有数据都放到全局 store,页面之间的耦合会越来越重,改一个页面可能要连带测试好几个模块。这不是框架的问题,而是状态设计的问题。
4.3 长列表、图片、页面栈这些常见性能点
在小程序端,长列表和图片缓存是最常见的性能瓶颈。mpx 项目里同样要遵守一些基本原则:
- 图片要按网络环境做压缩和占位,不要直接加载原图。
- 长列表用分页,搭配
recycle-list或虚拟列表类方案时要先验证平台兼容性。 - 页面栈不要越开越深,完成流程后要及时
navigateBack或重定向。
这些听起来像是基础常识,但长期维护的项目,最容易出问题的地方往往就是这些基本功。
排查性能问题,先看网络请求、再看图片体积、最后看数据刷新频率,而不是一开始就怀疑框架。
5. 遇到问题怎么办:一套适合 mpx 项目的排查链路
不管用什么框架,技术问题的排查思路其实是相通的。但 mpx 因为多了一层编译,出现问题时容易让人有点懵。我整理了一套自己的排查顺序,供你参考。
5.1 先分现象
遇到错误时,先判断它属于下面哪一类:
- 编译错误:构建过程直接报错,或者产物格式异常。
- 运行时报错:页面打开后控制台有报错,部分功能不生效。
- 样式错乱:编译通过、能运行,但样式和预期不一致。
- 真机差异:开发者工具正常,真机上异常。
- 跨端差异:微信端正常,支付宝端异常。
把问题分类,可以快速缩小范围。
5.2 再查依赖、构建产物和平台环境
如果是编译或运行时报错,按这个顺序排查:
- 看项目依赖版本是否匹配。跨端框架升级后,部分编译配置可能不兼容。
- 看编译后的产物,确认生成的原生代码有没有明显异常。
- 看开发者工具的具体报错堆栈,定位到
src下的哪个文件。 - 看平台环境,微信端、支付宝端、开发者工具版本是否都满足要求。
我最常用的方法是:先在开发者工具里清缓存、重新编译,如果仍然报错,就把产物文件打开看。很多时候问题不是写在你的.mpx文件里,而是编译过程中某个平台特性没被正确转换。
5.3 平台差异问题,用条件编译隔离
如果同一个功能在微信端正常、支付宝端异常,通常不是框架的 bug,而是平台能力差异。这时不要为了统一而掩盖差异,而是直接找到差异点,用条件编译把它隔离出来。
例如,某个分享方法在微信端有额外参数,在支付宝端可能完全不存在。你就可以在这个模块内部写好两个平台各自的实现,业务代码再继续调用同一个方法。
5.4 把常见坑点沉淀成团队文档
长期项目最容易犯的错,是每次踩同一个坑。我建议团队整理一份“mpx 项目踩坑清单”,包含以下几个栏目:
- 现象:报错信息或异常表现。
- 原因:是依赖版本、平台差异、数据更新,还是组件封装问题。
- 处理:当时怎么解决的。
- 预防:以后要怎么避免。
这样整理一个月之后,大部分常见问题都能在五分钟内定位到。这也是“用一辈子 mpx”这件事真正有价值的体现:你积累的不是某一句代码技巧,而是一整套围绕这个框架的项目知识。
6. 到底什么样的人适合“用一辈子 mpx”
聊到最后,回到最初的问题:mpx 真的值得“用一辈子”吗?我的判断是:它不是适合所有人,但如果匹配到合适的场景,长期使用的收益会非常高。
6.1 适合用 mpx 的团队和项目
以下情况通常适合长期用:
- 项目主要围绕小程序,并且是多端需求,不是只做微信端。
- 团队成员更熟悉原生小程序或 Vue 风格写法,不希望切换学习跨度太大的框架。
- 项目周期长,页面、组件、状态管理需要一套清晰的工程规范。
- 你们愿意维护一套围绕框架的组件库和公共模块,而不是每次新建页面都从零开始。
在这些场景里,mpx 的价值会随着时间累积。越到后期,公共组件、业务模块、跨端适配方案越完善,开发新页面的成本越低。
6.2 不适合用 mpx 的情况
反过来,如果你只是做一个一次性活动页,或者团队里所有人都是 React 技术栈,又或者你对框架的生态热度非常敏感,那么 mpx 可能不是最优选择。倒不是 mpx 不好,而是它需要团队愿意投入时间建立工程规范。如果一个项目只有两个星期的周期,用原生或更熟悉的方案反而更直接。
另外,如果团队完全没有原生小程序经验,也是需要考量的点。mpx 虽然简化了很多东西,但一些底层概念仍然来自原生小程序。如果你连Page、Component、setData是什么都不了解,直接上手 mpx,遇到问题会很难排查。
6.3 我建议的决策路径
如果你想长期用 mpx,但又拿不准,可以参考这样一个决策路径:
- 先用原生小程序写一个最小页面,感受平台能力。
- 再用 mpx 把这个页面重写一遍,对比代码组织方式。
- 列出团队接下来一年可能遇到的多端需求。
- 如果发现平台差异是自己的主要痛点,mpx 大概率合适。
- 用小规模项目试点一个迭代,再决定是否全面投入使用。
不要一开始就押注“技术一定要选最火的”,而是要选“愿意长期维护、边界清晰、团队能承接”的。mpx 在这条路上的优势,不是短期的热度,而是长期的稳定和可控。
结尾
我总跟朋友说,技术选型最怕的不是选错,而是选的时候没有想清楚“要跟这个方案相处多久”。mpx 这个名字,在社区里不算光芒万丈,但真正长期用它的人,往往会有一种“越用越顺手”的感觉。因为它的设计思路是贴着原生的土壤长出来的,你每积累一个组件、一条跨端适配经验、一份踩坑文档,都是在给后续项目加杠杆。
所以,如果你想试 mpx,别急着问“它能不能跑多端”,先问自己:“我有没有准备好围绕它建立一套长期维护的工程习惯?”如果答案是肯定的,那它值得成为你项目中长期存在的那层基础。