Taro 4 发布这一年,我拿它做了三个项目,聊聊真实的跨端体验
Taro 4 发布这一年,我拿它做了三个项目,聊聊真实的跨端体验
Taro 4 从 beta 到正式版已经跑了一年了。去年这个时候,Taro 4 Beta 刚出,我当时正被一个需求折腾得够呛——领导要求同一套代码同时跑微信小程序、H5,还要兼容鸿蒙。放以前这得三个团队各写一套,排期排到明年。用 Taro 4 试了试,一周搞定了原型,一个月上线。
到现在我拿 Taro 4 做了三个完整项目,有商城、有工具型小程序、还有企业内部管理系统。今天不吹不黑,把真实感受掰开揉碎聊一聊。
Taro 4 到底更新了啥
先说结论:Taro 4 最大的三个变化是支持鸿蒙、接入 Vite 编译、小程序编译模式。
做个速览对比:
| 维度 | Taro 3 | Taro 4 |
|---|---|---|
| 鸿蒙支持 | ❌ | ✅ 通过插件平台 |
| 编译工具 | Webpack 4/5 | Webpack + Vite 双引擎 |
| 小程序编译模式 | 运行时 + 编译 | 新增纯编译模式 |
| Node.js 要求 | >= 12 | >= 18 |
| 框架支持 | React / Vue / Nerv | 同上 + Preact / Svelte |
| 构建速度(H5) | 基线 | Vite 下快 3-5 倍 |
| 包体积优化 | 一般 | 鸿蒙端缩减 46% |
这表里最有意思的是 Vite 支持。很多人一听”Vite 编译小程序”就兴奋了,觉得终于不用等 Webpack 蜗牛爬了。但实际用下来——Vite 对小程序端的好处有限。原因很简单:小程序的运行环境不支持 ESM,你本地再怎么 no-bundle,最后还是得打包成 CommonJS 塞进去。Vite 真正的优势在 H5 端,开发体验确实是质的飞跃。
鸿蒙适配:不是噱头,但也不是无痛
先上代码,看看怎么在 Taro 4 里开发鸿蒙应用:
# 安装 Taro 4 CLI
npm i -g @tarojs/cli@latest
# 创建项目
taro init myApp
# 选择编译工具:Vite(推荐)
# 选择框架:React
# 安装鸿蒙端插件
npm i @tarojs/plugin-platform-harmony-ets
然后在 config/index.ts 里配一下:
export default defineConfig({
projectName: 'my-harmony-app',
plugins: ['@tarojs/plugin-platform-harmony-ets'],
harmony: {
compiler: 'vite',
hapName: 'entry',
name: 'default',
projectPath: './harmony-project'
}
})
执行打包:
taro build --type harmony
就能在 dist/harmony 目录拿到一个完整的鸿蒙工程,用 DevEco Studio 打开直接编译运行。
实际体验如何? 说三点:
90% 的代码是共享的。页面逻辑、数据流、API 调用这些基本不用改。差异主要出在 UI 适配和原生能力调用上。
鸿蒙的 ArkUI 和 Web 标准确实有差异。举个具体例子,border-radius 在部分场景下的渲染不一致,需要加 overflow: hidden 兜底。这类问题大概占了适配工作量的 70%。
性能比预想中好。启动速度从 3.2s 降到 1.8s,包体积从 2.8MB 降到 1.5MB,这个数据在 4.1.0 版本里又优化了一轮。
有个数字值得注意:使用 Taro 4 开发鸿蒙应用,代码复用率能做到 85%-92%。这意味着如果你已经在用 Taro 做小程序,加一个鸿蒙端大概只需要多花 10%-15% 的工作量。
Vite 编译:H5 爽了,小程序别太期待
Taro 4 引入了 Vite 编译引擎,但得说清楚它的适用场景。
写个简单的计数器组件,对比一下两端的差异:
import { useState } from 'react'
import { View, Text, Button } from '@tarojs/components'
import './index.scss'
export default function Counter() {
const [count, setCount] = useState(0)
return (
<View className='counter'>
<Text className='count'>{count}</Text>
<Button onClick={() => setCount(c => c + 1)}>+1</Button>
<Button onClick={() => setCount(c => c - 1)}>-1</Button>
</View>
)
}
这代码在 H5、微信小程序、鸿蒙三端跑的都是一份。Vite 编译 H5 的时候,HMR 几乎是即时的,改代码保存到页面刷新 < 100ms。但切到小程序端编译,Vite 的 no-bundle 优势就消失了——小程序的 JS 必须打包成单文件,Vite 退化成单纯的转译工具。
实测构建速度对比(冷启动):
| 端 | Webpack 5 | Vite |
|---|---|---|
| H5 | 8.2s | 2.1s |
| 微信小程序 | 12.5s | 10.8s |
| 鸿蒙 | – | 3.5s |
小程序端 Vite 比 Webpack 快一点点,但远没有 H5 端那么惊艳。所以我的建议是:做 H5 为主的项目果断上 Vite,小程序为主的场景用 Webpack 也挺好。Taro 4 支持双引擎并存,按需切换,不用非此即彼。
多端统一的真实成本
说点没人爱听的。跨端开发的”一次编写,到处运行”从来不是免费的午餐,Taro 4 也一样。
我在第二个项目里踩过一个坑:scroll-view 组件在 iOS 微信小程序上有个惯性滚动的表现差异,需要加 enhanced={true} 才能对齐体验。类似这种端差异问题,三个项目下来我记录了大概 40 多个:
// 条件编译处理端差异
// #ifdef H5
import { setupGesture } from './h5-gesture'
// #endif
// #ifdef WEAPP
import { setupGesture } from './weapp-gesture'
// #endif
// #ifdef HARMONY
import { setupGesture } from './harmony-gesture'
// #endif
Taro 4 支持条件编译和 Taro.getEnv() 运行时判断,但我的经验是:能用条件编译解决的就不用运行时判断,后者会有额外的性能开销。
另外,不是所有 npm 包都能跨端。比如依赖 window、document 的库在小程序端直接报错,需要找替代方案或用 taro-plugin-html + 适配层来处理。这部分踩坑成本大概是总开发量的 15%-20%。
相比竞品,Taro 4 的优势在哪
做个简单的横向对比(2026 年中视角):
| 框架 | 多端覆盖 | 鸿蒙 | 框架灵活度 | 性能 | 生态成熟度 |
|---|---|---|---|---|---|
| Taro 4 | 10+ 端 | ✅ | React/Vue/Preact/Svelte | 中高 | ⭐⭐⭐⭐⭐ |
| uni-app 4 | 10+ 端 | ✅ | Vue 为主 | 中 | ⭐⭐⭐⭐ |
| React Native 0.78 | iOS/Android/Web | ❌ | React | 高 | ⭐⭐⭐⭐⭐ |
| Flutter 3.24 | iOS/Android/Web | ❌ | Dart | 高 | ⭐⭐⭐⭐ |
| Huawei ArkUI-X | 鸿蒙为主 | ✅ | 自研 | 高 | ⭐⭐⭐ |
Taro 4 最大的护城河是对中国小程序的极致覆盖——微信、支付宝、百度、字节、QQ、快手、飞书…整整 10+ 端。如果你做的是面向 C 端的小程序业务,尤其是要铺多个平台,Taro 几乎是没有替代选项的。
但如果你的业务主要是 iOS/Android 原生 App,追求极致性能,那 RN 或 Flutter 依然是更好的选择。Taro 4 在 RN 和 Web 端也在改进,但目前的重心还是小程序和鸿蒙。
总结
Taro 4 这一年走下来,我的评价是:它不完美,但它是当下中国跨端开发最务实的答案。
- 如果你要同时覆盖微信小程序 + 其他小平台 + H5,Taro 4 是最省力的方案
- 如果你有鸿蒙需求但不想单独招一个鸿蒙团队,Taro 4 是成本最低的入场券
- 如果你的迭代节奏快,希望 H5 端有丝滑的 HMR,Vite 模式值得切
版本建议:直接上 4.2.x 或最新稳定版,4.0 beta 的那些坑在 4.1 和 4.2 里基本修完了。
评论区
登录后可评论。












