Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Rax,完美融合编译时与运行时的双引擎小程序框架

Rax,完美融合编译时与运行时的双引擎小程序框架

作者头像
逆葵
发布于 2020-03-17 10:01:01
发布于 2020-03-17 10:01:01
1.7K00
代码可运行
举报
文章被收录于专栏:FECodingFECoding
运行总次数:0
代码可运行

作者:阿里巴巴淘系前端工程师 弗申 逆葵 Rax Github Repo——https://github.com/alibaba/rax Rax 小程序官网——https://rax.js.org/miniapp

经过持续的迭代,Rax 小程序迎来了一个大的升级,支持全新的运行时方案。站在 2020 年初这个时间点,我们想从 Rax 小程序的特点出发,进行一次全面的梳理与总结,并且在文末附上了 Rax 与当前主流的小程序开发框架的对比。本文将从 API 设计与性能双引擎架构优秀的多端组件协议设计基于 webpack 的工程架构四个方向展开。

一、API 设计与性能

当决定一个产品的技术选型的时候,我们往往会从几个方面考虑,(1)可用生态,即周边相关的工具是否满足产品开发的条件;(2)风险率,即出现问题是否能够快速定位解决,所使用的技术是否会持续维护;(3)上手成本,即需不需要很大代价才能达到能够使用的阶段;(4)性能,即能够满足产品既定的性能标准以及用户体验。

本节主要会介绍 Rax 小程序在后面两点上的优势。

API 设计

框架整体的上手成本是比较小的,Rax 小程序链路从框架上是继承自 Rax(构建多端应用的渐进式类 React 框架)。所以只要你会 Rax Web/Weex 开发或者 React,那么你就会用 Rax 开发小程序,并且可以同时投放到 Rax 所支持的其它端。

但是由于小程序端的特殊性,总会存在无法抹平以及需要单独处理的地方。得益于 Rax 已经做了比较久的多端方案,我们认为,每个端独立的属性不应该入侵基础框架本身,保证基础框架的纯净有利于做更多的扩展。

以下面的代码为例:

Taro:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import Taro, { Component } from '@tarojs/taro'
import { View, Text } from '@tarojs/components'

export default class Index extends Component {
  config = {
    navigationBarTitleText: '首页'
  }

  componentWillMount () { }

  componentDidMount () { }

  componentWillUnmount () { }

  componentDidShow () { }

  componentDidHide () { }

  render () {
    return (
      <View>
        <Text>1</Text>
      </View>
    )
  }
}

Rax

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { createElement, Component } from 'rax';
import View from 'rax-view';
import Text from 'rax-text';
import { isMiniApp } from 'universal-api'; 
import { registerNativeListeners, addNativeEventListener, removeNativeEventListener } from 'rax-app';

function handlePageShow() {}

class Index extends Component {
  componentWillMount () { }

  componentDidMount () { 
    if (isMiniApp) {
      addNativeEventListener('onShow', handlePageShow);
    }
  }

  componentWillUnmount () {
    if (isMiniApp) {
      removeNativeEventListener('onShow', handlePageShow);
    }
  }

  render () {
    return (
      <View>
        <Text>1</Text>
      </View>
    )
  }
}

if (isMiniApp) {
  registerNativeListeners(Index, ['onShow']);
}

export default Index;

在和 Taro 的对比中,可以看出主要是两点差异:(1)Rax 没有 componentDidShow componentDidHide 的概念,新增了和 W3C 标准类似的 addNativeEventLisenter removeEventListener 等 API;(2)组件实例上没有一个叫做 config 的静态属性用来设置页面的 title 等配置。

这就是前文所说的不入侵基础框架本身,React 本身其实是没有 componentDidShow 这些概念,因为这和组件本身的生命周期其实是无关的。我们更期望引导用户用标准的 API 来写业务代码。同时,这种写法的设计带来的还有性能相关的提升,后文会具体说明。

当然这种设计本身会导致代码量一定的膨胀,但是通过工程上的手段,是可以保证最后产物代码的体积几乎毫无差异。

性能

小程序的性能问题是在业务开发中经常会遇到的,为此 Rax 小程序现有的编译时方案也做了很多的努力。通过阿里小程序真机云测的功能,我们对一个无限下拉的列表做了测试。

页面结构如下:

根据真机测试报告,原生小程序三次平均是 2008 ms,Taro 是 2003ms,Rax 是 1924ms,当然其实相差并不多,但是实际的业务场景其实远比上面的页面结构更加复杂。

与 Taro 类似的,Rax 小程序侧的基础框架没有在逻辑层弄一个 VDOM,而是通过数据合并、传统的数据 diff,来避免用户更新冗余的数据。更多的是,阿里小程序原生提供了私有方法 $spliceData来进行性能优化,Rax 底层会去识别用户需要更新的值是否是数组,然后自动根据场景使用 $spliceData 来优化渲染。

另外需要提到的是,前面说的原生事件监听,小程序本身需要预先注册才能监听事件(这也是为了保障性能),即需要:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Page({
  onShow() {}
});

而不能动态注册:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const config = {}
Page(config);
setTimeout(() => {
  config.onShow = () => {};
}, 1000);

所以加入 componentDidShow 这类概念真的不是好的做法,这会导致页面由于不知道是否需要注册 onShow 属性而将所有的原生事件全部注册监听,这不仅会造成开发者不能灵活扩展,更会导致内存泄漏的风险。

于是 Rax 小程序引入了 registerNativeListeners ,只给开发者一种新的认知,就是需要先在页面上注册事件才能进行监听。这样不仅解决了扩展性的问题,还解决了潜在的性能问题。

当然,Rax 小程序能做的性能优化到此为止了么?在可计划的未来,Rax 小程序编译时方案已经有一些明确的 action,比如进一步减轻框架对 props 更新的管理,更多的利用小程序原生的能力来实现组件更新,从而避免和小程序基础框架做重复的事情导致性能损耗。

二、双引擎架构

Rax (可能)是业界首个同时支持编译时和运行时方案的小程序解决方案。两种方案之间的切换无比简单,我们将高性能 or 完整语法的选择权真正地交给了用户。双引擎驱动的 Rax 小程序架构如下:

下面我们将分别介绍两种编译方案。

编译时方案

Rax 小程序编译时方案是基于 AST 转译的前提下,将 Rax 代码通过词法、语法分析转译成小程序原生代码的过程。由于 JavaScript 的动态能力以及 JSX 本身不是一个传统模板类型语法,所以在这个方案中引入一个较为轻量的运行时垫片。

Rax 小程序编译时架构的核心主要分为两个部分,AST 转译运行时垫片。下文会针对这两个部分做简要的介绍。

AST 转译

AST 转译部分的架构相比同类产品 Taro 来说,更加清晰以及可维护性更强。这里不得不提到,它的分语法场景转译以及洋葱模型。我们可以粗略的看一下,分语法场景转译部分的代码结构:

可以比较清晰的看到,针对需要转译的每一个语法场景都有一个模块专门负责转译,这就让整个转译的过程轻松了起来,只要每一部分的转译结果符合预期,那么转译结果就是符合预期的。这样的设计可以让我们能够充分利用单元测试来对转译前后的代码进行比较。

而洋葱模型的设计则是AST 转译的另一个主要设计,整个转译过程实际上分为 4 个步骤:

洋葱模型主要进行的是后面三步,在 parser 层将原有的 AST 树修改为符合预期的新 AST 树,然后在 generate 层将新的 AST 树转译成小程序代码。

运行时垫片

由于 JSX 的动态能力以及 Rax 原本提供的一些例如 hooks 之类的特性。所以,Rax 小程序编译时方案提供了一个运行时垫片,用来对齐模拟 Rax core API 。

既然引入了运行时,自然可以基于这套机制对数据流做更多的管理,以及提供 Rax 工程在其他端上的 API,比如路由相关的 history location 等。

运行时方案

Rax 小程序的运行时方案没有自研,而是『站在了巨人的肩膀上』,复用了 kbone 的架构并对其作了一定程度的改造以接入 Rax 小程序的工程体系。关于运行时方案的实现原理可以点击这里查看,此处不再详细介绍。首先需要介绍的是 Rax 小程序同时也是 kbone 的优点:

  1. 支持更为完整的前端框架特性。相比较 Rax 编译时方案,现在你可以使用完整的 Rax 语法,并且 Rax 所有的特性都已经支持。忘记那些条条框框的语法约束吧;
  2. 可高度复用 Web 端逻辑。如果用户已有 Web 端的 Rax 程序代码,可能只需稍作修改,就能将整个应用完整移植到小程序端,大大提升了开发效率;
  3. 小程序端运行时,仍然可以使用小程序本身的特性,比如小程序内置组件等。

而在 kbone 的基础上,Rax 小程序运行时方案还新增了不少特性,概括起来有以下几点:

  1. 支持支付宝小程序。由于 kbone 的定位,其只支持微信小程序。Rax 基于 kbone,结合支付宝小程序的特点,拓展了对支付宝小程序的支持。现在,想在开发支付宝小程序时使用运行时方案,不仅可以使用 Remax,你还有 Rax 可以选择;
  2. 接入完整的 Rax 工程体系。现在,你可以在使用运行时方案时感受到 Rax 工程的所有特点,比如 Rax 多端 API、多端组件、多端构建器等,享受完整一致的体验;

最后,我们也不能回避的是,Rax 小程序运行时方案具有所有运行时方案都存在的问题:性能损耗。事实上,运行时方案就是以一定的性能损耗来换取更为全面的 Web 端特性支持。所以,如果你对小程序有一定的性能要求,建议使用编译时方案;如果对性能要求不高,那么运行时方案就是助你快速开发小程序的利器。双引擎驱动的 Rax 小程序,总有一处能够击中你的内心。

三、优秀的多端组件协议设计

Rax 小程序编译时方案支持项目级开发和组件级开发。与 Taro 将组件统一在项目中进行编译产出为小程序代码不同,Rax 在组件工程中即可构建出小程序组件。结合一套优秀的多端组件协议设计,我们做到了在 Rax 小程序项目和原生小程序项目中都能正常使用 Rax 小程序组件,同时保持统一的多端开发体验。该协议定义在 package.json 中的 miniappConfig 字段中,其具体用法设计可以参见文档 Rax 小程序——多端组件开发

支持渐进式接入 Rax

对于那些已经使用原生语法开发了完整的小程序的开发者来说,一个很合理的需求就是渐进地切换到 Rax 开发链路上来,毕竟整个项目迁移可能成本高昂。而 Rax 依托多端组件协议,能够帮助开发者平滑过渡。

按照设计,Rax 小程序组件工程的构建产物为符合小程序语法的组件,因此其理所当然可以直接在原生小程序项目中使用。这意味着,如果你想渐进式地使用 Rax 来开发小程序,可以以组件或者页面为单位将之前使用原生语法开发的小程序逐渐地迁移到 Rax 上来。而这,也是 Taro 等其他框架不具备的能力。在 Rax 的使用方中,浙江省网上政务平台『浙里办』支付宝小程序即采用了渐进式接入 Rax 的方式。

多端统一的组件使用体验

当使用 Rax 组件工程发布的小程序组件在 Rax 项目中使用时,构建器会自动通过 miniappConfig 规定的路径去寻找该组件的小程序实现从而实现替换。用户在业务代码编写层面无需像传统引入原生小程序组件的方式一样写具体路径,而是与 Web/Weex 端保持一致即可,示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Wrong
import CustomComponent from 'custom-component/miniapp/index'

// Correct
import CustomComponent from 'custom-component'

除此之外,多端组件协议还可以扩展成多端组件库协议,支持更灵活的类似 import { Button } from 'fusion-mobile' 的写法。以 Rax 多端组件协议为基础,你可以快速为你的多端项目开发通用组件或者组件库。比如,Rax 基础组件就都是以该方式开发的。

四、基于 webpack 的工程架构

Rax 工程以阿里巴巴集团前端统一的 CLI 工具 @alib/build-script 为基础,其依赖 webpack,通过插件体系支持各个场景,同时基于 webpack-chain 提供了灵活的 webpack 配置能力,用户可以通过组合各种插件实现工程需求。Rax 小程序的编译时方案通过 webpack loader 来处理自身逻辑。以 app/page/component 等文件角色分类的 webpack loader 会调用 jsx-compiler 进行代码的 AST 分析及处理,再将处理完的代码交由 loader 生成对应的小程序文件;运行时方案直接复用 Web 端的编译配置,再通过额外的 webpack 插件生成具体的小程序代码。

相比其他自研的工程体系,整套架构具有如下优点:

  • 基于 webpack,灵活且可扩展型强
  • 插件体系,可复用性强
  • 命令简洁,体验统一

总结

最后,附上 Rax 和现有主流小程序框架的对比。

以上是我们对 Rax 小程序的核心竞争力的阶段性总结与思考。小程序已经不是初生牛犊,小程序的解决方案也早已汗牛充栋,但我们相信,Rax 的入局,会让你的小程序开发有那么一些不一样。

更多关于 Rax 小程序的内容,欢迎访问 https://rax.js.org/miniapp 了解!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聊一聊小程序框架
随着微信小程序的爆火,如今小程序几乎已经取代了传统的 h5 应用,成为了主流。 各大 app 都有自己的小程序,开发规范技术五花八门,作为前端开发者,若想做到在各大应用上都开发自己的小程序需要耗费巨大的精力。 似乎又回到了之前“各大浏览器共存的”兼容时代了。 好在,如今前端“基建”相当完善,大佬们很快就有了解决方案,那就是利用“编译”和“构建”,将同一套业务代码通过语法分析,然后“编译构建”出适配各个平台的小程序。 此类方案很多,我将这些方案称为“小程序开发框架”。
epoos
2023/04/01
7020
聊一聊小程序框架
浅谈:在2020年,该如何选择合适的小程序框架?
微信并不是第一个做小程序的 App,而是做小程序最有优势的 App,比如高流量、用户较长的停留时间等等。站在微信的视角,小程序从业务形式上更像是公众号开发的演变产物。
极乐君
2020/07/24
1.2K0
小程序第三方框架对比 ( wepy / mpvue / taro )
     众所周知如今市面上端的形态多种多样,手机Web、ReactNative、微信小程序, 支付宝小程序, 快应用等,每一端都是巨大的流量入口,当业务要求同时在不同的端都要求有所表现的时候,针对不同的端去编写多套代码的成本显然非常高,这时候只编写一套代码就能够适配到多端的能力就显得极为需要。但面对目前市面上成熟的小程序第三方框架如何针对自己的需求进行选择也是一个麻烦事,本文针对当前市面上的三大转译框架进行一个综合对比,希望能对大家的技术选择有所帮助,如有哪里不妥的地方希望指正;
李文杨
2018/10/25
2.7K0
七大热门小程序框架横评,谁是性能之王
随着小程序在商业上的巨大成功,小程序开发在国内前端领域越来越受到重视,为了方便广大开发者更好地进行小程序开发,各类小程序框架也层出不穷,呈现出百花齐放的态势。但是到目前为止,业内一直没有出现一份全面、详细、客观、公正的小程序框架测评报告,为小程序开发者在技术选型时提供参考。于是我便筹划推出一系列文章,对业内流行的小程序框架进行一次全方位的、客观公正的测评,本文是系列文章的第一篇——运行时性能篇。
ConardLi
2020/05/26
1.9K0
前端跨平台框架对比分析,看这篇就够了
前端跨端实践是指在开发过程中,使用统一的代码库或框架来实现在不同平台上运行的应用程序。
winty
2023/08/23
5.9K0
前端跨平台框架对比分析,看这篇就够了
干货 | 小程序跨端框架实践之Remax篇
汽车票前端研发团队,致力于提供更便捷更智慧的出行方式,关注前端技术方向的探索和实践。
携程技术
2021/11/12
1.1K0
干货 | 小程序跨端框架实践之Remax篇
Taro3.2 适配 React Native 之运行时架构详解
由 58 前端团队主导的 Taro 3 适配 React Native 工作已完成有一段时间了。目前发布了多个体验版,也将在3月底迎来正式版。基于 Taro 的良好架构演变,适配 React Native 的方案的也做了较大调整,本文将主要介绍 Taro 3 适配 React Native 运行时相关的详细设计与实现。
PHP开发工程师
2021/05/24
2.7K0
Taro3.2 适配 React Native 之运行时架构详解
基于AST技术的Taro框架升级方案
音乐人小程序初版于2019年8月上线,当时做开发框架选型时,Taro 由于支持小程序、H5两端同构及类 React 语法等特性,比较契合团队当时的诉求,最终选择 Taro(版本1.3.4)作为主框架开发音乐人小程序。
QQ音乐技术团队
2024/01/04
4090
基于AST技术的Taro框架升级方案
小程序视角下同构方案思考
其实,小程序之间的互转相对比较简单。得益于微信小程序的先行,各家在设计小程序 DSL 和 API 时,通常会尽量靠拢微信小程序,以降低学习成本和转换成本。
前端森林
2020/10/22
1.8K0
小程序视角下同构方案思考
小程序多平台同构方案分析-kbone 与 remax
当前国内小程序平台众多,微信小程序、支付宝小程序、头条小程序、以及未来还会出现的新小程序平台,所以为了解决一套代码可以在多个小程序平台上运行,出现了多种方案来解决,京东的 Taro、蚂蚁的 Remax、微信的 Kbone,各有特点,主要归为两种类型,编译时与运行时适配两种。
极乐君
2020/03/25
8440
小程序框架选择与平台编译能力测评
开发者在使用常见的第三方小程序框架(如 taro,kbone,uniapp)时,会发现各家框架厂商都宣称通过自己的框架能编译出不同平台下最好用,最流畅的小程序,开发者受限于精力与时间不够,也无法对其进行足够仔细地辨别与区分。
Onegun
2022/02/16
1.2K0
小程序框架选择与平台编译能力测评
Kbone原理解析 & 小程序技术选型
首先我们来看下普通Web端框架,以Vue框架为例,一份Vue模板对应一个组件,在代码构建阶段编译成调用Dom接口的JS函数,执行此JS函数就会创建出组件对应的Dom树,从而渲染到浏览器页面上。
binnie
2019/12/11
1.5K0
Kbone原理解析 & 小程序技术选型
小程序同构方案 kbone 分析与适配
在微信小程序的开发的过程中,我们会存在小程序和 H5 页面共存的场景,而让小程序原生和 web h5 独立开发,往往会遇到需要两套人力去维护。对开发者而言,加大了工作量成本,对于产品而言,容易出现展示形态同步不及时问题。在这种情况下,我们急需要找到一个既能平衡性能,也能满足快速迭代的方案。
binnie
2019/12/11
1.3K0
小程序同构方案 kbone 分析与适配
Taro小程序跨端开发入门实战
随着业务不断扩张以及大小程序平台的崛起,针对每个平台都去写一套代码是不现实的,且原生的小程序开发模式有很多弊端。为了让小程序开发更简单、高效,采用Taro作为首选框架,本文将分享Taro的实践经验,主要内容围绕什么是Taro以及Taro如何使用(正确使用的姿势),还有Taro背后的一些设计思想来展开,让读者能够对Taro有较为完整的认识。Taro3.0已经逐渐成熟,实践项目已经进行Taro3.0的升级,因此本文代码示例以Taro3.0作为基础。
京东技术
2021/09/24
1.7K0
Taro小程序跨端开发入门实战
小程序开发入门
Taro 原理简单解析如果让大家自己实现,大家会如何实现用 React/Vue 来写小程序,可以简单思考下
王秀龙
2021/08/27
5K0
小程序开发入门
深入分析小程序主流跨端框架原理(一)
我们将从框架的语法这两个维度进行讲解。第一部主讲Vue跨端框架,第二部主讲类 React 跨端框架。
极乐君
2020/11/04
3.2K3
深入分析小程序主流跨端框架原理(一)
Taro
一种多端代码转换方案,这里的“端”是指微信小程序、Web、ReactNative、百度小程序、支付宝小程序、头条小程序、快应用等等
ayqy贾杰
2019/06/12
1.7K0
Taro
深度测评丨小程序框架与平台编译对比
摘要:本文由针对小程序的稳定性、框架支持度、列表渲染性能、操作系统支持度、组件支持度与跨平台性进行综合对比,从而帮助开发者找出最适合自己的小程序平台与框架。
海岛船长加西亚
2022/02/18
9580
深度测评丨小程序框架与平台编译对比
小程序跨端开发框架深度横评之2020版
这一年,小程序在用户规模及商业化方面都取得了极大的成功。微信小程序日活超过3亿,支付宝、百度、字节跳动小程序的月活也纷纷超过3亿。
CHB
2020/04/09
2.6K0
小程序跨端开发框架深度横评之2020版
干货 | 携程门票H5转小程序实践
自微信小程序出来后,互联网进入一个新的纪元。由于手机的容量有限,每个人不可能装太多APP ,总有一些APP大家都装,称之为超级APP,它们集成越来越多的功能,其中以小程序尤为突出。小程序巨大的流量红利不容小视,这也是小程序越来越火的部分原因。
携程技术
2021/07/22
1.8K0
相关推荐
聊一聊小程序框架
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验