±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcnblogs,ÎÄÕÂÏÈ·ÖÎöÁËÔÒò£¬È»ºó½éÉÜÁË·þÎñÆ÷´î½¨£¬½Ó×ÅiosºÍAndroidÁ½¸ö·½Ãæ½éÉÜÁ˼¯³ÉµÈæ¸æ¸µÀÀ´¡£ |
|
ÒÆ¶¯¿ª·¢ÖУ¬native¿ª·¢ÐÔÄܺÍЧ¹ûÉÏÎÞÒÉÊÇ×îºÃµÄ¡£
µ«ÊÇÔÚÖÚ¶àµÄÇé¿öÏ£¬native¿ª·¢²¢²»ÊÇ×îÓŵÄÑ¡Ôñ¡£µ±ÐèÇó¾³£¸Ä¶¯µÄʱºò£¬µ±Ô¤ËãÓÐÏÞµÄʱºò£¬µ±deadlineºÜ½üµÄʱºò£¬native¿ª·¢µÄ³É±¾Ò²¾ÍÌåÏÖ³öÀ´ÁË¡£
Õâʱºò£¬webview¿ªÊ¼´ó·ÅÒì²Ê£¬¿ìËÙ¿ª·¢¡¢ÎÞÐèÖØÐ·¢²¼°æ±¾¡¢ÈËÔ±³É±¾µÍµÄÌØµã¾ÍÏÔÏÖ³öÀ´ÁË¡££¨ÕâÀï²»Ö¸hybrid£©¡£
µ±Ê¹ÓÃWebViewºó£¬¾Í»áÖð½¥·¢ÏÖ£¬Óû§ÌåÑé±äµÃÒ»ËúºýÍ¿£¬³¤Ê±¼äµÄloading¡¢²Ù×÷domÔì³ÉµÄÐÔÄÜÎÊÌâµÈµÈµÈµÈ¡¤¡¤¡¤
react native³öÏֺ󣬿ª±ÙµÄÒ»ÌõеĵÀ·¡£
#0 ·ÖÎöÒ»ÏÂÏÂ
¹«Ë¾ÏÖÔڵIJúÆ·¾ÀúÁË2¸ö´óµÄ°æ±¾¸üк󣨴¿nativeºÍ²¿·ÖWebView£©£¬ÏÖÔÚÒª¾ÀúµÚÈý¸öÖØ´ó°æ±¾µÄÉý¼¶ÁË¡£µ«Õâ´Î°æ±¾³öÏÖÁËһЩÇé¿ö¡£
°æÃæÈ«²¿¸üС¢ÈËÔ±ÓÐÏÞ¡¢Ô¤ËãÓÐÏÞ¡¢¿ª·¢Ê±¼ä¶Ì¡£Õâ¾ÍÊÇÃæÁÙµÄÎÊÌâËùÔÚ¡£
hybridÊÇÒ»ÕûÌ׵Ľ«htmlתΪnativeµÄ¿ª·¢·½Ê½£¬µ«Ê¹Óô˷½·¨½«»áÃæÁÙµÄÎÊÌâÊÇ£ºÈ«²¿ÏîÄ¿ÐèÒªÍÆ·ÖØ×ö¡¢Ã»ÓÐ×ö¹ý´ËÀ࿪·¢¡¢Ã»ÓоÑé¡£Õâ¶ÔÎÒÃÇÀ´ËµÊÇÒ»¸öºÜ´óµÄðÏÕ¡£·ñ¾ö£¡
ºóÐøÌÖÂÛºó£¬Ê¹ÓÃnative½øÐпò¼Ü·½ÃæµÄ´î½¨£¬´óÁ¿Ê¹ÓÃwebview½øÐйý¶É£¬¿ªÊ¼Öð²½½ÓÈëreact
native¡£
ÕâÑùµÄºÃ´¦¾ÍÊÇ»ù´¡ÄÚÈÝÈÔÈ»Ôڿɿط¶Î§ÄÚ£¬¿É´óÁ¿Öظ´Ê¹ÓÃ֮ǰµÄ´úÂë¡£´óÁ¿Ê¹ÓÃwebviewÊÇΪÁ˱£Ö¤ÏîÄ¿¿ÉÒÔÔڹ涨ʱ¼äÄڸϹ¤Íê³É¡¤¡¤¡¤´¿ÊôÎÞÄÎÖ®¾Ù¡£
ʹÓÃreact nativeÊÇΪÁ˺óÐøÖð²½Ìæ´úwebview¶ø½øÐеġ£ÓÉÓÚÔÚrn·½ÃæÃ»ÓкÜ×ãµÄ¾Ñ飬ֻÄÜÒ»²½Ò»²½µÄÀ´£¬²»¸ÒÒ»´ÎÐÔÒýÈëÌ«¶à¡£
rnµÄºÃ´¦¾ÍÊÇÔÚÓÚ¿ÉÒÔÔÚÒÑÓеÄÏîÄ¿ÖнÓÈ뿪·¢£¬¶ø²»ÏñhybridÄÇÑù£¬ÐèҪȫ²¿Ìæ»»²Å¿ÉÒÔʹÓá£ÕâÑù¾Í¿ÉÒÔ±£Ö¤µ±rnÓöµ½¿ÓÎÞ·¨½â¾öµÄʱºò£¬¿ÉÒÔÓýÏÉٵĴú¼ÛÌæ»»»Ønative£¬±£Ö¤ÏîÄ¿µÄ¿É¿ØÐÔ¡£
#1 react native¿ª·¢·þÎñÆ÷
¿ª·¢Ê±£¬»¹ÊÇʹÓ÷þÎñÆ÷À´×°ÔØÄÚÈݽÏΪ·½±ã¡£ÕâÀïʹÓõÄÊÇubuntu server 14.04¡£
ÕâÀﻹÊÇÌáÒ»¾ä£¬rnÊÇÈçºÎ¹¤×÷µÄ¡£
ÔÚ¿ª·¢Ê±£¬ÎÒÃǵĿò¼ÜÊÇÕâÑùµÄ£º

µ±Õýʽ·¢²¼½øÈëµ½Éú²ú»·¾³Ê±£¬¿ª·¢·þÎñÆ÷ÉÏËùÓеÄjsÎļþ½«»á±»±àÒë³É°üµÄÐÎʽ£¬Ö±½ÓǶÈëµ½¿Í»§¶ËÄÚ¡£Õâʱ£¬ÒѾ²»ÔÙÐèÒª¿ª·¢·þÎñÆ÷µÄÖ§³ÖÁË¡££¨ÈȸüкóÐø¼ÌÐøÐ´£©
#2 ÏêϸµÄ´î½¨²½×à
#2.0 ·þÎñÆ÷´î½¨
ÓÉÓÚ×ʽðÓÐÏÞ£¬ËùÒÔÖ±½Ó¸ãµÄÐéÄâ»ú£¬°²×°µÄubuntu server£¬»ù´¡ÉèÖ㺰²×°µÄnode°æ±¾ÊÇv5.8.0¡£

ÕâÀï¾Í²»ÏêϸµÄ½²½ânodeÈçºÎ°²×°ÁË¡¤¡¤¡¤´ó¼Ò×ÔÐвéÕÒ¡¤¡¤¡¤ÍøÉϺܶࡤ¡¤¡¤
Ê×ÏȰ²×°WatchmanºÍFlow
git clone https://github.com/facebook/watchman.git
cd watchman
git checkout v4.1.0 # the latest stable release
./autogen.sh
./configure
make
sudo make install
sudo npm install -g flow-bin |
¾ßÌå·½·¨Ïê¼û£ºhttps://facebook.github.io/react-native/docs/getting-started-linux.html#getting-started-on-linux
£¨ºóÃæµÄ°²×°android²»ÐèÒª£©
È»ºó´´½¨Ò»¸ö´æ·Å´úÂëµÄĿ¼£¬±ÈÈçÎÒµÄĿ¼ÊÇ£º/var/react/tykReact
Çл»µ½´ËĿ¼Ï£¬Ö´ÐÐÏÂÃæÓï¾ä½øÐгõʼ»¯ÉèÖá£
Èç¹û´ËÓï¾äÔÚÉèÖÃʱ²»Ì«»áÓ㬿ÉÔÚĿ¼Ï´´½¨package.jsonÎļþ£¬ÎļþÖеÄÄÚÈÝÈçÏ£º
{
¡¡¡¡"name": "tykReact",
¡¡¡¡"version": "1.0.0",
¡¡¡¡"description": "",
¡¡¡¡"main": "index.js",
¡¡¡¡"scripts": {
¡¡¡¡¡¡¡¡"start": "node_modules/react-native/packager/packager.sh"
¡¡¡¡},
¡¡¡¡"author": "LunaGao",
¡¡¡¡"license": "MIT",
¡¡¡¡"dependencies": {
¡¡¡¡¡¡¡¡"react-native":"^0.20.0"
¡¡¡¡}
} |
×¢Ò⣺
1. dependenciesϵÄ"react-native":"^0.20.0"ÊDZØÐëµÄ£¬Ö±½Ónpm
install react-native°²×°ÔÚºóÐø»á³öÏÖÎÊÌâ¡£
2. scriptsϵÄ"start": "node_modules/react-native/packager/packager.sh"ÊÇΪÁËÆô¶¯Ê¹Óõġ££¨Ò²¿ÉÒÔ²»Óã©
´Ëʱ£¬¾Í¿ÉÒÔÖ´ÐÐÒÔÏÂÓï¾ä½øÐÐÏÂÔØreactÁË¡£
npm install
Õâ¸öʱ¼ä±È½Ï³¤£¬ÐèÒªÄÍÐĵȴý£¨ÎÒÏÂÔØÁË1¸öСʱ...£©¡£µ±È»£¬×îºÃ¼ÓÉÏsudo£¬ÒÔÃâ³öÏÖûÓÐȨÏÞµÈÎÊÌâ¡£
µ±°²×°ºÃºó£¬´´½¨Á½¸öÎļþ£ºindex.ios.jsºÍindex.android.js¡£ÕâÊÇÓÃÀ´²âÊÔʹÓõġ£
index.ios.js
'use strict';
import React, {
Text,
View
} from 'react-native';
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('TestView',
() => SimpleApp); |
index.android.js
'use strict';
import React, {
Text,
View
} from 'react-native';
class MyAwesomeApp extends React.Component
{
render() {
return (
<View style={styles.container}>
<Text style={styles.hello}>Hello, World</Text>
</View>
)
}
}
var styles = React.StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
},
hello: {
fontSize: 20,
textAlign: 'center',
margin: 10,
},
});
React.AppRegistry.registerComponent('TestView',
() => MyAwesomeApp); |
Á½¸öÎļþµÄ´úÂë²¢²»Ïàͬ£¬ÕâÊÇÖ±½Ó´Ó
https://facebook.github.io/react-native/docs/embedded-app-android.html#add-js-to-your-app
ºÍ
https://facebook.github.io/react-native/docs/embedded-app-ios.html#create-your-react-native-app
¸´ÖƶøÀ´¡£
ÖÁ´Ë£¬Ä¿Â¼ÏÂÓ¦¸ÃÊÇÈçϵÄÑù×Ó£º

ÇëºöÂÔ116221-ÕâÑùµÄÎļþºÍ11f83243da86022a90031e1ca9d758bc£¬ÕâЩÊÇ·þÎñÆô¶¯ºó×Ô¶¯Éú³ÉµÄ¡£npm-debug.log.4046290474Õâ¸öÊÇ´íÎóµÄÈÕÖ¾Îļþ¡£
ûÎÊÌâºó£¬ÎÒÃÇ¿ªÊ¼Æô¶¯·þÎñ£¬Ö´ÐÐÈçÏÂÓï¾ä£º
Õý³£µÄÇé¿öÈçÏÂͼËùʾ£º

´Ëʱ£¬´ò¿ªä¯ÀÀÆ÷£¬ÊäÈëµØÖ·½øÐзÃÎÊ£¨192.168.0.203ÊÇÎҵķþÎñÆ÷µØÖ·£¬ÐèÒªÌæ»»³Éʵ¼ÊµÄµØÖ·£¬±¾»úÔËÐпÉÖ±½ÓʹÓÃlocalhost£©£º
http://192.168.0.203:8081/index.ios.bundle?platform=ios
http://192.168.0.203:8081/index.android.bundle?platform=android |
µ±·µ»ØÀàËÆÓÚÏÂͼµÄÄÚÈÝʱ£¬Ö¤Ã÷·þÎñÆ÷ÒѾÕý³£Æô¶¯ÁË£¨·µ»ØµÄÄÚÈÝÆäʵºÜ¶à¡¤¡¤¡¤£©¡£


#2.1 ios¼¯³É
´´½¨Ò»¸ö²âÊÔÓõÄiosÏîÄ¿£¬È磺react-test
ʹÓÃpod½øÐм¯³É£¬Ê×ÏÈҪʹÓÃnpm°²×°react-native£¨Ê¹ÓÃÃüÁnpm install
react-native£©£¬Õâ¸ö¹ý³Ì¿ÉÄÜÓеã¾Ã£¬È»ºóÐÞ¸ÄpodÎļþÄÚÈÝÈçÏ£º
#platform :ios,'9.0'
use_frameworks!
target "react-test" do
pod 'React', :path => './node_modules/react-native',
:subspecs => [
'Core',
'RCTImage',
'RCTNetwork',
'RCTText',
'RCTWebSocket',
# Add any other subspecs you want to use in
your project
]
end |
podÈçºÎʹÓÃÕâÀï¾Í²»×ö¹ý¶à½âÊÍÁË¡£
È»ºó£¬ÔÚstoryboardÖÐÍÏÈëÒ»¸öview£¬°ÑviewµÄclass¸ÄΪReactTestView¡£È»ºó´´½¨ReactTestView£¬¼Ì³Ð×ÔUIView¡£
ReactTestView.h
//
// ReactTestView.h
// react-test
//
// Created by Luna Gao on 16/3/3.
// Copyright ? 2016Äê gao.luna.com. All rights
reserved.
//
#import <UIKit/UIKit.h>
#import "RCTRootView.h"
@interface ReactTestView : UIView
@end |
ReactTestView.m
//
// ReactTestView.m
// react-test
//
// Created by Luna Gao on 16/3/3.
// Copyright ? 2016Äê gao.luna.com. All rights
reserved.
//
#import "ReactTestView.h"
@implementation ReactTestView
- (void)awakeFromNib {
NSString *urlString = @"http://192.168.0.203:8081/index.ios.bundle?platform=ios";
NSURL *jsCodeLocation = [NSURL URLWithString:urlString];
// NSURL *jsCodeLocation = [[NSBundle mainBundle]
URLForResource:@"main" withExtension:@"jsbundle"];
RCTRootView *rootView = [[RCTRootView alloc]
initWithBundleURL:jsCodeLocation moduleName:@"TestView"
initialProperties:nil launchOptions:nil];
[self addSubview:rootView];
rootView.frame = self.bounds;
}
@end |
È»ºó¾Í¿ÉÒÔÅÜÆðÀ´ÁË¡£ÔËÐÐЧ¹ûÈçÏÂͼ£¨Ñù×Ó¿ÉÄܲ»Ò»Ñù£¬ÎÒµÄstoryboardÖÐÔö¼ÓÁËtab bar
controller£©£º

#2.2 Android¼¯³É
ÄÚÈݽ϶࣬Çë²Î¿¼https://facebook.github.io/react-native/docs/embedded-app-android.html#prepare-your-app
×¢£ºÕâÀïʱÐèÒª×ö prepare-your-app ºÍ add-native-code ÕâÁ½¶ÎÖеÄÄÚÈÝ¡£
½«onCreate·½·¨ÐÞ¸ÄΪ£º
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mReactRootView = (ReactRootView) findViewById(R.id.test_js);
mReactInstanceManager = ReactInstanceManager.builder()
.setApplication(getApplication())
.setBundleAssetName("index.android.bundle")
.setJSMainModuleName("index.android")
.addPackage(new MainReactPackage())
.setUseDeveloperSupport(BuildConfig.DEBUG)
.setInitialLifecycleState(LifecycleState.RESUMED)
.build();
mReactRootView.startReactApplication(mReactInstanceManager,
"TestView", null); |
ÔÚactivity_main.xmlÎļþÖÐÔö¼ÓÒ»¸öReactRootView£¬idÃüÃûΪ£ºtest_js¡£´úÂëÈçÏ£º
<com.facebook.react.ReactRootView
android:id="@+id/test_js"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/test_text"/> |
Çë×¢Ò⣺ÔÚAndroidManifest.xmlÎļþÖÐÔö¼Ó
<activity
android:name= "com.facebook.react .devsupport.DevSettingsActivity"/> |
´ËʱÔËÐдúÂ룬½çÃæÈçÏ£º

ÔÚÃüÁîÐÐÖÐÖ´ÐУºadb shell input keyevent 82
½«µ¯³öÈç϶Ի°¿ò£º

µã»÷Dev Settings£¬µã»÷ Debug server host & port for
device Ñ¡ÏîÈçÏÂͼ£º

ÊäÈëipµØÖ·ºÍ¶Ë¿ÚºÅ£¬È磺192.168.0.203:8081£¬µã»÷ok¡£
·µ»Øµ½Ó¦Óôò¿ªÒ³Ã棬ÔÙ´ÎʹÓÃadb shell input keyevent 82ÃüÁµã»÷Reload
JS£¬ÖØÐ¼ÓÔØjsÎļþ¡£´Ëʱ¾Í»áÕý³£ÏÔʾ½çÃæÁË¡£ÈçÏÂͼ£º

#3 ÈçºÎ·¢²¼
·¢²¼Ê±£¬ÎÒÃÇÐèÒªÏȱàÒëjsÎļþ¡£
ÔÚ·þÎñÆ÷ÖÐÇл»µ½¸Õ¸ÕµÄĿ¼Ï£¨Èç/var/react/tykReact£©£¬Ö´ÐÐÈçÏÂÁ½¸öÃüÁ
sudo react-native
bundle --minify --entry-file index.ios.js --bundle-output
/tmp/ios.jsbundle --platform ios
sudo react-native bundle --minify --entry-file
index.android.js --bundle-output /tmp/android.jsbundle
--platform android |
»áÔÚ/tmpĿ¼Ï³öÏÖÁ½¸öÎļþ£º
ios.jsbundle ºÍ android.jsbundle¡£
½«ÕâÁ½¸öÎļþ·Ö±ð·ÅÈëµ½iosÏîÄ¿ºÍandroid assetĿ¼Ï£¬ÈçÏÂͼ£º


ÐÞ¸Äios´úÂ룺
ReactTestView.m
// NSString
*urlString = @"http://192.168.0.203:8081/index.ios.bundle?platform=ios";
// NSURL *jsCodeLocation = [NSURL URLWithString:urlString];
NSURL *jsCodeLocation = [[NSBundle mainBundle]
URLForResource:@"ios" withExtension:@"jsbundle"];
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
moduleName:@"TestView" initialProperties:nil
launchOptions:nil];
[self addSubview:rootView];
rootView.frame = self.bounds; |
×¢Ò⣺ÕâÀïÐèÒª½«ios.jsbundleÎļþ¼ÓÈëµ½ÏîÄ¿ÖС£
ÐÞ¸Äandroid´úÂ룺
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mReactRootView = (ReactRootView) findViewById(R.id.test_js);
mReactInstanceManager = ReactInstanceManager.builder()
.setApplication(getApplication())
.setBundleAssetName("android.jsbundle")
.setJSMainModuleName("android")
.addPackage(new MainReactPackage())
.setUseDeveloperSupport(BuildConfig.DEBUG)
.setInitialLifecycleState(LifecycleState.RESUMED)
.build();
mReactRootView.startReactApplication(mReactInstanceManager,
"TestView", null); |
ÖÁ´Ë£¬ÏîÄ¿¾Í¿ÉÒÔ²»ÔÚÒÀÀµ¿ª·¢·þÎñÆ÷¶øÖ±½ÓʹÓð²×°°ü½øÐÐÔËÐÐÁË~
Áí£ºdebugģʽÐèÒªÔÚÕýʽ·¢²¼µÄʱºòÈ¡Ïûµô¡£ |