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 包都能跨端。比如依赖 windowdocument 的库在小程序端直接报错,需要找替代方案或用 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 里基本修完了。

评论区

0 条评论

登录后可评论。

查看完整榜单
查看完整榜单
查看完整榜单