如何用 React 写小程序
// index.wxml// app.wxss @import "common.wxss"; .middle-p { padding:15px; } {{userInfo.nickName}} {{motto}}
babel作为代码编译器,能将我们的代码编译成抽象语法树(AST),再将语法树通过转义(穷举,官方推荐写法、常用写法等)生成我们的目标代码
初代的taro最基本的原理就是如此,在1.x版本中专门维护了一个包,这个包将react中的各种写法根据语法树转换成小程序目标代码,以此用react写小程序

编译时:根据配置将入口文件中的config进行遍历处理,判断页面依赖、获取页面模板并根据对应编译平台输出成对应平台的小程序文件
运行时:主要负责组件的渲染、事件处理、数据绑定(state->data)、生命周期管理以及平台兼容等一系列操作,这些都Taro通过自定框架来模拟实现,在设计的时候使用了类似react的设计概念,以便于开发者可以用类似于开发web应用的方式来开发小程序。
1. **组件系统**: Taro 实现了一套自己的组件系统,这套系统模仿了 React 的组件模型,使得开发者可以使用类似 React 的方式编写组件和管理状态。这包括组件的生命周期管理、状态(state)和属性(props)的更新机制等。 2. **事件系统**: Taro 抽象并模拟了一套类似于 React 的事件处理系统,这包括事件的监听、响应和事件对象的封装。事件处理程序的绑定和解绑都是通过 Taro 运行时来管理的。 3. **数据绑定**: Taro 1.0 提供了一种数据绑定机制,使得组件的渲染可以依赖于状态和属性。当状态或属性发生变化时,Taro 会自动更新组件,确保视图与数据保持同步。 4.**生命周期管理**: Taro 将 React 的组件生命周期映射到小程序的页面和组件生命周期中,这样开发者能够以熟悉的方式编写代码,而 Taro 运行时则负责正确地调用这些生命周期方法。
| 类型 | 阶段 | Taro | 小程序 |
| 工程目录 | 编译时 | my-project/
├── build/ # 构建文件夹
│ ├── index.html # 主页HTML文件
│ └── index.js # 主页JavaScript文件
├── config/ # 配置文件夹
│ ├── app.json # 应用配置文件
│ └── project.config.js # 项目配置文件
├── node_modules/ # 第三方依赖库
├── package.json # 包管理器配置文件
├── src/ # 源代码文件夹
│ ├── assets/ # 资源文件夹(图片、字体等)
│ ├── components/ # 组件文件夹
│ │ ├── index.js # 组件入口文件
│ │ └── MyComponent.js # 组件实现文件
│ ├── index.js # 主入口文件
│ └── pages/ # 页面文件夹
│ ├── index.js # 首页入口文件
│ └── otherPage/index.js # 其他页面入口文件
└── tools/ # 工具文件夹
├── dev-server.js # 开发服务器配置文件
└── start-dev-server.sh # 开发服务器启动脚本
| my-wechat-app/ ├── app.json # 应用配置文件 ├── app.wxss # 样式文件 ├── app.js # 主入口文件 ├── pages/ # 页面文件夹 │ ├── index.js # 首页入口文件 │ └── otherPage/index.js # 其他页面入口文件 │ ├── otherPage.wxml # 页面组件文件 │ ├── otherPage.wxss # 页面样式文件 │ └── otherPage.js # 页面逻辑文件 ├── utils/ # 公共工具文件夹 │ ├── util.js # 公共工具文件 │ └── ... ├── node_modules/ # 第三方依赖库 ├── package.json # 包管理器配置文件 └── README.md # 说明文档 |
| 组件适配 | 编译时 | | |
| react语法-写法 | 编译时 |
|
|
| react语法-运行 | 运行时 | state、props componentDidMount、componentDidUpdate、componentWillUnmount | data onReady、onHide、onUnload |
| api适配 | 运行时 | Taro调用 | wx?. window?. |
因为框架是自研的,就标志着taro需要考虑众多的边际条件,导致了构建系统的逻辑也变得繁杂了起来,出现了以下几个问题:
Taro 2.0 的命令行变得非常轻量,只会做区分编译平台、处理不同平台编译入参等操作,随后再调用对应平台的 runner 编译器做代码编译操作,而原来大量的 AST 语法操作将会改造成 Webpack 处理

- **微信小程序**:将 JSX 编译成 WXML,编译 JavaScript 和 TypeScript 代码,CSS/SCSS/LESS 转换为 WXSS,图片等静态资源也会以特定的形式管理。 - **支付宝小程序**:编译结果类似于微信小程序,但是不同平台有其特定的模板和样式文件后缀名,比如支付宝小程序使用 .axml 作为模板文件后缀,.acss 作为样式文件后缀。 - **H5(Web 应用)**:生成经典的 HTML、CSS 和 JavaScript 文件,可以在各类现代浏览器中运行。 - **React Native**:编译生成能被 React Native 运行时理解的 JavaScript 代码和资源,保持代码逻辑与其他平台尽量一致,但针对原生应用的表现有一些差异化处理。
前端的本质:调用了浏览器的那几个 BOM/DOM 的 API,如:createElement、appendChild、removeChild等。

因此3.0创建了taro-runtime的包,然后在这个包中实现了一套高效、精简版的 DOM/BOM API(下面的 UML 图只是反映了几个主要的类的结构和关系)

然后通过 Webpack 的ProvidePlugin插件,注入到小程序的逻辑层。

这样,在小程序的运行时,就有了一套高效、精简版的 DOM/BOM API。
在新架构加持下,Taro 不再仅局限于 React 阵营,可以不再限制使用的框架语法, Taro 官方内置了 React、Vue、Preact、Svelte、Nerv(京东凹凸实验室打造的类React前端框架) 五种框架的支持

开放式框架思想:

横向扩展:扩展一个全新的编译平台;新的编译平台继承自TaroPlatforBase,如美团小程序
纵向扩展:继承已有端平台插件,扩展出新的编译平台;如 QQ 小程序插件继承于微信小程序插件。
