铺垫

随着大前端蓬勃发展, 冒出越来越多的端, 最火的当数最近出现的微信小程序. 但是无论是 微信小程序 , 还是 支付宝小程序, 或者 快应用 都有一个明显的缺点, 虽然他们还是按照一定的 js html css 标准作为开发方式, 但是他们都与当前所有主流技术有相当大的壕沟.

虽然小程序使用类似Vue, angular的模板渲染, 实现了类MVVM的开发方式.但是小程序的开发方式相当蛋疼. 以下是一个简单小程序的目录结构:


上述目录只包含页面内容, 开发过程中需要不断在不同文件中切换. 相比React的Component css 和 Vue的单文件来看, 开发体验不太好. 并且很多小程序开发者都是vue、React、angular等等前端框架的使用者, 使用熟悉的开发栈对他们来说更容易上手.

小程序的本质

在开发一个工具前要理解运行载体的原理. 正如我们希望用React去开发小程序, 那么我们必须要了解小程序的原理.

因为小程序是闭源的, 我只能在自己的猜想上分析. 但是小程序的底层是Native 这是前提. 那么我猜想小程序的实现原理应该跟ReactNative类似, 通过js bridge搭建js和原生通信的桥梁, 由js及模板, 实现对页面的渲染描述.

但是小程序与ReactNative的不同点是, ReactNative对js层开放renderer api. 而小程序则对这层进行了封装. 这让我们无法通过重新实现React的renderer来使用React的一些特性(如vdom).

所以我的思路是通过语法转换, 把React文件转换成小程序工程文件. 并实现小程序的框架, 来对接小程序与react的生命周期方法.

期望

我希望能把React文件, 经过编译后, 变成可执行的微信小程序

import Page from '../wechat'
import './page.css'class P extends Page {onClick(){}render() {return (<div className="app" onClick={this.onClick} style={{posistion:"relative"}}>威武</div>)}
}

开始我们的旅程

有了开发小程序的思路, 那我们就来动手. 我使用了babel作为语法转换的工具, 我们先开个头. 下面是转换的核心代码

function transform(code, sourcePath) {let output = {wxml:'',wxss:'',js:'',json:'',type:''//App||page||component}sharedState.sourcePath = sourcePath;const result = babel.transform(code, {babelrc: false,plugins: ['@babel/plugin-syntax-jsx', transformPlugin, '@babel/plugin-proposal-object-rest-spread',  ['@babel/plugin-proposal-decorators',{"legacy": true}] ]})// tranform后, 结果都会写入sharedState.outputoutput = sharedState.output;const obj = t.objectExpression(sharedState.methods);output.js = generate(obj).code;sharedState.reset();switch(output.type){case 'App':output.js = CodeWrapper('App', output.js);break;default: //Pageoutput.js = CodeWrapper('Page', output.js);break;}return output;
}

该部分代码实际上就是通过babel 对React代码文件进行处理, 处理后把结果写入到output. 重点在于, 我们通过babel.transform这个方法, 把代码拆分成四块, 分别写入到sharedState.output中.

最终通过一些简单处理后, 返回output, 不难看出output中的wxss, js, json, wxml就是一个小程序页面/组件的代码文件.

其中

transformPlugin

是自定义的编译插件. 今天有点晚先到这里, 下期继续讨论插件开发思路.

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

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

该项目参考了mpvue, taro, weact等. babel-traverse和babylon babel

还有感谢 @方正 提点

原文链接: https://zhuanlan.zhihu.com/p/38102065

更多专业前端知识,请上 【猿2048】www.mk2048.com

[转] 如何实现 React 写小程序-1相关推荐

  1. 为何我们要用 React 来写小程序 - Taro 诞生记

    在互联网不断发展的今天,前端程序员们也不断面临着新的挑战,在这个变化多端.不断革新自己的领域,每一年都有新的美好事物在发生.从去年微信小程序的诞生,到今年的逐渐火热,以及异军突起的轻应用.百度小程序等 ...

  2. 使用 React 开发小程序

    作者 | 边柳 原文 | https://www.yuque.com/seeconf/2020/qsytho 为什么要用 React 开发小程序 大家知道微信小程序在商业上取得了非常大的成功,正是因为 ...

  3. React 转小程序现状

    (点击上方公众号,可快速关注) 作者:司徒正美 zhuanlan.zhihu.com/p/41144332 现在做React转小程序,一个是taro,一个是anujs. anujs的React小程序一 ...

  4. 前端面试题(HTML、JS、Vue、React、小程序)

    前端面试题 HTML && CSS HTML 1.Div 里面有个一个div ***** Q:有几种方法可以水平,垂直居中 2.doctype的作用 * 3.link标签和import ...

  5. react构建小程序框架及remax的工作原理

    1.为什么要用 React 来构建小程序? react生态体系完善. 自Facebook在2013年5月开源React,经历了7年多的发展,react的社区生态体系非常庞大,若是使用react来构建小 ...

  6. VS Code 折腾记 - (14) 再来推荐一波大前端适用系列(Node/React/Vue/小程序/主题/代码体验等)的插件

    前言 时隔半年,这期间我又搜罗了一波感觉比较好的插件, 依旧是那句话,好的插件需要作者去创造,时间去迭代- 废话不多说,直入主题; 插件集 React ES7 React/Redux/GraphQL/ ...

  7. VS Code 折腾记 - (14) 再来推荐一波大前端适用系列 (Node/React/Vue/小程序/主题/代码体验等) 的插件...

    前言 时隔半年,这期间我又搜罗了一波感觉比较好的插件, 依旧是那句话,好的插件需要作者去创造,时间去迭代... 废话不多说,直入主题; 2018/7/10: 又追加了几个比较实用的(留言以及最新发现的 ...

  8. 结合DvaJS来写小程序

    小程序结合Redux,对于复杂的小程序,是很好的状态管理利器, 而Redux写起来相对复杂费力, 相比阿里爸爸的Dva.js把各种概念组合成model, 是很容易上手的, 在写小程序的时候, 很希望能 ...

  9. uniapp写小程序组件封装修改数据不渲染

    uniapp写小程序组件封装修改数据不渲染 数据通过props传进来的,对数据进行修改,js打印是有修改的,但是页面无变化,最好找的原因,props传入的数据是不能去直接操作的,可以使用其他方法,比如 ...

最新文章

  1. 域中计算机设定重启,域中添加计算机设定的步骤
  2. Spring-AOP实践 - 统计访问时间
  3. TypeScript学习笔记1:变量赋值及书写方式
  4. shell判断IP地址是否合法
  5. (七)nodejs循序渐进-模块系统(进阶篇)
  6. 15 张图阅尽人工智能现状
  7. 为什么中文分词比英文分词更难?有哪些常用算法?(附代码)
  8. linux buffer cache 过高_怎么理解内存中的Buffer和Cache?
  9. str_replace中的匹配空白符,必须用双引号
  10. 单片机如何在一数据包前加标识呢_单挑Google面试官,一上来就问我Chrome底层原理和HTTP协议(万字长文)...
  11. join为什么每个字符都分割了 js_js如何截取以逗号隔开的字符串
  12. 2021 小白版,360 行行行转 IT
  13. ASP.NET Core MVC 入门到精通 - 1. 开发必备工具 (2021)
  14. 亚信安全助手、杀毒软件卸载
  15. 敏捷其实很简单(7) Scrum Master的7种武器之长生剑和孔雀翎
  16. 开发linux无线网卡驱动程序,linux-2.6.26下开发marvell 88w8686 wifi驱动 (转)
  17. 助力数字经济,服务数智化转型,用友火力全开
  18. clickhouse 如何使用SQL 管理用户和角色
  19. 学生宿舍管理系统毕业设计(python)
  20. 杭州图书馆对所有读者免费开放 包括乞丐【让我感动的图书馆】

热门文章

  1. 《我的眼睛--图灵识别》第三章:基础:颜色识别
  2. 2023年MathorCup高校数学建模挑战赛赛题浅析
  3. Keepalived-一主多备原理及实践
  4. SpringCloud (一) ——认识微服务
  5. ubuntu下安装网易云音乐及配置
  6. 健身耳机哪个牌子好,分享几款健身好用的耳机品牌
  7. Maven项目POM配置好后,下载jar包位置设置(本地仓库配置)
  8. [新概念三]Lesson 5 - The facts
  9. HC32L110(四) HC32L110的startup启动文件和ld连接脚本
  10. 计算机会比人类更聪明吗 英语课文,自考英语二(下)课文翻译之unit15