[转]如何用React写小程序-2

由于上一篇文章比较突兀就进入转换入口. 考虑了一下还是需要补全一些前置说明. 书接上回, 我们已经整理了小程序的前置知识. 这次先来补齐一些设计.

代码转换可以使用 webpack, rollup等打包工具作为入口, 如webpack设置entry. 然后通过babel及自定义插件进行编译, 转换成小程序代码.

转成小程序代码后, 为何还考虑增加react-miniapp-core包. 有以下几方面考虑.

  • 方便扩展
  • 生命周期Bridge

生命周期Bridge

我们知道一个 React组件 的包括从构造函数开始(getInitialState替代品), 到getDerivedStateFromProps, 到render等等一系列的生命周期钩子. 这些生命周期函数将会在React渲染中的对应各个阶段被调用.

但是在小程序中, 这一系列生命周期将会失效. 因为 在小程序中, 渲染各个周期的生命函数钩子由小程序生命周期API指定, 在小程序中, React 生命周期钩子无法直接使用, 但是我们又希望拥有原汁原味的React开发体验. 这时就需要我们在runtime实现Page和Component的生命周期,并唤起React组件相应的生命周期钩子. 由于我的工程未实现runtime部分功能. 以下为 taro 的生命周期bridge代码:

  const weappPageConf = {
    onLoad (options) {
      page._init(this)
      page.$router.params = options
      componentTrigger(page, 'componentWillMount')
    },
    onReady () {
      componentTrigger(page, 'componentDidMount')
    },
    onShow () {
      componentTrigger(page, 'componentDidShow')
    },
    onHide () {
      componentTrigger(page, 'componentDidHide')
    },
    onUnload () {
      componentTrigger(page, 'componentWillUnmount')
    },
    ...
  }
复制代码

下面我们来开始正题, 对babel插件开发说明

Babel

使用es6开发的人都不会对这个库陌生. 我们通常使用 Babel 时会创建.babelrc 进行以下配置

{
 "presets": [ ... ],
 "plugins": [ ... ],
}
复制代码

配置中包含presets和plugins. 其实presets也只是一堆插件的集合. 那么其实我们需要开发一款把React代码转换为小程序代码的babel插件.

那么我们先来看看Babel有那些部分

Babel 编译

Babel有很多很多的子库, 其中最核心的就是 @babal/core.

但是其实涉及核心编译生命周期主要是以下三步:

  • parse 是指把源码解析成AST.
  • traverse 通过对AST进行解析, 可对原AST进行相应转换.
  • generate 把AST再次生成目标版本代码.

@babel/core 分别使用相应的子库来实现这三个生命周期. 这里不深入讨论, 有兴趣的可以去看babel的源码. babel主要插件也分两部分: parser plugin 和 traverse plugin. 而我们需要自行实现的plugin就是traverse plugin.

到这里我们完成了铺垫. 下次会继续说明插件的实现方式 如果时间足够还可以讨论实现思路.

项目代码: https://github.com/PepperYan/react-miniapp)

喜欢这篇文章的大佬, 点个赞和star, ٩(๑´0`๑)۶

该项目参考了mpvue, taro, weact等.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值