在现有App项目中使用React-Native(译)

在现有App项目中使用React-Native(译)

原文地址

对于大部分开发者来说, React-Native是有风险的, 所以先在已有项目里, 小规模的使用, 是一个可接受的更稳妥的方案. 这也是问什么翻译了这篇文档.

没有使用Reactive Native的旧项目, 加入React Native很简单, 使用CocoaPods就可以了. 这在一定程度上得益于React Native只想做MVC中的V, 对你已经使用的其他技术栈没什么假设.

依赖的软件

  • CocoaPods 使用gem install cocoapods安装
  • io.js
    • 按照nvm安装文档安装nvm. 之后运行:
      nvm install iojs-v2 && nvm alias default iojs-v2安装最新的io.js兼容版本,并设置你的终端,这样当你输入node就会执行io.js. 使用nvm可以安装多个版本的Node和io.js, 并且方便的在各个版本之间切换.

使用CocoaPods安装React Native

CocoaPods是iOS/Mac开发中常用的一个包管理工具,下载和安装React Native要用到它. 如果你还没有安装CocoaPods, 参照这个教程

搞定CocoaPods之后, 向Podfile文件里加入下面的内容(如果没有Podfile文件,在项目的根目录下创建一个).

pod 'React'
pod 'React/RCTText'

在你的项目里增加想用的subspecs

记得安装你需要的subspecs, 如果不加入React/RCTText, 是不能使用<Text>元素的.
然后安装你的pods
$ pod install

创建你的React Native App

React Native App分两部分:

  1. Javascript文件: 包含你实际React NativeApp和其他组件.
  2. Objective-C封装: 加载脚本文件并显示和管理React Native组件.
    第一步, 为app的React代码创建一个目录, 创建index.ios.js

$ mkdir ReactComponent
$ touch ReactComponent/index.ios.js

复制下面的代码,粘贴到index.ios.js - 它是一个骨架React Native app

'use strict';

var React = require('react-native');
var {
  Text,
  View
} = React;

var styles = React.StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: 'red'
  }
});

class SimpleApp extends React.Component {
  render() {
    return (
      <View style={styles.container}>
        <Text>This is a simple application.</Text>
      </View>
    )
  }
}
React.AppRegistry.registerComponent('SimpleApp', () => SimpleApp);

SimpleApp是模块的名字, 后面会用到.

将容器视图加到你的App里

使用一个View作为React Native的容器, 只要是UIView的子类就可以.

容器视图示例
容器视图示例

为了代码干净一些, 创建一个UIView的子类ReactView.

// ReactView.h 

#import <UIKit/UIKit.h>
@interface ReactView : UIView
@end

在管理这个视图控制器里, 加入这个视图.

// ViewController.m

@interface ViewController ()
@property (weak, nonatomic) IBOutlet ReactView *reactView;
@end

这里为了简化, 禁用了AutoLayout. 在实际的项目里, 你应该打开AutoLayout并且设置好约束.

将RCTRootView 加入容器View

下面将是最有趣的部分, 我们将创建RCTRootView, React Native app就住在里面.

在ReactView.m里, 我们首先需要利用你的index.ios.bundle的URI来初始化你的RCTRootView. index.ios.bundle将被React Native打包器将创建, 并由服务器提供.

NSURL *jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle"];
// 为了应用, `NSURL` 也可以指向一个本地磁盘的文件:
//
//   NSURL *jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
//
// 要生成url对应的文件, 可以使用下面的命令
//
//   curl http://localhost:8081/index.ios.bundle -o main.jsbundle
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
                                                    moduleName: @"SimpleApp"
                                                 launchOptions:nil];

然后将它作为子视图加入ReactView

[self addSubview:rootView];
rootView.frame = self.bounds;

启动开发服务器

在根目录下, 启动React Native 开发服务器.

(JS_DIR=`pwd`/ReactComponent;cd Pods/React;npm run start -- --root $JS_DIR)

这个命令会启动React Native 的开发服务器并编译我们的脚本. —root选项指示React Native应用的根, 就是包含了index.ios.js文件的目录.

运行中的服务器会打包出index.ios.bundle文件, 通过http://localhost:8081/index.ios.bundle.可以访问到.

编译和运行

现在编译和运行你的应用, 你会看到你的React Native运行再ReactView里面.

示例
示例

也可以从模拟器中实时加载! 你拥有了一个简单的React组件, 完全封装在Objective-C的 UIView的子类后面.

总结

在这种情况下, 当RCTRootView初始化, 它将尝试下载,解析并运行脚本文件. 这就是说你只需要实现RCTRootView的容器视图或者控制器.RCTRootView负责渲染你的React组件.

示例的完整的源代码再这里

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容