我正在建立一个webapp和ios / android(同一个应用程序)。起初我认为cordova可能是一个不错的选择,然后在阅读后我认为React-native可能是更好的选择。
我的问题是:我是否必须两次编写相同的应用程序(一个针对网络做出反应,另一个针对移动设备做出反应)?
我已经看过一些可以分享网络反应原生成分的图书馆,但我觉得我会受到限制。
你怎么看?编辑:还有一个问题 有了反应,我会使用flux(现在可能是redux)我应该做些什么来保持我的本机应用程序的清洁和可读性,我的意思是我应该如何在那里管理数据呢?谢谢你的回答
答案 0 :(得分:7)
现在做同样的事情 - 我没有共享代码库,因为网络/移动应用程序的内容不同 - 我使用网络管理和移动应用程序来查看内容。
答案 1 :(得分:7)
React native使用本机视图UIView,Text等进行显示。您不能拥有相同的代码库。 React native使用flex box(它有自己的实现),因此也不适用于web反应项目。
唯一的办法就是让它们保持独立。而Web和App也会有不同的设计。
答案 2 :(得分:5)
虽然确实无法使用完全相同的代码进行反应本机和反应JS,但您可以构建代码库以尽可能多地重用代码。看看这个项目:
https://github.com/benoitvallon/react-native-nw-react-calculator
答案 3 :(得分:5)
现在你无法共享代码库b / w React Native / React代码,因为一个依赖于本机UI代码和其他html DOM。有一个有趣的项目将两者结合起来(https://github.com/necolas/react-native-web),但它绝不是生产准备好的。
答案 4 :(得分:5)
我知道这可能是一个迟到的答案,但将来会有所帮助。检查https://github.com/este/este,它有不同的移动,Web和服务器堆栈。您可以在公共文件夹中使用常用组件。它使用firebase作为后端服务,但您可以更改为任何服务。
答案 5 :(得分:3)
您实际上可以在React-Native中使用WebView组件使用相同的代码。
这是一个链接: https://facebook.github.io/react-native/docs/webview.html
答案 6 :(得分:3)
React Native依赖于Native UI代码而不是html,这意味着必须重写所有视图组件。但是,如果您将所有逻辑都放在Web应用程序中的“哑”功能组件之外,那么您应该能够重用大部分Web代码。
例如,您可能有一个外部容器,它使用componentDidMount处理您想要在mount上发生的任何事情,处理和定义onClicks,并确定要呈现的视图组件。这个代码在Web和移动设备中可以完全相同,然后您的“哑”功能视图组件会有所不同,因为一个使用本机视图元素而另一个使用HTML。
答案 7 :(得分:2)
网络应用和本机应用的代码可以相同(或者您可以使用WebView包装作为应用)。我想你会问,因为两个接口的功能都是一样的。外观和感觉可以(几乎)相同。
如果您将应用仅视为视图,则可以与多个平台共享后端(控制器和型号)。您还可以尝试后端即服务,如Firebrand或Parse。对于redux部分,这不是一个真正的答案,但这是一个很容易获得kickstart的方法。
答案 8 :(得分:2)
我绝对认为你可以重用一些代码。如果您正在使用redux,如果您有一些复杂性,那么您可能会使用redux - 诸如动作和减速器之类的东西很容易重复使用。虽然UI组件本身不可重用,但您总是可以重用一些支持它的东西。 就像timvp提到的那样,你也可以使用WebViews来重用代码,但我不建议这样做,因为它总是与本机模块没有相同的性能。
答案 9 :(得分:2)
我建议你看看Redux架构。
您可能会获得以下文件夹架构:
.
└── src
├── actions
├── components
├── containers
└── reducers
如果组织好代码,react-native特定组件将只位于组件文件夹中。
所有逻辑甚至组织都是可重用的。
您将使用普通html而不是本机组件重写组件。还有应用程序入口点,因为它们是不同的,但我发现这不是一个非常大的问题。
更多redux示例https://github.com/reactjs/redux/tree/master/examples
回答第二个问题:Redux是州(数据)经理。 它以单向方式流动。
例如,您如何处理用户点击?
以下是redux flow https://code-cartoons.com/a-cartoon-intro-to-redux-3afb775501a6#.z0bcil3i0
的完整解释为了更好地理解为什么这个混乱很棒,请阅读http://redux.js.org/
答案 10 :(得分:2)
您可以在React和React Native之间共享大部分代码(特别是如果您使用react-native-web。
试试这篇文章:http://jkaufman.io/react-web-native-codesharing/ 它给出了一个非常巧妙的例子,说明了如何做到这一点。
我强烈建议您保留大部分域逻辑(API调用,通量,甚至智能组件处理逻辑)并仅重写处理视图的哑组件,以便您可以为桌面或移动实现最佳的UX
您可以像下面这样命名您的哑组件视图文件:
MyComponent.js(适用于您的网络应用) MyComponent.native.js(适用于您的原生应用)或MyComponent.ios.js& MyComponent.android.js,如果您根据平台有不同的视图。
答案 11 :(得分:1)
简短的回答是......
使用React的某些功能创建
React Native 以编码Application,而创建 React 以执行网站和Web应用程序,因此它们在性质,语法和图书馆都使用,所以基本上你需要重写你应用程序的某些部分,我可以说 20%到 70%%,这实际上取决于。
我将 React Native 和 React 与来自两者的一些代码示例进行比较,您可以检查差异,但只是让您知道,对于实际的应用程序,差异可能比你在这里看到的要多得多:
React Native
React Native允许您仅使用构建移动应用程序 JavaScript的。它使用与React相同的设计,让你组成一个 来自声明组件的丰富移动UI。
import React, { Component } from 'react';
import { Text, View } from 'react-native';
class WhyReactNativeIsSoGreat extends Component {
render() {
return (
<View>
<Text>
If you like React on the web, you'll like React Native.
</Text>
<Text>
You just use native components like 'View' and 'Text',
instead of web components like 'div' and 'span'.
</Text>
</View>
);
}
}
更多信息here
阵营
React使创建交互式UI变得轻而易举。设计简单的视图 对于您的应用程序中的每个状态,React将有效地更新 并在数据发生变化时呈现正确的组件。
声明性视图使您的代码更易于预测且更易于调试。
import React, { Component } from 'react';
class HelloMessage extends React.Component {
render() {
return (
<div>
<p>If you like React Native on the devices, you'll like React.</p>
<p>You just use web components like 'div' and 'span',
instead of native components like 'View' and 'Text'.</p>
</div>
);
}
}
ReactDOM.render(<HelloMessage name="Jane" />, mountNode);
更多信息here
答案 12 :(得分:1)
我想知道为什么没有人提到ReactXP
。 ReactXP
是
由Microsoft 维护的库,可让您使用React
创建web,ios,andoid和Windows应用程序:
XP意味着X-Platform 在Web,iOS,Android和Windows之间共享大部分代码。
https://microsoft.github.io/reactxp/
提到的其他选项是
答案 13 :(得分:0)
React Native仅适用于应用程序,它生成完全本机组件,React Native具有其组件的特定语法。 使用一些软件包将React Native代码库加入到web中将是不值得的,因为您将受到限制,并且您反对React Native流程,它与将Swift或Java编写的应用程序转换为Web程序包相同。它不是最优和有限的。
这是您学习javascript和使用React(或您选择的任何其他库/框架)的美丽,您可以使用Web体验编写最好的Web应用程序,同时使用您在JS上的知识,您可以提供完全本机体验到你的应用程序。
这就是接近做网络和原生的关键 - 你可以使用相同的核心语言,并在这两个世界提供最好的体验。
答案 14 :(得分:0)
Text
,View
,ScrollView
,ListView
等,除此之外,它们是几乎一样。
所以,您可以像这样组织代码:
root
src
lib // code for all other three platform
android // code for android only
ios // code for ios only
web // code for web only
index.js //for web
index.ios.js // for ios
index.android.js // for android
答案 15 :(得分:0)
您可以使用相同的JavaScript代码共享业务逻辑(只需复制代码即可)。另一方面,由于硬件的特性,为Web(主要在台式机/笔记本电脑浏览器上)和移动(本机)上使用不同的表示层是完全正常的。
您可以以react-spa-jwt-authentication-boilerplate(*)为例。它通过保留common-logic
文件的精确副本,通过名为*.js
的文件夹在Web版本和本机版本之间共享“业务逻辑”。另一方面,导航和表示层不同。它实现了一个示例身份验证过程,该过程本身也可以用作新项目的基准。
(*)Disclimer:我是仓库的实现者。我们确实需要实施回购协议,以减少移动和Web应用程序之间的开发时间。