这篇文章的背景,网络上有很多关于rn的资源都过于陈旧,rn已经升级到0.44了,那些文章对rn的依赖还停留在0.2*,导致启动都不能成功,不得不说,对于初学者,找到合适的学习资源都是一个问题。下面的整个过程,是我从0开始运行成功的。 再者现在,多数的开源项目都是纯粹的rn项目,但是在实际的项目中,我们应用最多的场景还是在已有的原生项目中,植入rn项目,官网已经给了我们详细的步骤, 官方文档,想着按照官网步骤一步一步来应该问题不大,结果还是天真了,真的是一步一个坑啊。我用的mac机器,window同样适用,开始之前确保你的PC中已经正确安装了node.js以及Python 2。下面开始正文:
1.新建一个Android项目
注意Minimum SDk选择API16以上,一路next后finish。
2.添加JS
打开studio的Terminal窗口,输入如下命令:
npm init 会让你输入一些初始化package.json 的配置信息,例如:
按照提示输入就行了。 这一步完成之后,在项目的根目录下就会生成package.json这个文件,在dependencies中,加入rn的依赖,“react-native”: “^0.44.0”,下一步输入:
npm install react@16.0.0-alpha.6 - -save
用开安装react,然后再次输入
npm install
用来安装React Native。大约一两分钟的样子(如果卡到这里了,看看安装时是不是忘了配置镜像),完成之后你的根目录下会多了一个node_modules的文件夹,里面存放了下载好的React 和React Native。这里有童鞋可能会质疑为什么不把react的依赖直接写入package.json中,如果这么做的化,npm run start启动的时候会报如下的错误:
下一步继续输入如下命令
curl -o .flowconfig https://raw.githubusercontent.com/facebook/react-native/master/.flowconfig
如果PC中还没有安装curl命令在 这里下载,下载后记得配置好环境变量哦(也就是把bin目录下的curl命令加入到系统环境变量里),然后最重要的是重启一下studio,要不然还是无法使用curl命令。 重启studio后输入curl会出现:
说明已经安装成功了。 继续上面的步骤输入:
curl -o .flowconfig https://raw.githubusercontent.com/facebook/react-native/master/.flowconfig
用于下载.flowconfig文件。显示如下说明下载成功
接下来把如下命令粘贴到package.json 文件下 scripts标签中
”start”: “node node_modules/react-native/local-cli/cli.js start”
粘贴后的package.json文件内容如下:
下一步,在根目录下创建index.android.js文件并把如下代码粘贴到其中:
'use strict';
import React from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View
} from 'react-native';
class HelloWorld extends React.Component {
render() {
return (
<View style={styles.container}>
<Text style={styles.hello}>Hello, World</Text>
</View>
)
}
}
var styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
},
hello: {
fontSize: 20,
textAlign: 'center',
margin: 10,
},
});
AppRegistry.registerComponent('HelloWorld', () => HelloWorld);
代码很简单,居中显示一个HelloWorld。
3.项目配置
修改app的build.gradle文件添加如下内容,注意下面appcompat-v7版本为25.2.0,而且我把dependencies中test相关的依赖移除掉了,避免不必要的bug。
apply plugin: 'com.android.application'
apply from: "../node_modules/react-native/react.gradle"
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.example.lifeifei.reactnativeinit"
minSdkVersion 16
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
configurations.all {
resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:25.2.0'
compile 'com.facebook.react:react-native:+'
}
项目的build.gradle中添加依赖
allprojects {
repositories {
mavenLocal()
jcenter()
maven {
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
url "$rootDir/node_modules/react-native/android"
}
}
}
继续下一步,在AndroidManifest.xml中添加网络访问权限
<uses-permission android:name="android.permission.INTERNET" />
3.创建Activity
以下几步不要安装官网的去做,官网的步骤太麻烦,而且很久没有更新了。
1.新建一个Activity,让其继承ReactActivity,并重写getMainComponentName(),返回我们在index.android.js中注册的HelloWorld这个组件。
package com.example.lifeifei.reactnativeinit;
/**
* Created by lifeifei on 28/04/2017.
*/
import javax.annotation.Nullable;
import com.facebook.react.ReactActivity;
public class ReactNativeActivity extends ReactActivity {
@Nullable
@Override
protected String getMainComponentName(){
return "HelloWorld";
}
}
别忘了把这个activity加入AndroidManifest.xml文件中
2.自定义一个Application,继承ReactApplication ,编写以下代码:
public class App extends Application implements ReactApplication {
private 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;
}
}
记得在AndroidManifest.xml中引用
android:name=“.App”
3.在MainActivity中通过按钮启动我们的ReactNativeActivity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.start_rn_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, ReactNativeActivity.class));
}
});
}
}
4.app/src/main下新建assets文件夹。 运行如下命令
react-native start
如果卡在了这一步:
没关系,用资源管理器打开你工程的根目录,在此目录下重新运行一个命令行并在其中输入如下命令
react-native bundle - -platform android - -dev false - -entry-file index.android.js - -bundle-output app/src/main/assets/index.android.bundle - -assets-dest app/src/main/res/
完成之后assets目录下会生成以下两个文件
确认一下react native service处于运行状态,然后正常运行你的APP,点击start,如果出现
恭喜你!你已经可以开始搞混合开发了