一、升级前的准备工作
不管是搭房子还是改代码,提前准备总不会错,升级Taro也是一样。很多人上来就直接改配置,结果改到一半发现依赖不兼容、业务逻辑跑不通,最后只能回滚,反而浪费时间。
1.1 先搞清楚当前项目的真实情况
首先得确认你现在用的Taro版本是多少,别稀里糊涂升级。打开项目里的package.json文件,找devDependencies里的@tarojs/cli,后面的版本号就是当前版本。比如你看到的是"@tarojs/cli": "^2.2.0",那就是Taro 2.x的版本。
然后要列清楚项目里用到的所有依赖,包括Taro全家桶的其他包,比如@tarojs/components、@tarojs/taro,还有第三方的UI库、插件,比如vant-weapp、taro-ui这些。可以用下面这个命令,把所有依赖导出来看:
# 导出当前项目的依赖列表,方便后续检查兼容性
npm list --depth=0 > dependencies.txt
1.2 确认目标版本的兼容性
Taro 3对很多旧的依赖不兼容,比如Taro 2专属的taro-ui 2.x版本,就不能直接在Taro 3里用。所以你得先去查每个依赖的官方文档,看它有没有支持Taro 3的版本。如果某个依赖已经没人维护了,找不到兼容版本,那你就得提前想好替换方案,比如换个功能类似的新库。
举个例子,假设你原来用的是taro-ui 2.2.0,这个版本只支持Taro 2,那你就得换成taro-ui 3.x的版本,而且要注意,taro-ui 3的组件API和2.x有不少变化,比如原来的Button组件的type属性,可能多了新的取值,或者有些旧属性被移除了。
二、升级过程中的常见坑点及解决方法
准备工作做完了,就可以开始升级了。升级的时候最容易踩坑,我把大家遇到最多的坑整理出来,每个坑都给你说清楚怎么解决。
2.1 配置文件的坑:从config/index.js到config/index.ts的变化
Taro 2的配置文件是config/index.js,用的是CommonJS的语法,也就是module.exports的写法。但Taro 3默认推荐用config/index.ts,而且配置项的结构变了很多。
坑点1:配置项的命名和位置变化
比如Taro 2里用来配置小程序AppID的appid,在Taro 3里放到了miniprogram.appid的位置;还有原来的plugins数组,在Taro 3里要放到compilerPlugins或者webpack配置里。
给你看个对比的例子,先看Taro 2的配置片段:
// Taro 2的config/index.js片段
module.exports = {
projectName: 'my-project',
date: '2023-01-01',
designWidth: 750,
deviceRatio: {
640: 2.34 / 2,
750: 1,
828: 1.81 / 2
},
sourceRoot: 'src',
outputRoot: 'dist',
plugins: [],
defineConstants: {
},
copy: {
patterns: [
],
options: {
}
},
weapp: {
appid: 'wx1234567890', // Taro 2的小程序AppID配置
projectName: 'my-project'
},
h5: {
publicPath: '/',
staticDirectory: 'static',
postcss: {
autoprefixer: {
enable: true
}
}
}
}
再看Taro 3对应的配置片段:
// Taro 3的config/index.ts片段
import { defineConfig } from '@tarojs/cli'
export default defineConfig({
projectName: 'my-project',
designWidth: 750,
deviceRatio: {
640: 2.34 / 2,
750: 1,
828: 1.81 / 2
},
sourceRoot: 'src',
outputRoot: 'dist',
defineConstants: {
},
// Taro 3的插件配置,和Taro 2的位置不一样
plugins: [],
// 小程序专属配置
mini: {
appid: 'wx1234567890', // Taro 3的小程序AppID,放到mini下
projectName: 'my-project'
},
// H5专属配置
h5: {
publicPath: '/',
staticDirectory: 'static',
postcss: {
autoprefixer: {
enable: true
}
}
}
})
坑点2:config/index.js转成TS的问题
如果你不想用TS写配置,也可以保留config/index.js,但要注意语法,不能再用CommonJS的module.exports,要改成ES模块的export default,而且要导入defineConfig函数。比如:
// Taro 3保留config/index.js的写法
const { defineConfig } = require('@tarojs/cli')
module.exports = defineConfig({
// 配置内容和上面的TS版本一样
})
2.2 组件和API的坑:语法和用法的变化
Taro 3的组件和API和Taro 2有很多不同,最常见的就是生命周期的变化、API的调用方式变化。
坑点1:生命周期的变化
Taro 2里的很多页面生命周期,在Taro 3里被调整了。比如原来的onReady,在Taro 3里还是保留,但原来的onLoad,在Taro 3的React组件里,要放到useEffect里来模拟;还有原来的onPullDownRefresh,在Taro 3里的写法也有变化。
给你举个例子,原来Taro 2的页面组件是这样的:
// Taro 2的页面组件,类组件写法
import Taro, { Component } from '@tarojs/taro'
import { View } from '@tarojs/components'
class Index extends Component {
// 页面加载时触发,获取参数
onLoad(options) {
console.log('页面参数:', options)
this.loadData(options.id)
}
// 自定义方法,加载数据
loadData(id) {
Taro.request({
url: `https://api.example.com/data/${id}`
}).then(res => {
this.setState({ data: res.data })
})
}
render() {
return <View>页面内容</View>
}
}
export default Index
在Taro 3里,如果你用函数组件(现在更推荐的写法),原来的onLoad要改成这样:
// Taro 3的页面组件,函数组件写法
import Taro, { useEffect, useState } from '@tarojs/taro'
import { View } from '@tarojs/components'
function Index() {
const [data, setData] = useState(null)
// 模拟Taro 2的onLoad生命周期
useEffect(() => {
// 获取页面参数,Taro 3的getCurrentInstance可以拿到实例和参数
const instance = Taro.getCurrentInstance()
const options = instance.router.params
console.log('页面参数:', options)
loadData(options.id)
}, []) // 空数组表示只在组件挂载时执行一次,和onLoad的时机一致
// 自定义方法,加载数据
const loadData = (id) => {
Taro.request({
url: `https://api.example.com/data/${id}`
}).then(res => {
setData(res.data)
})
}
return <View>页面内容</View>
}
export default Index
这里要注意,Taro 3的getCurrentInstance是获取页面实例的方法,用来拿到路由参数,这个和Taro 2的用法不一样,很多人升级后会在这里踩坑,导致拿不到页面参数。
坑点2:API的调用方式变化
有些Taro 2的API,在Taro 3里被移除或者改了名字。比如原来的Taro.uploadFile,在Taro 3里还是保留,但原来的Taro.previewImage,在Taro 3里的参数格式有变化;还有原来的Taro.getSystemInfo,在Taro 3里要改成Taro.getSystemInfoSync或者用异步的Taro.getSystemInfo,不过这个变化不大。
再比如原来Taro 2里的setNavigationBarTitle,在Taro 3里还是可以用,但要注意,如果你在函数组件里用,要确保是在页面组件里调用,不能在子组件里随便调用,否则可能不生效。
2.3 依赖冲突的坑:版本不兼容导致的报错
升级的时候最常见的就是依赖冲突,比如你升级了@tarojs/cli到3.x,但@tarojs/components还是2.x的版本,就会出现各种报错,比如“找不到某个组件”、“方法未定义”等等。
坑点1:Taro全家桶的版本要统一
Taro全家桶的所有包,比如@tarojs/cli、@tarojs/taro、@tarojs/components、@tarojs/webpack-runner这些,版本必须一致,都要升级到3.x的同一个大版本。比如你升级了@tarojs/cli到3.6.0,那其他所有Taro相关的包都要升级到3.6.0。
可以用下面的命令,一次性升级所有Taro相关的依赖:
# 升级Taro全家桶到指定的3.x版本,比如3.6.0
npm install @tarojs/cli@3.6.0 @tarojs/taro@3.6.0 @tarojs/components@3.6.0 @tarojs/webpack-runner@3.6.0 --save-dev
坑点2:第三方依赖的兼容问题
除了Taro全家桶,第三方依赖比如UI库、插件,也要升级到兼容Taro 3的版本。比如原来的vant-weapp 1.x版本,要升级到vant-weapp 2.x以上的版本,因为vant-weapp 1.x不支持Taro 3。
再比如原来的taro-plugin-xxx插件,很多旧版本的插件都是为Taro 2写的,升级后要找到对应的Taro 3版本,或者找替代的插件。如果找不到兼容的插件,你就得自己改插件的代码,或者换个实现方式。
比如原来你用了一个Taro 2的插件,用来自动生成路由,升级后这个插件不兼容,你可以换成Taro 3官方的@tarojs/plugin-routes插件,用法差不多,但配置不一样。
三、平稳过渡的迁移路线
升级不能一蹴而就,尤其是大项目,直接全量升级风险太大,最好是分步骤来,平稳过渡。
3.1 分模块升级,逐个验证
不要一次性把所有代码都改完,最好是分模块升级,比如先升级登录模块,验证没问题了,再升级商品模块,这样即使出问题,也能快速定位。
具体做法是,把项目里的页面分成几个模块,比如用户模块、商品模块、订单模块,先选一个相对简单的模块,比如用户模块,把这个模块的代码改成Taro 3的写法,然后运行项目,测试这个模块的所有功能,确保没问题了,再升级下一个模块。
3.2 双版本并行,逐步替换
如果项目特别大,分模块升级也有风险,你可以考虑双版本并行的方案。具体来说,就是在项目里同时保留Taro 2和Taro 3的代码,比如把Taro 3的代码放到src-taro3目录下,然后配置两个打包命令,一个打包Taro 2的版本,一个打包Taro 3的版本。
然后你可以逐步把src目录下的代码,复制到src-taro3目录下,改成Taro 3的写法,同时测试Taro 3的版本,直到所有模块都改完,再把src目录换成src-taro3的代码,彻底切换到Taro 3。
3.3 测试验证,覆盖所有场景
不管用哪种升级方式,测试都是必不可少的。升级后要覆盖所有的场景,包括页面跳转、数据请求、表单提交、第三方登录、支付、分享等等,还要测试不同的平台,比如小程序、H5、APP,确保每个平台都能正常运行。
你可以写一个测试清单,把所有要测试的场景列出来,每测试完一个就打勾,避免遗漏。比如:
- 测试登录功能:输入正确账号密码能登录,输入错误能提示
- 测试商品列表:能正常加载,下拉刷新能更新,上拉加载更多能正常显示
- 测试页面跳转:从商品列表跳转到商品详情,参数能正常传递
- 测试分享:点击分享按钮,能正常分享到微信好友
四、升级后的优化和注意事项
升级完成后,不是就结束了,还要做一些优化,避免后续出问题。
4.1 优化项目配置
升级后,你可以根据Taro 3的新特性,优化项目的配置。比如Taro 3支持新的编译器,比如webpack 5,你可以配置webpack 5来提升打包速度;还有Taro 3支持代码分割,你可以配置代码分割,减少首屏加载时间。
4.2 注意后续的依赖更新
升级完成后,后续更新依赖的时候,要注意版本的兼容性,不要随便升级某个依赖,尤其是Taro全家桶的包,升级前要先查官方文档,看有没有不兼容的变化。
比如你要升级@tarojs/cli到3.7.0,要先看官方的更新日志,看有没有 breaking change,比如某个API被移除了,某个配置项变了,然后再决定要不要升级。
4.3 积累升级经验,避免踩坑
升级过程中遇到的问题,要记录下来,比如某个坑的解决方法,某个依赖的兼容版本,这样下次升级其他项目的时候,就能快速解决问题。
五、应用场景、优缺点分析
5.1 应用场景
Taro 3的升级,适合所有还在使用Taro 2及更早版本的项目,尤其是那些需要用到Taro 3新特性的项目。比如:
- 项目需要支持新的小程序API,比如微信小程序的云开发、小程序插件
- 项目需要提升打包速度,Taro 3的打包速度比Taro 2快很多
- 项目需要支持新的框架,比如Vue 3、React 18
- 项目需要维护,旧版本的Taro不再维护,有安全风险
5.2 升级的优缺点
优点
- 性能提升:Taro 3的打包速度更快,运行时性能更好,页面加载更快
- 特性更多:支持新的API、新的框架、新的编译器,功能更强大
- 维护更好:Taro 3还在持续更新,有问题能得到官方的支持,旧版本的Taro不再维护,出问题没人管
- 生态更好:新的第三方依赖、插件都是基于Taro 3开发的,生态更丰富
缺点
- 升级成本高:大项目升级需要花费很多时间和精力,尤其是代码多、依赖复杂的项目
- 有风险:升级过程中可能会出现各种问题,比如功能跑不通、性能下降
- 学习成本:要学习Taro 3的新特性、新的写法,比如新的生命周期、新的API
5.3 注意事项
- 升级前一定要做好备份,比如用git提交代码,万一升级失败,能快速回滚
- 升级过程中要小步迭代,不要一次性改太多代码,方便定位问题
- 测试要全面,覆盖所有场景和平台,确保升级后项目能正常运行
- 不要盲目升级,如果项目运行正常,没有特殊需求,也可以暂时不升级
六、总结
从Taro早期版本升级到Taro 3,是一个需要提前准备、小心操作的过程,最关键的是要提前了解坑点,制定合理的迁移路线,分步骤验证,避免一次性全量升级带来的风险。升级过程中遇到问题不要慌,先查官方文档,再查社区的解决方案,实在不行就回滚,重新调整升级方案。升级完成后,项目能获得更好的性能、更多的特性,也能得到更好的维护,长期来看是值得的。
评论
围绕“从Taro早期版本升级到Taro 3的常见坑点及平稳过渡策略与迁移路线详解全流程实践指南与最佳方法分析应用过程详解”参与讨论