对于现有的大多数项目来讲都不是从头构建的,而要在原有项目的基础上引入React Native则确定和用react-native init xxx
建立工程不一样。所以下面就来讲下具体操做。不过在真正开始以前仍是要先说明一下工具配置。javascript
配置方法以下:java
npm config set registry https://registry.npm.taobao.org --global npm config set disturl https://npm.taobao.org/dist --global
通常地,咱们能够在项目根目录下建立package.json文件以及index.android.js文件。node
{ "name": "XXX", "version": "0.0.1", "private": true, "scripts": { "start": "node node_modules/react-native/local-cli/cli.js start", "test": "jest" }, "dependencies": { "react": "16.0.0", "react-native": "0.50.3", "react-native-device-info": "^0.12.1" }, "devDependencies": { "babel-jest": "21.2.0", "babel-preset-react-native": "4.0.0", "jest": "21.2.1", "react-test-renderer": "16.0.0" }, "jest": { "preset": "react-native" } }
import React,{Component} from 'react'; import { AppRegistry,View,Text, } from 'react-native'; class App extends Component{ //...其余方法 render(){ return( <View> <Text>this is React Native Page</Text> </View> ); } //...其余方法 } AppRegistry.registerComponent('XXX', () => App);
而后,在该目录下打开终端,运行 npm i
命令,安装React Native 所需的依赖,安装完成后会在根目录下建立node_modules文件夹,下载的依赖就在这个文件夹下。到此,第一步的工做已经完成了。react
-----分割线------
实际上咱们不会将RN代码放到Android工程里,由于在通常的公司项目中,使用SVN或者Git进行管理,客户端目录下通常都会有Android和iOS两个目录区分两个端。而React Native做为一个跨平台的框架,放在Android或者iOS目录里都不太合适。所以我的认为比较好的作法是在Android和iOS同级目录建立一个ReactNative目录,放置RN项目的代码。所以目录结构大体以下:android
. ├──Android ├──trunk ├──branches └──tags ├──iOS ├──trunk ├──branches └──tags └──ReactNative ├──trunk ├──branches └──tags
此时,RN项目的代码包括package.json文件以及index.android.js文件都是在trunk目录下,天然地,须要在trunk目录打开终端,运行运行 npm i
命令,安装React Native 所需的依赖,而node_modules文件夹也天然会在该文件夹内建立。nginx
首先编辑在项目目录下build.gradle文件。npm
allprojects { repositories { google() jcenter() //添加这个仓库 maven { // All of React Native (JS, Android binaries) is installed from npm url "$rootDir/node_modules/react-native/android" } } }
而后在编辑app目录下的build.gradle文件,添加React Native依赖。json
implementation 'com.facebook.react:react-native:0.50.3'
注意该版本号须要与package.json文件中配置的RN版本号保持一致。
之因此须要在项目的build.gradle文件中添加maven配置,是由于Android项目默认的依赖包的源jcenter()并不包含最新版的React Native(它只到0.20.1)。react-native
与第一种状况并没有太大区别,只是RN的maven仓库路径有所不一样。由于经过版本控制拉取下来的工程位置各有不一样,为了不开发人员对项目目录下的build.gradle文件编辑冲突,推荐使用以下方式:服务器
//加载local.properties配置 Properties properties = new Properties() InputStream inputStream = project.rootProject.file('local.properties').newDataInputStream(); properties.load(inputStream) allprojects { repositories { jcenter() maven { // All of React Native (JS, Android binaries) is installed from npm url properties.getProperty('reactnative.dir') } } }
其中local.properties
文件不须要提交版本控制,并在其中添加一个reactnative.dir属性,属性值为RN的android工程目录路径,例如在个人项目中
reactnative.dir=/Users/littlebyte/svn/ReactNative/ReactNative/node_modules/react-native/android
public class MyReactActivity extends ReactActivity {
@Override protected String getMainComponentName() { //该返回值须要与N程序的入口文件index.android.js中的注册的名字相同 return "XXX"; }
}
与Activity不一样,在Fragment中加载RN有点不同。但在Android中加载RN,不管是在Activity仍是Fragment,加载的都只是一个View而已。而给Fragment设置View,只须要Fragment的onCreateView返回RN的View便可。代码以下:
public class MyFragment extends Fragment { public static final String COMPONENT_NAME = "MyFragment"; private ReactRootView mReactRootView; @Override public void onAttach(Context context) { super.onAttach(context); mReactRootView = new ReactRootView(context); mReactRootView.startReactApplication( getReactNativeHost().getReactInstanceManager(), COMPONENT_NAME, null); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); return mReactRootView; } @Override public void onDestroy() { super.onDestroy(); if (mReactRootView != null) { mReactRootView.unmountReactApplication(); mReactRootView = null; } if (getReactNativeHost().hasInstance()) { getReactNativeHost().getReactInstanceManager().onHostDestroy(getActivity() ); } } protected ReactNativeHost getReactNativeHost() { return ((ReactApplication) getActivity().getApplication()).getReactNativeHost(); } public ReactInstanceManager getReactInstanceManager() { return getReactNativeHost().getReactInstanceManager(); } }
然后Fragment该怎么用就怎么用。
修改自定义的 Application ,实现 ReactApplication 接口。
public class MainApplication extends Application implements ReactApplication { public final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { @Override public boolean getUseDeveloperSupport() { return BuildConfig.DEBUG; } @Override protected List<ReactPackage> getPackages() { return Arrays.<ReactPackage>asList( new MainReactPackage() ); } }; @Override public ReactNativeHost getReactNativeHost() { return mReactNativeHost; } }
RN须要添加如下权限:
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
除了声明自定义的Activity,还须要添加DevSettingsActivity,用来修改RN的相关设置。
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity"/>
至此,Android原生项目集成RN的工做就基本完成了。
要调试首先须要启动RN的本地服务器。在package.json
文件所在目录打开终端,运行react-native start
命令便可启动本地服务器。而后安装并运行App。
若是使用模拟器调试则能够直接运行打开RN的页面,而若是使用真机调试还须要摇一摇弹出设置菜单,点击Dev Settings,设置Debug server host&port for device,填入你电脑的ip:8081
便可。以后就能够愉快的调试运行了。