皮皮网

【vb 图像源码】【流程控制源码】【闲来土豪金源码】reactnative 项目源码_reactnative开源项目

时间:2024-11-30 01:59:47 来源:贴朔源码 作者:hivemq源码解析2020

1.Expo 搭建 React-native 项目代码目录分析
2.如何编译ReactNative示例程序Examples
3.React Native UI界面还原,项项目组件布局与动画效果
4.实现一个基础的ReactNativePopup
5.如何评价 React Native

reactnative 项目源码_reactnative开源项目

Expo 搭建 React-native 项目代码目录分析

       创建一个React-native项目涉及多个步骤,目源码其中Expo提供四种工具以简化开发过程。开源选择初始化模板时,项项目vb 图像源码可根据实际需求,目源码如项目演示、开源组件预览或个人项目等,项项目对应选择不同的目源码模板。例如,开源选择"blank"模板适用于项目演示和组件预览,项项目"tabs"模板则适用于需要底部tab菜单的目源码流程控制源码项目,"minimal"模板适合需要控制原生代码的开源项目。

       React Native目录结构提供了组件开发的项项目示例目录和相关配置指南。目录结构主要包括src、目源码test和demo三个主要部分,开源以及根目录下的闲来土豪金源码配置文件。src目录存放React Native组件的源码,test目录包含测试相关代码,而demo目录中包含独立的Expo项目,其中的App.js文件是开发示例的核心,展示src目录中提供的license生成工具源码组件。

       引入Expo时,由于默认目录结构与metro打包工具的期望不符,需手动调整metro配置文件。首先安装Expo CLI工具,然后选择创建项目,docker 源码安装nginx使用命令预览生成的Expo项目。配置metro时,需调整providesModule路径解析名,注入引用的库,如react-native、react和prop-types,确保src目录中的引用能正确解析。配置完成,即可在App.js中引入src中的组件,运行yarn start以在Expo中展示组件。

       React Native组件目录结构的灵活性提供多种可能性,本文提供的是一种实用思路。在实际开发中,根据项目需求调整目录结构和配置,以实现高效和可维护的开发流程。

如何编译ReactNative示例程序Examples

       ã€€ã€€ç¼–译示例程序需要将整个项目导入到androidStudio中,androidStudio导入项目时选择react-native/ReactAndroid目录。

       ã€€ã€€ç”±äºŽé¡¹ç›®ä¾èµ–ndk因此如果要编译Examples还需要安装配置ndk目录,下载ndk后是一个自解压程序,会释放ndk的目录。

       ã€€ã€€ç„¶åŽéœ€è¦è®¾ç½®çŽ¯å¢ƒå˜é‡æˆ–者在react-native根目录下新建local.properties文件,文件内容如下:

       ã€€ã€€sdk.dir=c:\你的sdk目录

       ã€€ã€€ndk.dir=c:\你的ndk目录

       ã€€ã€€è®¾ç½®è¦ä¹‹åŽå°±å¯ä»¥ç¼–译了,导入和编译的过程比较曲折,请继续看下文。

       ã€€ã€€åœ¨ç¼–译AwesomeProject项目时,没有用到ndk,实际上这里的ndk默认情况下并没有用到,只是gradle的设置里有ndk因此必须配置ndk才能导入项目。

       ã€€ã€€ndk是在编译核心库是才用到,核心库位于react-native/ReactAndroid,导入整个项目时以lib形式存在。查看Examples目录下UIExplorer,会发现在build.gradle是以在线的方式导入核心库的。通过源码的方式导入被注释掉了。

       ã€€ã€€dependencies {

       ã€€ã€€compile fileTree(dir: 'libs', include: ['*.jar'])

       ã€€ã€€compile 'com.android.support:appcompat-v7:.0.1'

       ã€€ã€€// Depend on pre-built React Nativecompile 'com.facebook.react:react-native:0..+'

       ã€€ã€€// Depend on React Native source.

       ã€€ã€€// This is useful for testing your changes when working on React Native.

       ã€€ã€€// compile project(':ReactAndroid')

       ã€€ã€€}

       ã€€ã€€ç”±æ­¤å¯çŸ¥ï¼Œç¼–译UIExplorer并不需要ndk,如果你不想设置ndk,有2个办法

       ã€€ã€€1.拷贝AwesomeProject项目中的build.gradle,settings.gradle到UIExplorer的android目录,在导入项目时选择UIExplorer/android就可以了,这样androidStudio会导入单个项目,否则会导入整个项目。

       ã€€ã€€2.用androidStudio新建一个同名的项目,然后把UIExplorer目录中的文件拷贝到新建的项目中。

       ã€€ã€€ç¼–译好之后启动服务器端,到react-native目录下执行:

       ã€€ã€€npm install

       ã€€ã€€node packager\packager.js

       ã€€ã€€windows下如果出现错误需要根据错误提示修改代码blogs.com/zhaojietec/p/.html

       ã€€ã€€ä¸è¿‡éœ€è¦æ³¨æ„çš„是,目前为止,UIExplorer在Android下有一个bug,IOS下没有问题,通过google可以找到了解决办法。/post/

如何评价 React Native

       React native充分利用了Facebook的现有轮子,是一个很优秀的集成作品,并且我相信这个团队对前端的了解很深刻,否则不可能让Native code「退居二线」。

       å¯¹åº”到前端开发,整个系统结构是这样:

       JSX vs HTML

       CSS-layout vs css

       ECMAScript 6 vs ECMAScript 5

       React native View vs DOM

       æ— éœ€ç¼–译,我在第一次编译了ipa装好以后,就再也没更新过app,只要更新云端的js代码,reload一下,整个界面就全变了。

       å¤šæ•°å¸ƒå±€ä»£ç éƒ½æ˜¯JSX,所有Native组件都是标签化的,这对于前端程序员来说,降低了不少学习成本,也大大减少了代码量。不信你可以看看JSX编译后的代码。

       å¤ç”¨React系统,也减少了一定学习和开发成本,更重要的是利用了React里面的分层和diff机制。js层传给Native层的是一个diff后的json,然后由Native将这个数据映射成真正的布局视图。

       css-layout也是点睛之笔,前端可以继续用熟悉的类css方式来编写布局,通过这个工具转换成constrain布局。

       ç³»

       ç»Ÿåªæœ‰js-objc的单向调用,就是把原生UI组件的方法通过javascritcore或者webview(低版本iOS)映射到js中来,整个调用

       è¿‡ç¨‹æ˜¯å¼‚步的,这样的设计令React native可以让js运行在桌面chrome中,通过websocket连接Native

       code和桌面chrome,极大地方便了调试。对其中的机制Bang的一篇文章写得很详细,我就不拾人牙慧了:React Native通信机制详解 « bang’s blog 。但这样设计也会带来一些问题,后面说。

       ç‚¹æŒ‰æ“ä½œä¹Ÿè¢«æŠ½è±¡æˆäº†ä¸€ç»„组件(TouchableXXX),这种抽象方式是我在之前做类似工作中没有想到的。facebook还列出Native为什么和web「手感」不同的原因:实时的点按反馈和取消能力。React Native 这套相应机制设计得很完善,能像Native code那样控制整个点按操作的所有过程。

       Debug

       ç›¸å½“方便!修改了js以后,通过内建的nodejs

       watcher编译成bundle,在模拟器里面按cmd+r就可以看到效果。而且按cmd+d,可以打开一个chrome窗口,所有的js都移到了

       chrome里面运行,所以什么断点单步打调用栈,都不在话下。

       ä¸Šé¢çš„既是特点也是优点,下面说说缺点,或者应该说:「仍然遗留的问题」,在我看来,这个方案已经超越了Hybird方案。

       ç³»

       ç»Ÿä»ç„¶ï¼ˆä¸å¾—不)依赖原生组件暴露出来的组件和方法。举两个例子,ScrollView这个组件,在Native层是有大量事件

       çš„,scrollViewWillBeginDragging,

       scrollViewWillEndDragging,scrollViewDidEndDragging等等,这些事件在现有的版本都没有暴露,基本上

       åšä¸äº†ç»„件联动效果。另外,这个版本中有大量组件是iOS

       only的:ActivityIndicatorIOS、DatePickerIOS、NavigatorIOS、PickerIOS、

       SliderIOS、SwitchIOS、TabBarIOS、AlertIOS、AppStateIOS、LinkingIOS、

       PushNotificationIOS、StatusBarIOS、VibrationIOS,反过来看,剩余的都是一些抽象程度极强的基本组件。这

       æ ·ï¼Œç”¨æˆ·å¿…须在不同的平台下写两套代码,而且所有能力仍然强烈依赖 React native 开发人员暴露的接口。

       ç”±äºŽæœ€å¤–层是

       React,初次学习成本高,不像往常的Hybird方案,只要多学几个JS

       API就可以开始干活了。当然,React的确让后续开发变得简单了一些,这么一套外来的(基于iOS)、残缺不全的(css-layout)在

       React的包装下,的确显得不那么面目可憎了。

       å¦å¤–,React Native仍然很不完善。文档还不全,我基本上是看着他的示例代码完成的demo,集成到已有app的文档也是今天才出来。按照官方的说法,Android版本要到半年后才发布:Blog | React ,届时整个系统设计可能还会有很大的变化。

       PS,在使用Tabbar的时候,我惊喜的发现他们居然用了iconfont方案,我现在手头的项目中也有同样的实现,不过API怎么设计一直很头疼。结果,我发现他是这么写的:

       <TabBarItemIOS

        name="blueTab"

        icon={ _ix_DEPRECATED('favorites')}

       ....>

       åœ¨ _ix_DEPRECATED 的定义处,有一句注释: // TODO(nicklockwood): How can this fit our require system?

       ä»¥ä¸Šã€‚

       ä¸‹é¢æ˜¯ä¸€å‘¨å‰ï¼Œåœ¨React native还没开源的时候,通过反解ipa的一些分析过程,有兴趣的可以看看。

       ------------------------简单粗暴的分割线--------------------

       èƒŒæ™¯å’Œè°ƒç ”手段

       React

        Native还没开源,最近和组里兄弟「反编译」了Facebook Group(这个应用是用React

       Native实现的)的ipa代码,出来几百个JS文件,格式化一下,花了几天时间读了一下源码,对React

       Native的内部核心机制算是有了一个基本了解。

       React Native的核心实现:

       å…ˆç®€å•è¯´å‡ ç‚¹ï¼Œè¯¦ç»†çš„等回头更新。

       1. React Native里面没有webview,这货不是Hybrid app,里面执行JS是用的

       JavascriptCore。

       2. 再说React Native的核心,iOS Native code提供了十来个最基本核心的类(RCTDeviceEventEmitter、

       RCTRenderingPerf等)、或组件(RCTView、RCTTextField、RCTTextView、

       RCTModalFullscreenView等),然后由React Native的JS部分,组成二十来个基本组件(Popover、Listview等),交由上层的业务方来使用(THGroupView)。

       3. 就如他们在宣传时所说,他们实现了一套类似css的子集,用来解决样式问题,相当复杂和强大,靠这个才能将Native的核心组件组成JS层的基本组件再组成业务端的业务组件,应该是采用facebook/css-layout · GitHub的C语言版本实现的(在ppt中我们看到了类似flex-direction: column一类的代码,这个正是css-layout支持的语法)。

       4. 在React Native中,写JS的工程师解决的是「将基本组件拼装成可用的React组件」的问题,写Native Code的工程师解决的是「提供核心组件,提供足够的扩展性、灵活性和性能」的问题。

       React Native的设计考虑:

       ReactJS对React Native有着直接的影响(我没在生产环境中用过React,只看过代码&用过Angular,如果有误请指出)

       ReactJS里面有这样的设计:

       1. ReactJS 的大工厂入口createElement返回的不是某个实体DOM对象,而只是一个数组

       2. 通过源码中 ui/browser/ 目录中的代码,将这个数组转换成DOM

       3. 底层的渲染核心是可以更换的

       å¦å¤–,Facebook自己有JSX,css-layout等开源项目,基于这些,如果要做一个用 JS来开发Native app的东西,很自然就想到了一套最有效率的搞法:

       1. 将 ui/browser 里面的代码替换成一套 Native 的桥接JS(实际上,iOS版是通过

       injectGenericComponentClass方法,将核心组件的方法注入到JS里面 ),就直接复用React的MVVM,自动将数据映射到Native了

       2.

        Native

       code里面实现三组核心API,一组提供核心组件的API(create、update、delete),一组事件方法(ReactJS里面的

       EventEmitter ),一组对css进行解析(css-layout)以及返回Style的ComputedStyle(React

       Native里面叫meatureStyle)。

       è¿™æ ·ï¼Œç”¨ä¸Šäº†ReactJS本身的所有核心功能和设计思路,Native的开发也足够简单。

       é‚£ï¼ŒReact Native是什么?

       å…¶å®žè¿™ä¸œè¥¿ä»ŽNative开发来说,相当于重新发明了一个浏览器渲染引擎并且套一个React的壳,从Web开发角度来说,就是把原来React的后端换成了Native code来实现,就跟Flipboard最近搞的React Canvas 一样: Flipboard · GitHubreact-canvas

       React Native的优势和劣势::

       ä¼˜åŠ¿ç›¸å¯¹Hybird app或者Webapp:

       1. 不用Webview,彻底摆脱了Webview让人不爽的交互和性能问题

       2. 有较强的扩展性,这是因为Native端提供的是基本控件,JS可以自由组合使用

       3. 可以直接使用Native原生的「牛逼」动画(在FB Group这个app里面,面板滑出带一点果冻弹动,面板基于某个点展开这种动画随处可见,这种动画用Native code来做小菜一碟,但是用Web来做就难上加难)。

       ä¼˜åŠ¿ç›¸å¯¹äºŽNative app:

       1. 可以通过更新远端JS,直接更新app,不过这快成为各家大型Native app的标配了…

       åŠ£åŠ¿ï¼š

       1. 扩展性仍然远远不如web,也远远不如直接写Native code(这个不用废话解释了吧)

       2.

       ä»ŽNative到Web,要做很多概念转换,势必造成双方都要妥协。比如web要用一套CSS的阉割版,Native通过css-layout拿到最终样

       å¼å†è½¬æ¢æˆnative原生的表达方式(比如iOS的Constraint\origin\Center等属性),再比如动画。另外,若Android和

       iOS都要做相同的封装,概念转换就更复杂了。

       æ›´æ–°1:添加了React对React Native的影响。

       æ›´æ–°2:基本确定其使用了 css-layout,添加了对React Native的总结

       æ›´æ–°3: React native已经开源了: React Native,只有iOS版。我写了几个demo,简单看了看objc代码并和开源前的我们的一些结论(见后文)交叉验证。简单地从前端工程师和系统整体角度说一下React native的特点和优劣吧。

       æ›´æ–°4: 补充了几条优势和与前端开发的对照

关键词:驾驶舱源码

copyright © 2016 powered by 皮皮网   sitemap