从Hybrid到React-Native: JS在移动端的南征北战史
注:因为不了解Dart,所以本文不对flutter相关内容进行阐述, 实在抱歉
其实写这篇文章的时候,我就知道,肯定有人问我:为什么不写flutter?抱歉了,flutter的大名我当然知道,可我只是一个写JS的,同时了解一些Java的知识,而flutter采用的编程语言,我暂时没有碰过,所以自然不敢妄加猜度,还请谅解
Hybrid
Hybird的实现方式
- 原生端怎么调用JS代码
- JS代码怎么调用原生端
- Q1: JS怎么调用Android代码
- Q2: Android代码怎么调用JS
- Q3: JS怎么调用IOS代码
- Q4: IOS代码怎么调用JS
Q1: JS怎么调用Android代码
- JSInterface
- JSBridge
- UrlRouter
webView.addJavascriptInterface(new JsInterface(), "control”);
// …
public class JsInterface {
@JavascriptInterface
public void showToast(String toast) {
Toast.makeText(MainActivity.this, toast, Toast.LENGTH_SHORT).show();
log("show toast success");
} }
// WebView中的JS代码,注意control就是上面addJavascriptInterface定义的命名空间
function showToast(toast) {
javascript:control.showToast(toast);
}
Q2: Android怎么调JS代码?
webView.loadUrl(“...//my.html”);
webView.evaluateJavascript(“JS代码”,Callback对象)
Q3: IOS代码怎么调用JS
Q4: JS怎么调用IOS代码
React-Native
RN的作用
- 跨平台:可以为IOS/Android,甚至Windows Phone开发原生应用
- 相对良好的UI体验,平衡开发成本和用户体验后相对合理的选择
RN的本质
- 不是WebView,和Cordova等Hybrid方案划清界限
- 不将JavaScript预编译为Native代码,和Xamarin等方案划清界限。Xammarin的方案是AOT的,运行前就编译为原生代码,RN则采用JIT+解释器的方案(IOS另当别论)
- RN是虚拟机类的方案,依靠运行时系统JavaScriptCore运行
RN的4个线程
- UI线程:也成为主线程,负责本机的Android/iOS的UI呈现,在android中它负责android测量/布局/绘制
- JS线程:执行JS/React代码,进行API调用,处理触摸事件等,对视图的更新被进行批处理,并在事件循环结束时发送给UI线程
- Shadow线程:处理虚拟DOM布局变更的线程
- 本机模块线程: 如android/ios系统自带的原生API
RN的3部分
- Native端(IOS/android)
- JavaScript端
- Bridge:上面介绍的多个线程之间相互通信,以及JS和Native端通信的方式的统称
线程协调过程示例
<View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
<View style={{width: 100, height: 100, backgroundColor: "red"}}></View>
</View>
- 注意原生端有自己的布局实现,所以上面的flex属性和CSS是没有任何关系的。
- 为了实现布局,同时又不阻塞JS线程,布局计算将转移到Shadow线程中进行。
- Shadow线程进行计算,并最终将计算结果得到的布局参数传递给主线程(UI线程),实现UI的构建
RN中的Bridge做了什么? && RN线程如何交互?
- 异步:线程之间,例如JS线程和UI线程,以异步的方式进行通信,这样它们就不会互相阻塞了
- 批处理: 以优化的方式, 把消息从一个线程传递到另外一个线程
- 序列化: 两个线程不会操作或者共享同一块数据,它们之间会通过序列化和反序列化的方式交换消息
RN线程异步带来的某些问题 && 未来的解决方案
RN的Web化:react-native-web
RN-web和普通的React的区别?
RN-WEB的作用
参考文章
从Hybrid到React-Native: JS在移动端的南征北战史的更多相关文章
- 什么是 Native、Web App、Hybrid、React Native 和 Weex?(转载)
什么是 Native.Web App.Hybrid.React Native 和 Weex? 来源:zwwill_木羽 segmentfault.com/a/1190000011154120 一句 ...
- Hybrid APP基础篇(二)->Native、Hybrid、React Native、Web App方案的分析比较
说明 Native.Hybrid.React.Web App方案的分析比较 目录 前言 参考来源 前置技术要求 楔子 几种APP开发模式 概述 Native App Web App Hybrid Ap ...
- Native、Web App、Hybrid、React Native(简称RN)、Weex 间的异同点。
App常用开发模式简介 此处App为应用application,并非我们通常讲的手机App. 常用的几种APP开发模式-脑图 Native App 传统的原生App开发模式,有iOS和aOS两大系统, ...
- 【REACT NATIVE 系列教程之十二】REACT NATIVE(JS/ES)与IOS(OBJECT-C)交互通信
http://blog.csdn.net/xiaominghimi/article/details/51586492 一用到跨平台的引擎必然要有引擎与各平台原生进行交互通信的需要.那么Himi先讲解R ...
- 基于React Native的跨三端应用架构实践
作者|陈子涵 编辑|覃云 “一次编写, 到处运行”(Write once, run anywhere ) 是很多前端团队孜孜以求的目标.实现这个目标,不但能以最快的速度,将应用推广到各个渠道,而且还能 ...
- Hybrid App 和 React Native 开发那点事
简介:Hybrid App(混合模式移动应用)开发是指介于Web-app.Native-App这两者之间的一种开发模式,兼具「Native App 良好用户交互体验的优势」和「Web App 跨平台开 ...
- ReactJs和React Native的那些事
介绍 1,React Js的目的 是为了使前端的V层更具组件化,能更好的复用,它能够使用简单的html标签创建更多的自定义组件标签,内部绑定事件,同时可以让你从操作dom中解脱出来,只需要操作数据就会 ...
- ReactJs和React Native的联系和差异
1,React Js的目的 是为了使前端的V层更具组件化,能更好的复用,它能够使用简单的html标签创建更多的自定义组件标签,内部绑定事件,同时可以让你从操作dom中解脱出来,只需要操作数据就会改变相 ...
- React Native入门指南
转载自:http://www.jianshu.com/p/b88944250b25 前言 React Native 诞生于 2015 年,名副其实的富二代,主要使命是为父出征,与 Apple 和 Go ...
随机推荐
- HBase 系列(二)—— HBase 系统架构及数据结构
一.基本概念 一个典型的 Hbase Table 表如下: 1.1 Row Key (行键) Row Key 是用来检索记录的主键.想要访问 HBase Table 中的数据,只有以下三种方式: 通过 ...
- python的魔术方法大全
在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”(魔术方法),例如类的初始化方法 __init__ ,Python中所有的魔术方法均在官方文档中有相应描述,这 ...
- Spring源码剖析7:AOP实现原理详解
前言 前面写了六篇文章详细地分析了Spring Bean加载流程,这部分完了之后就要进入一个比较困难的部分了,就是AOP的实现原理分析.为了探究AOP实现原理,首先定义几个类,一个Dao接口: pub ...
- 浏览器兼容问题-vue.js
前端时间和其他公司人合作,认识了vue.起初我们做手机端一般用这个技术.后来发现在web也可以使用. 然后自己摸索了下,发现这个技术对于数据的绑定果真很神奇,所在在一些绑定数据比较多,比较零散的画面时 ...
- Linux查找命令对比(find、locate、whereis、which、type、grep)
//太长不看版find查找磁盘空间,相较于locate和whereis速度较慢.find和locate的查找单位为文件或者目录,locate其实是find -name的另一种写法.locate和whe ...
- [WPF自定义控件库] 关于ScrollViewr和滚动轮劫持(scroll-wheel-hijack)
1. 什么是滚动轮劫持 这篇文章介绍一个很简单的继承自ScrollViewer的控件: public class ExtendedScrollViewer : ScrollViewer { prote ...
- 细数 SharedPreferences 的那些槽点 !
前言 最近在处理一个历史遗留项目的时候饱受其害,主要表现为偶发性的 SharedPreferences 配置文件数据错乱,甚至丢失.经过排查发现是多进程的问题.项目中有两个不同进程,且会频繁的读写 S ...
- thinkPHP中的文章详情页实现“上一篇下一篇”功能经验分享
前段时间在公司中接触到了用thinkPHP搭建的项目,其中涉及到了文章详情页上一篇下一篇翻页的功能实现效果. 因为刚接触这套框架和PHP,所以整理一下实现该功能的经验方法. 如果有不到位的地方,欢迎指 ...
- javascript之操作数组方法
掌握如何操作数组,会让你的开发变得更加高效 1.栈和队列方法(以下四个方法都改变原数组) arr.push() //接受任意类型的参数,逐个添加到数组的末尾,并返回数组的长度 改变原数组 arr.po ...
- 一文带您了解 Elasticsearch 中,如何进行索引管理(图文教程)
欢迎关注笔者的公众号: 小哈学Java, 每日推送 Java 领域干货文章,关注即免费无套路附送 100G 海量学习.面试资源哟!! 个人网站: https://www.exception.site/ ...