React Native安装与环境配置

安装依赖

按照官方的说法,必须安装的依赖有Node、Watchman 和 React Native 命令行工具以及 Xcode。

Node, Watchman

官方推荐使用Homebrew来安装 Node 和 Watchman。
安装Homebrew:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装 Node 和 Watchman:

brew install node
brew install watchman

如果你已经安装了 Node,检查node版本号(node -v ),但不是最新的版本,输入一些命令进行更新,或者直接去进行下载

npm config set registry https://registry.npm.taobao.org --global
npm config set disturl https://npm.taobao.org/dist --global

Watchman则是由 Facebook 提供的监视文件系统变更的工具。安装此工具可以提高开发时的性能(packager 可以快速捕捉文件的变化从而实现实时刷新)。

Yarn、React Native 的命令行工具(react-native-cli)

Yarn是 Facebook 提供的替代 npm 的工具,可以加速 node 模块的下载。React Native 的命令行工具用于执行创建、初始化、更新项目、运行打包服务(packager)等任务。但是在这里,并没有去集成Yarn,依然使用的是npm工具。

npm install -g yarn react-native-cli

到这里为止React Native的依赖环境基本已经配置好了。

Xcode

Xcode的命令行工具​​​​​​​

React Native 目前需要Xcode 9.4 或更高版本。启动 Xcode,并在Xcode | Preferences | Locations菜单中检查一下是否装有某个版本的Command Line Tools。Xcode 的命令行工具中包含一些必须的工具,比如git等。

React Native创建新项目

创建新项目

使用 React Native 命令行工具来创建一个名为"AwesomeProject"的新项目:

cd /Users/zq/Desktop/Test 
react-native init AwesomeProject

编译并运行 React Native 应用

cd AwesomeProject
react-native run-ios

官方说很快就应该能看到 iOS 模拟器自动启动并运行你的项目,其实并不是这样的,第一次运行的时长长的让人崩溃,但是我们依然的坚持等待。

Xcode

Xcode的命令行工具​​​​​​​

React Native 目前需要Xcode 9.4 或更高版本。启动 Xcode,并在Xcode | Preferences | Locations菜单中检查一下是否装有某个版本的Command Line Tools。Xcode 的命令行工具中包含一些必须的工具,比如git等。

React Native创建新项目

创建新项目

使用 React Native 命令行工具来创建一个名为"AwesomeProject"的新项目:

cd /Users/zq/Desktop/Test 
react-native init AwesomeProject

编译并运行 React Native 应用

cd AwesomeProject
react-native run-ios

官方说很快就应该能看到 iOS 模拟器自动启动并运行你的项目,其实并不是这样的,第一次运行的时长长的让人崩溃,但是我们依然的坚持等待。


iOS的原生项目集成ReactNative

配置项目目录结构

在我们已经创建好的工程中,创建一个ReactNativeComponent的文件夹,进行备用.如图:

在ReactNativeComponent目录中创建package.json文件,并填入一下内容:

{
  "name": "ReactNative",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node node_modules/react-native/local-cli/cli.js start"
  }
}

注意:"name": "ReactNative" ,ReactNative是项目名,需要改成你自己的工程名

打开终端,然后cd ReactNativeComponent的目录路径,如下:

cd /Users/zq/Desktop/ReactNative/ReactNativeComponent 

然后运行下列命令来安装:

npm add react-native

这样默认会安装最新版本的React Native,同时会打印出类似下面的警告信息(你可能需要滚动屏幕才能注意到):

警告“react-native@0.52.2”有未满足的同伴依赖“react@16.2.0”。

这是正常现象,意味着我们还需要安装指定版本的React(箭头指向的位置):

npm add react@16.8.3

配置CocoaPods的依赖

在终端中cd 工程目录,然后输入pod init创建Podfile文件,然后在Podfile文件中输入需要集成的文件,如下:

 # 'node_modules'目录一般位于根目录中
 # 但是如果你的结构不同,那你就要根据实际路径修改下面的`:path`
 pod 'React', :path => './ReactNativeCompent/node_modules/react-native', :subspecs => [
 'Core',
 'CxxBridge', # 如果RN版本 >= 0.47则加入此行
 'DevSupport', # 如果RN版本 >= 0.43,则需要加入此行才能开启开发者菜单
 'RCTText',
 'RCTNetwork',
 'RCTWebSocket', # 调试功能需要此模块
 'RCTAnimation', # FlatList和原生动画功能需要此模块
 # 在这里继续添加你所需要的其他RN模块
 ]
# # 如果你的RN版本 >= 0.42.0,则加入下面这行
 pod 'yoga', :path => './ReactNativeCompent/node_modules/react-native/ReactCommon/yoga'
#
 # 如果RN版本 >= 0.45则加入下面三个第三方编译依赖
 pod 'DoubleConversion', :podspec => './ReactNativeCompent/node_modules/react-native/third-party-podspecs/DoubleConversion.podspec'
 pod 'glog', :podspec => './ReactNativeCompent/node_modules/react-native/third-party-podspecs/glog.podspec'
 pod 'Folly', :podspec => './ReactNativeCompent/node_modules/react-native/third-party-podspecs/Folly.podspec'

⚠️路径一定不要写错,node_modules的路径要和自己项目的目录匹配(ReactNativeCompent要改为自己所创建的文件名)。

如果在你终端中输入pod install命令,爆出一下错误,恭喜你路径写错了,你需要再仔细检查一下你的文件路径了。

pod 集成这一部分比是较耗时的,但是一定要耐心等待,毕竟好事多磨。

代码集成

现在我们已经准备好了所有依赖,可以开始着手修改原生代码来把React Native真正集成到应用中了。

创建一个index.js文件

首先在ReactNativeCompent目录下创建一个空的index.js文件。

添加你自己的React Native代码

index.js中添加你自己的组件。我们这里只是简单的添加一个<Text>组件,用然后一个带有样式的<View>组件把它包起来。

import React from 'react';
import {AppRegistry, StyleSheet, Text, View} from 'react-native';

class RNHighScores extends React.Component {
  render() {
    var contents = this.props['scores'].map((score) => (
      <Text key={score.name}>
        {score.name}:{score.value}
        {'\n'}
      </Text>
    ));
    return (
      <View style={styles.container}>
        <Text style={styles.highScoresTitle}>2048 High Scores!</Text>
        <Text style={styles.scores}>{contents}</Text>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#FFFFFF',
  },
  highScoresTitle: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  },
  scores: {
    textAlign: 'center',
    color: '#333333',
    marginBottom: 5,
  },
});

// 整体js模块的名称
AppRegistry.registerComponent('RNHighScores', () => RNHighScores);

3、JS调用

首先导入RCTRootView的头文件

#import <React/RCTRootView.h>

然后调用JS文件

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    NSLog(@"High Score Button Pressed");
    NSURL *jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.bundle?platform=ios"];

    RCTRootView *rootView =
    [[RCTRootView alloc] initWithBundleURL: jsCodeLocation
                                moduleName: @"RNHighScores"
                         initialProperties:
     @{
       @"scores" : @[
               @{
                   @"name" : @"Alex",
                   @"value": @"42"
                   },
               @{
                   @"name" : @"Joel",
                   @"value": @"10"
                   }
               ]
       }
                             launchOptions: nil];
    UIViewController *vc = [[UIViewController alloc] init];
    vc.view = rootView;
    [self presentViewController:vc animated:YES completion:nil];
}

为了保证能正常连接本地启动的 rn 服务器,需要在 info.plist 文件中添加以下内容

运行

到这里并不是所有工作已经完成,可以放心运行项目了,我们还有最后的工作需要做。

运行之前我们还需要开启服务器,很简单,只需两步:

1、cd /Users/zq/Desktop/ReactNative/ReactNativeComponent 
2、npm start

如果出现一下结果,就代表服务器已经成功打开了。

现在就可以放心的运行项目了。运行结果如下:

参考资料

React Native中文网:https://reactnative.cn/docs/integration-with-existing-apps/

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

推荐阅读更多精彩内容