零、关系理解

这个是我对RN和原生关系的理解。简单解释下这个图。

RN js编写完业务代码后,通过react-native bundle命令,将代码分别编译成一个index.ios.bundle和index.android.bundle文件,当然还是资源文件。然后放到Android、iOS的原生工程里,通过黄色说明块里的示例代码,将js写的所有逻辑业务读成一个View来展示在原生里,当然这个View需要Activity/Fragment/ViewController来承载。然后原生App打开相应承载的页面就可以看到RN写的业务了。所以,正常情况下,对于原生来说,所有的RN页面都是在一个原生页面里的。

顶部还有有个node_modules,它其实在工程里是一个文件夹,里面存放了所有的js,Android,iOS都需要的一个共同类库以及源码,所有的通信、组件都在这个里面。所以,三个工程里都需要读这个文件夹里的东西,但是我们不用关心具体,这个是由npm来自动下载的。只需要安装文档提示配置好这个文件夹的路径就ok了。

一、性能问题

这里,我的理解是,性能一定不如纯原生写的。

关于RN写出来的应用的性能问题其实一直都是所有开发人员所关心的问题。RN一直说的是全都是调用的是原生的控件,所以理论上和原生写的App是不存在性能差异的。

原生封装的控件,在RN这边以组件的方式来使用。我有一篇文章以WebView为例讲述了一下原生控件和RN组件的关系(React Native Android从源码看WebView 没有OverrideUrl解决办法,以及高度自适应)。用RN调用的所有组件的属性参数都是经过了js到java/objective-c/swift的转换后,才最终渲染成原生封装的控件。而控件在运行中的事件回调也是经过了语言通信,才将信息回调给js。我对语言通信这一块的性能耗时不太了解,但是应该可以肯定的是,本来直接就可以完成的事情,经过了语言转换,肯定是有损耗的。只是Facebook把这个性能做了很大的优化,再加上现在手机硬件的性能越来越强大,所以,在大部分手机上这个损耗可以忽略。

二、我认为的缺点

  • 能做的事情不如原生灵活。我前面说过,RN用的组件虽然是原生控件,但是是经过原生封装过的控件,有一定的局限性。为了做到跨平台,他并没有把原生该控件的所有属性参数回调都暴露给js端。

  • 坑会比原生开发更多。原生开发,特别是Android有很多适配问题要考虑,这些大部分都是经验才能解决的坑,facebook开发人员在封装控件的时候如果没遇到过相关的坑,可能会解决的不彻底,而js那边如果不了解原生的话,可能不能完全明白问题出在哪了。所以,原生会遇到的坑,如果facebook没解决,理论上RN都会遇到。

  • 技术栈会要求更高。这个是肯定的,最好是Android/iOS都要有点了解,这样写出来的应用才会更健壮。设计js与原生通信的方案通用性才会更强。问题的排查也会更准确。

三、我理解的优点

最后我才来说优点,是因为虽然有前面的确定,但这个技术本身肯定是值得学习和发扬的。

  • js与原生的通信机制比较完善。注意我说的是比较完善,实际编码过程中还是有很多不如意的地方。但是满足绝大部分业务需求是没问题的。

  • 可以支持自定义原生控件给RN用。前面我说到,原生封装的控件如果不能满足你的业务需求,你可以自己封装控件,并选择性的暴露接口给RN用,当然这个适用于较为复杂的业务需求,如果大部分都控件都需要重新封装,还不如直接就原生写了。

  • 支持热更新。这无疑是比较重要的一个优点了,开始我就提到,对于原生了来说,重要的是js编译的bundle文件,而热更新的方案也就可以从这点入手。将bundle文件和资源文件打成包,当成一个普通的文件下载,然后让原生指定读取路径就可以了。当然这个需要原生支持。

  • 跨平台。这也是一个非常重要的有点了。但是打包iOS,还是需要必须的硬件配置,比如mac电脑。

  • 可以让更多的前端开发人员来写App。

作者:Sunny玄子

链接:https://www.jianshu.com/p/d54bed57b262

[转]Shared——React Native与原生关系理解与对比的更多相关文章

  1. React Native 导入原生Xcode项目总结与记录

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  2. React Native移植原生Android

    (一)前言 之前已经写过了有关React Native移植原生Android项目的文章,不过因为RN版本更新的原因吧,跟着以前的文章可能会出现一些问题,对于初学者来讲还是会有很多疑难的困惑的,而且官方 ...

  3. React Native Android原生模块开发实战|教程|心得|怎样创建React Native Android原生模块

    尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://blog.csdn.net/fengyuzhengfan/article/details/54691503) 告诉大家一个好消息. ...

  4. React Native之原生模块的开发(Android)学习笔记

      目录 1.为什么我们需要原生模块开发 2.开发Android原生模块的主要流程 3.原生模块开发实战   1.为什么我们需要原生模块开发? 我们在用RN开发App的时候,有时候需要用到一些原生模块 ...

  5. React Native与原生项目连接与发布

    前面的各种环境配置按照官方文档一步一步来,挺详细,宝宝在这里就不多说废话了. 其次,前面的配置,我参照的这个博主的文章React Native 集成到iOS原生项目 下面是宝宝掉过的坑(半径15M): ...

  6. React native和原生之间的通信

    RN中文网关于原生模块(Android)的介绍可以看到,RN前端与原生模块之 间通信,主要有三种方法: 1)使用回调函数Callback,它提供了一个函数来把返回值传回给JavaScript. 2)使 ...

  7. 【React Native开发】React Native移植原生Android项目(4)

    ),React Native技术交流4群(458982758),请不要反复加群!欢迎各位大牛,React Native技术爱好者加入交流!同一时候博客左側欢迎微信扫描关注订阅号,移动技术干货,精彩文章 ...

  8. react native与原生的交互

    一.交互依赖的重要组件 react native 中如果想要调用ios  中相关的方法,必须依赖一个重要的组件nativemodules import { NativeModules } from ' ...

  9. react native 中的redux 理解

    redux 中主要分为三大块,分别是Action Reducer 与Store. 1.Action是js的一个普通对象,是store数据的唯一来源.通过store.dispath()讲action传到 ...

随机推荐

  1. PyQt5(4)——菜单栏(使用外部exe)

    图像化建立菜单栏: ① 双击输入名称 就可以喽 如何添加工具栏呢: 新建一个快捷工具,拖到快捷栏,出现红色的小竖线. 至此 就完成了菜单栏和快捷方式的建立. 补充: python   如何调用外部的e ...

  2. 分享一下Ubuntu好用的源

    vim /etc/apt/sources.list 然后用G跳转到最后一行,然后[ESC]切换到命令行模式,然后键入[o](表示在当前行后插入).也可以多插入几个空行.这样可以有条理的和系统默认的区分 ...

  3. request.upload.addEventListener in not a function。

    本人在使用vue开发一套后台系统时,碰到了一个上传文件的需求,因为平时做的上传是使用ajax的方式来进行上传. 现在是使用axios来进行上传,方式没有什么改变: npm i  axios  直接上 ...

  4. Servlet入门小案例

    案例一:tomcat9.jdk1.8 1.eclipse创建web项目 1)创建一个Dynamic web project,名字为Servlet_hjh 2)在src下创建一个包,为com.hjh.d ...

  5. 微信公众号中的支付宝支付与微信支付 && 支付宝支付问题(微信bug)

    一般,在微信公众号中的商城都是需要支持微信支付和支付宝支付的,当然,较大的公司对于鹅厂和阿里的站队就不说了,所以这里简单记录一下支付宝支付和微信支付的主要流程.说是简单介绍,这是因为确实不难,因为前端 ...

  6. Anaconda环境变量配置问题解决

    (右键)我的电脑==>属性==>高级系统设置==>环境变量==>Path 按照下图添加: 总共4个,如果出现“此环境变量太大...”,删除或者缩短其他环境变量地址. 然后重新打 ...

  7. CentOS6.4 安装Maven及Nexus仓库代理

    本文安装的apache-maven-3.5.0-bin.tar.gz,nexus-2.9.0-04-bundle.tar.gz 1.由于网络并不是特别好我这边是通过本地下载过来,通过sftp上传至Ce ...

  8. Android ListView中EditView再次焦点获取

    问题:在ListView中使用EditView,当第一次将焦点给到EditView的时候弹出小键盘.使得EditView失去焦点. 分析:因为在第一次使用EditView弹出小键盘之后,会重新的调用一 ...

  9. 1.8 js基础(常用方法小结)

    1.获取随机数 var rdm=function(n,m){ return parseInt(n+Math.random()*(m-n)); } 2.位数不够补0 function toDou(inu ...

  10. 跨域拦截Access-Control-Allow-Origin设置多个origin

    在Extjs和java项目碰到了需要同时处理跨域,外部要访问后台接口的问题 原来的代码是这样,只能设置一个extjs前台需要过滤的跨域请求 package com.xgt.config; import ...