当前位置: 首页 > Web前端 > HTML

react-native

时间:2023-03-29 12:13:25 HTML

学习一次,随处编写。什么是反应本机?ReactNative是Facebook创建和开发的跨平台框架。它允许使用JavaScript创建Android和iOS应用程序。RN和原生技术RN的优势正在快速发展和迭代。RN的最大优势是热重载,开发者节省了代码编译的时间,而使用原生编程语言时编译时间会更长。对代码所做的更改可以在几秒钟内看到,而不是像本地技术那样几分钟。ReactNative开发的应用支持热更新,因为ReactNative的产物是一个bundle文件,本质上就是JS代码。当应用程序启动时,它会去服务器获取包文件。我们只需要更新bundle文件,这样app就可以更新版本而不用去商店重新下载包了。开发人员可以在没有用户感知的情况下执行功能Iteration或bugfixing。但值得注意的是,AppStore禁止热更新调用私有API、篡改原生代码、改变App行为。低成本。使用原生技术开发Android和iOS应用,需要相应的Android工程师和iOS工程师,还要同时维护两套代码,而RN只需要一个会写JavaScript,懂react框架的前端工程师。上手快与原生开发相比,JavaScript学习成本低,语法灵活。允许网页开发者更多地基于已有经验开发应用。ReactNative只能使用JavaScript编写移动原生应用程序。它与React有着相同的设计理念,所以毫不夸张地说:会写React,就会写ReactNative!原生体验虽然RN是用JavaScript代码编写的,但它使用原生暴露的API和UI组件。RN在react的基础上运行。在编写代码时,可以使用React调用ReactNativeComponents来创建外观和原生视图一样的视图。在运行时,ReactNative为这些组件创建相应的Android和iOS视图。所以体验和性能媲美原生应用RN缺少ReactNative不支持原生API和SDK,即如果你想访问相机,使用增强现实,语音助手或移动支付的SDK,这迫使开发者创建原生模块本身或使用Java/Kotlin(Android)或Swift/Objective-C(iOS)开发“桥梁”,严重增加了软件开发时间。原来的技术没有这种麻烦。虽然RN应用的体验与原生应用不相上下,但其性能不如原生应用。它的一部分性能会消耗在js和native应用程序之间的转换和通信上。React-native原理ReactNative需要一个JS运行环境,因为ReactNative会将应用的JS代码编译成一个JS文件(xx.bundle),ReactNative框架的目标就是解释运行这个JS脚本文件,如果它是Native的扩展API,通过桥直接调用Native方法,最基本的就是绘制UI界面,将VirtualDOM映射到真实的UI组件上。如何创建自定义本机模块Android要创建和编写本机模块,首先在包名(android/app/src/main/java/com/your-app-name/folder)下创建一个CalendarModule.javaJava文件。包com.your-app-name;//将com.your-app-name替换为您应用的名称.react.bridge.ReactContextBaseJavaModule;导入com.facebook.react.bridge.ReactMethod;导入java.util.Map;导入java.util.HashMap;导入android.util.Log;公共类CalendarModule扩展ReactContextBaseJavaModule{CalendarModule(ReactApplicationContext上下文){超级(上下文);}@OverridepublicStringgetName(){返回“CalendarModule”;}@ReactMethod//将方法导出到js中publicvoidcreateCalendarEvent(Stringname,Stringlocation){Log.d("CalendarModule","Createeventcalledwithname:"+name+"andlocation:"+location);}}注册模块编写原生模块后,需要创建MyAppPackage.java向ReactNative注册包com.your-app-name;//用你替换你的应用程序名称r应用名称importcom.facebook.react.ReactPackage;importcom.facebook.react.bridge.NativeModule;importcom.facebook.react.bridge.ReactApplicationContext;importcom.facebook.react.uimanager.ViewManager;importjava.util.ArrayList;导入java.util.Collections;导入java.util.List;公共类MyAppPackage实现ReactPackage{@OverridepublicListcreateViewManagers(ReactApplicationContextreactContext){returnCollections.emptyList();}@OverridepublicListcreateNativeModules(ReactApplicationreactContext){Listmodules=newArrayList<>();modules.add(newCalendarModule(reactContext));returnmodules;}}将注册的包添加到android/app/src/main/中的包列表中,在java/com/your-app-name/MainApplication.java中找到getPackages()方法,将你的包添加到通过add方法的包列表@OverrideprotectedListgetPackages(){@SuppressWarnings("UnnecessaryLocalVariable")Listpackages=newPackageList(this).getPackages();}//下面的MyAppPackage被添加到返回的包列表中packages.add(newMyAppPackage());退货包裹;}在js中调用import{NativeModules}from'react-native';const{CalendarModule}=NativeModules;CalendarModule.createCalendarEvent('foo','bar');IOS1。创建主要的自定义原生模块头文件和实现文件;.h文件是类(例如API)的公共声明的头文件,而.m文件是私有实现。创建头文件RCTCalendarModule.h,//RCTCalendarModule.h#import@interfaceRCTCalendarModule:NSObject@end2。创建实现文件RCTCalendarModule.m//RCTCalendarModule.m#import"RCTCalendarModule.h"#import@implementationRCTCalendarModule//导出名为RCTCalendarModuleRCT_EXPORT_METHOD(createCalendarEvent:(NSString*)namelocation:(NSString*)location){RCTLogInfo(@"假装创建一个事件%@at%@",name,location);}@end3.jsaccessimport{NativeModules}from'react-native';const{CalendarModule}=NativeModules;CalendarModule.createCalendarEvent('testName','testLocation');如何搭建环境搭建react-Native开发环境在搭建iOS开发环境时可能会遇到问题podinstall报错//Device:MacbookM1--CrashReport日志信息------------------------------------------请参阅以下其中一项下的崩溃报告日志文件:*~/Library/Logs/DiagnosticReports*/Library/Logs/DiagnosticReports了解更多详情ils.不要忘记在错误报告中包含上述崩溃报告日志文件。解决方案参考cocoaPodsgithub相关问题