# 🌱 Taro 从零到一(一):Taro 是什么 — 一套代码,多端运行 > **系列导读**:这是「Taro 从零到一」系列的第 1 篇。Taro 是京

5 阅读5分钟

🌱 Taro 从零到一(一):Taro 是什么 — 一套代码,多端运行

系列导读:这是「Taro 从零到一」系列的第 1 篇。Taro 是京东开源的多端开发框架, 用一套 React/Vue 代码同时生成微信小程序、支付宝小程序、H5、抖音小程序等多个平台应用。

本文目标:理解 Taro 的定位和原理,完成环境搭建,创建并运行第一个多端项目。


📊 Taro 速览

维度说明
🏢 出品方京东凹凸实验室(2018 年开源)
🎯 定位多端统一开发框架
📝 开发语言React + TypeScript(也支持 Vue 3)
📦 当前版本Taro 4.x
🌐 支持平台微信 / 支付宝 / 百度 / 抖音 / 飞书 / QQ / 京东 / 鸿蒙 / H5 / React Native
⭐ GitHub Star35k+

🧩 为什么选 Taro?

多端开发的痛点

传统做法:每个平台独立开发

微信小程序  → WXML + WXSS + WXS       → 团队 A
支付宝小程序 → AXML + ACSS + SJS       → 团队 B
H5网页      → HTML + CSS + JS          → 团队 C
抖音小程序  → TTML + TTSS + SJS        → 又要一个团队?

问题:
├── 各平台 API 不统一,学习成本高
├── 多套代码维护困难,改一个需求改三遍
├── 团队资源浪费严重
└── 各端体验难以统一

Taro 的方案

Taro 方案:一套代码,编译到多端

React/Vue + TypeScript
         │
    Taro 编译器
    ╱    │    ╲    ╲
微信   支付宝   H5   抖音 ...

优势:
├── 一套代码 → 多端产物
├── 标准 React/Vue 语法 → 零学习成本
├── 统一的 API 封装 → 屏蔽平台差异
└── 丰富的 UI 组件库(NutUI)

适合 Taro 的场景

场景推荐度原因
需要同时上多个小程序平台⭐⭐⭐⭐⭐Taro 的核心价值
小程序 + H5 共用一套代码⭐⭐⭐⭐⭐最常见的多端组合
已有 React 技术栈的团队⭐⭐⭐⭐上手成本最低
只做单一平台小程序⭐⭐原生开发可能更简单
重交互的游戏类应用小程序本身限制多

🛠 1. 环境搭建

前置要求

# 确认 Node.js 版本(需要 >= 16)
node -v   # v20.x.x

# 确认 npm 版本
npm -v    # 10.x.x

# 推荐使用 pnpm(可选)
npm install -g pnpm

安装 Taro CLI

# 全局安装 Taro CLI
npm install -g @tarojs/cli

# 验证安装
taro -v
# 👽 Taro v4.x.x

# 如果已安装旧版,升级到最新
npm update -g @tarojs/cli

创建项目

# 交互式创建
taro init my-taro-app

# 选择项目模板
# ➤ 请输入项目名称:my-taro-app
# ➤ 请输入项目介绍:我的第一个 Taro 应用
# ➤ 请选择框架:React
# ➤ 请选择 CSS 预处理器:Sass
# ➤ 请选择编译工具:Webpack5
# ➤ 请选择包管理工具:pnpm
# ➤ 请选择模板:默认模板

cd my-taro-app

📁 2. 项目结构解析

my-taro-app/
├── config/                       # 📂 编译配置
│   ├── index.ts                  # 主配置文件
│   ├── dev.ts                    # 开发环境配置
│   └── prod.ts                   # 生产环境配置
├── src/
│   ├── app.ts                    # 📄 应用入口(生命周期)
│   ├── app.config.ts             # 📄 全局配置(页面路由、TabBar)
│   ├── app.scss                  # 📄 全局样式
│   ├── index.html                # 📄 H5 模板
│   └── pages/                    # 📂 页面目录
│       └── index/
│           ├── index.tsx         # 页面组件
│           ├── index.config.ts   # 页面配置
│           └── index.scss        # 页面样式
├── project.config.json           # 微信小程序项目配置
├── project.tt.json               # 抖音小程序项目配置
├── tsconfig.json                 # TypeScript 配置
├── babel.config.js               # Babel 配置
└── package.json

关键文件解读

// src/app.config.ts — 全局配置
export default defineAppConfig({
  pages: [
    'pages/index/index',       // 首页(第一个即为默认页)
    'pages/list/index',
    'pages/mine/index',
  ],
  window: {
    backgroundTextStyle: 'light',
    navigationBarBackgroundColor: '#fff',
    navigationBarTitleText: '我的应用',
    navigationBarTextStyle: 'black',
  },
  tabBar: {
    color: '#999',
    selectedColor: '#6366F1',
    list: [
      { pagePath: 'pages/index/index', text: '首页', iconPath: '', selectedIconPath: '' },
      { pagePath: 'pages/list/index', text: '列表', iconPath: '', selectedIconPath: '' },
      { pagePath: 'pages/mine/index', text: '我的', iconPath: '', selectedIconPath: '' },
    ],
  },
})
// src/app.ts — 应用入口
import { PropsWithChildren } from 'react'
import { useLaunch } from '@tarojs/taro'
import './app.scss'

function App({ children }: PropsWithChildren) {
  useLaunch(() => {
    console.log('App launched.')
    // 初始化操作:检查登录态、获取系统信息等
  })

  return children
}

export default App

🚀 3. 运行项目

各平台启动命令

# 微信小程序
npm run dev:weapp
# 产物在 dist/ 目录,用微信开发者工具打开

# H5 网页
npm run dev:h5
# 浏览器访问 http://localhost:10086

# 支付宝小程序
npm run dev:alipay
# 用支付宝小程序开发者工具打开 dist/

# 抖音小程序
npm run dev:tt

# 百度小程序
npm run dev:swan

# 飞书小程序
npm run dev:lark

# 生产构建
npm run build:weapp    # 微信小程序
npm run build:h5       # H5
npm run build:alipay   # 支付宝

微信开发者工具配置

1. 下载并安装微信开发者工具
   https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html

2. 导入项目
   ├── 选择 dist/ 目录
   ├── 填入 AppID(可用测试号)
   └── 选择"不使用云服务"

3. 设置
   ├── ✅ 不校验合法域名
   └── ✅ 不校验 TLS 版本

📝 4. 第一个页面

// src/pages/index/index.tsx
import { View, Text, Button, Image } from '@tarojs/components'
import { useCallback, useState } from 'react'
import Taro from '@tarojs/taro'
import './index.scss'

export default function Index() {
  const [count, setCount] = useState(0)

  const handleClick = useCallback(() => {
    setCount(prev => prev + 1)
    Taro.showToast({ title: '点击了!', icon: 'success' })
  }, [])

  const handleNavigate = useCallback(() => {
    Taro.navigateTo({ url: '/pages/list/index' })
  }, [])

  return (
    <View className="index">
      <Image
        className="logo"
        src="https://taro-docs.jd.com/img/logo-taro.png"
        mode="aspectFit"
      />
      <Text className="title">欢迎使用 Taro</Text>
      <Text className="subtitle">一套代码,多端运行 🚀</Text>

      <View className="counter">
        <Text className="count">{count}</Text>
        <Button className="btn" onClick={handleClick}>
          点我 +1
        </Button>
      </View>

      <Button className="nav-btn" onClick={handleNavigate}>
        跳转到列表页 →
      </Button>
    </View>
  )
}
// src/pages/index/index.scss
.index {
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: 60px 32px;

  .logo {
    width: 160px;
    height: 160px;
    margin-bottom: 24px;
  }

  .title {
    font-size: 36px;
    font-weight: bold;
    color: #1a1a1a;
    margin-bottom: 8px;
  }

  .subtitle {
    font-size: 28px;
    color: #666;
    margin-bottom: 48px;
  }

  .counter {
    display: flex;
    flex-direction: column;
    align-items: center;
    margin-bottom: 32px;

    .count {
      font-size: 80px;
      font-weight: bold;
      color: #6366f1;
    }

    .btn {
      margin-top: 16px;
      background-color: #6366f1;
      color: #fff;
      border-radius: 12px;
      font-size: 28px;
    }
  }

  .nav-btn {
    background-color: transparent;
    color: #6366f1;
    border: 2px solid #6366f1;
    border-radius: 12px;
    font-size: 28px;
  }
}
// src/pages/index/index.config.ts
export default definePageConfig({
  navigationBarTitleText: '首页',
})

⚠️ 注意:Taro 中使用 rpx 为单位(设计稿 750px 宽),但在样式中直接写 px, Taro 会自动转换为 rpx。1px = 1rpx(基于 750 设计稿)。


🔍 5. Taro 与原生小程序对比

概念原生微信小程序Taro (React)
模板语法WXML <view wx:for>JSX {list.map()}
样式文件.wxss.scss / .css
组件通信properties + triggerEventprops + 回调函数
状态管理this.setData({})useState / useReducer
生命周期onLoad / onShowuseLoad / useDidShow
路由跳转wx.navigateToTaro.navigateTo
条件渲染wx:if{condition && <View/>}
列表渲染wx:for{list.map(item => ...)}
// 原生微信:
// <view wx:for="{{list}}" wx:key="id">
//   <text>{{item.name}}</text>
// </view>

// Taro React:
{list.map(item => (
  <View key={item.id}>
    <Text>{item.name}</Text>
  </View>
))}

✅ 本篇小结 Checklist

  • 理解 Taro 的多端编译原理
  • 安装 Taro CLI 并创建项目
  • 理解项目目录结构(config / src / pages)
  • 在微信小程序和 H5 上运行成功
  • 完成第一个计数器页面
  • 理解 Taro 与原生小程序语法的对应关系

下一篇预告:《React + TypeScript 基础速览》—— Taro 以 React 为核心框架, 本文快速过一遍你需要掌握的 React 知识。


本文是「Taro 从零到一」系列第 1 篇,共 10 篇。