我见过天堂。 它是用JavaScript编写的。

为什么React Native是未来

我有一种怪异的软件描述方式。 而且您要么知道我的意思,要么您不知道。 有点奇怪,但是软件界面感觉很重 。 使用界面时,它可能会感到沉重,或者感觉到光线较轻。 两者都不比另一个更好。 这只是取决于。 铬很轻。 Safari感觉较重。 Firefox感觉最重。 可能是胡说八道,但这就是我的感觉。

在我的软件开发生涯中,最重的感觉之一就是在Xcode中使用Swift。 哦,好痛。 延时。 Kanye-West编译器永远不会让您完成。 过去几年,我一直生活在这个笨拙的世界中,以我所知道的唯一方式来构建应用程序:原始,手动,单平台代码。 本地化! 对?

当我了解React Native时,我感到怀疑。 一次用JavaScript编写代码,然后在iOS和Android上部署本机应用程序? -这很烂。 所以我忽略了它。 相反,最终写了两个单独的本机应用程序,一个在iOS的Swift中,另一个在Java / Kotlin的Android中。 这是用JavaScript编写的Web应用程序和基于Electron的桌面应用程序的补充。 (该应用程序是一个加密的跨平台笔记应用程序,因此每个平台上的可用性都是关键。)

这在一段时间内效果很好,但是有困难。 我可以编写Web应用程序和iOS应用程序,但是我对Android毫无经验。 实际上,我一生中从未使用过Android设备超过一个小时。 幸运的是,社区贡献者很乐于帮助构建基础知识,这使我放弃了从头开始编写应用程序的工作,而只是通过增量更改来维护它。

每当需要进行更改或添加功能时,我就需要进入三种不同的代码库,并用三种不同的语言编写相同的代码。 作为一个人,这并不总是很有效。 即使是最简单的跨平台更改,也可能需要一周的时间。 结果是应用程序永远无法拥有美好的事物。 例如,几个用户要求向应用程序添加密码和指纹锁定的功能,这是对具有安全意识的Notes应用程序的非常合理的要求。 但这的实现并非易事:首先,除了输入接口外,还需要密码设置接口。 然后,使用密码对离线用户数据进行加密。 然后,在移动设备上,指定何时应要求输入密码或指纹(立即或退出应用程序时)。 用Swift编写所有这些代码,然后是Java,然后是JavaScript的想法是一场噩梦。 我无法自己去做。

一定有更好的方法。

输入React Native

我必须描述为应用程序维护单独的代码库后的上下文和情感,以便您了解当我开始使用React Native时的愉悦感。 在用Atom (!)编写本机应用程序的第一周,我不屑一顾。 我简直不敢相信这是多么容易。 没有Xcode,没有Swift,可以立即重新加载更改,使用易于使用的JavaScript编写代码-我当时就在天堂。 在编写代码时,我会并排放置iOS模拟器和Android模拟器,并花了一半的时间完全无法相信一切正常。 我从来没有想过, 嗯,这在iOS上看起来不错,我想知道它是否在Android上能很好地工作? 在大多数情况下,如果它可以在一个平台上运行,则几乎无需调整即可在两个平台上运行。

最美丽的部分? 我正在从我的Web应用程序中重用全部课程! 我几乎不需要改动就可以复制涉及模型,控制器和加密逻辑批发的复杂类。 应用程序的整个同步引擎? 直接从网络应用复制。 加密和解密? 通过网络应用。 模型和关系? 通过网络应用。

我当时是如此,很高兴不从头开始编写所有这些东西。 同步很困难,加密同步也不容易。 Web /桌面代码库是我们经过测试的旗舰产品,并且能够重用这些组件的信心令人赞叹。

用户界面是使用本机IDE构建本机应用程序中最难的部分之一。 在iOS上,开发界面非常费时。 您可以通过代码来完成,但是它将涉及很多代码。 与代码相比,使用代码管理动态布局约束要困难得多。 您可以使用界面生成器,但是却失去了细粒度的控制,并且灵活性代码为您提供。 祝您在git上的Interface Builder更改上实现并合作。

在React Native中,动态接口轻而易举。 您使用类似于CSS的语法来构建您的梦想设计:

 让containerStyles = { 
backgroundColor:“红色”,
显示:“ flex”,
alignItems:“居中”,
宽度:“ 100%”
}

让childStyles = {
字体大小:14
颜色:“黑色”,
fontWeight:“粗体”
}


你好,将来。

这是在React Native中构建所有接口的基础。 它真的很简单。 还有韧皮部分?

主题。

本质上,您的整个接口都是一堆JSON属性。 您可能已经注意到,从服务器或文件中提取JSON样式的blob并完全更改应用程序的外观并不是很困难。 这就是我所做的:

您知道用本机代码很难做到吗? 只是想着这件事,我的心就很痛。

有什么收获?

在穿越天堂的旅途中,当我四面八方惊奇地发现时,我一直在想,有什么收获? 构建本机应用程序并非易事。 感觉几乎是有罪的。

现在,它既是软件,又是软件开发工具,因此没有完美的东西。 React Native仍在积极开发中,因此您将遇到一些陷阱。 我的前几个陷阱感到存在。 “拉屎! 这就是结局! 我就知道。 我知道这太真实了。 这个问题将完全炸毁我的项目。”幸运的是,没有一个无法解决的问题。

例如,我遇到的一个更烦人的问题是,React Native的TextInput组件在Android上对于Notes应用程序运行得不够好。 滚动很慢,每次滚动以阅读便笺时,它都会自动调出键盘。 极其沮丧。 我尝试了几天来通过某种方式操纵JavaScript代码来防止这两个问题,从而解决了这个问题。 但是,绝对没有任何效果。 但是我了解到,这还不是您项目的结束。 这是开始。

React Native可以让您轻松构建适用于您内心需求的本机组件。 本机组件或模块意味着您可以使用本机Swift / Objective-C或Java / Kotlin编写接口和业务逻辑,并轻松创建用于控制这些模块的JavaScript接口。 就我而言,我用Java编写了一个自定义textview模块,该模块使滚动更加流畅,并且不会将输入集中在滚动上。 这是用Android Studio编写的Java语言。 我将其导入JavaScript,并将其添加到视图层次结构中,并在React Native中添加了精美的滚动文本输入。 问题解决了。

我也将本机模块用于其他用途,包括加密模块(iOS和Android分别使用模块)和指纹认证模块。

你应该使用React Native吗?

是,是,100%是。 即使您正在构建单平台应用程序,我也将使用React Native。 感觉就像是编写应用程序的更好方法。 与使用JavaScript编写应用程序的敏捷性相比,与Swift一样新的Swift感觉荒谬而沉重。 我真的希望Apple致力于使它更易于编写出色的应用程序,而不是介绍我一段时间以来遇到的最深奥的编程语言。 Xcode是围绕Objective-C构建的,而Swift仍然感觉内部不合适。

在构建本机移动应用程序时,我能够重用Web应用程序中约70–80%的代码。 其余的是无法重复使用的接口代码。 我什至可以定位较低版本的iOS和Android。 我们最初的Swift Standard Notes应用程序使用Core Data的最新实现,因此需要iOS 10。 新的React Native实施在iOS 8和Android 5上开箱即用。

想看看React Native应用的感觉吗? 您可以下载适用于iOS和Android的成品。 您还可以检出整个源代码。 如果您对React Native开发过程有任何疑问,请随时与Twitter联络。