Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
React Native ÔÚÏÖÓÐÏîÄ¿ÖеÄ̽·
 
  2785  次浏览      35
 2018-1-16 
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚ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

Çл»µ½´ËĿ¼Ï£¬Ö´ÐÐÏÂÃæÓï¾ä½øÐгõʼ»¯ÉèÖá£

npm init

Èç¹û´ËÓï¾äÔÚÉèÖÃʱ²»Ì«»áÓ㬿ÉÔÚĿ¼Ï´´½¨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Õâ¸öÊÇ´íÎóµÄÈÕÖ¾Îļþ¡£

ûÎÊÌâºó£¬ÎÒÃÇ¿ªÊ¼Æô¶¯·þÎñ£¬Ö´ÐÐÈçÏÂÓï¾ä£º

npm start

Õý³£µÄÇé¿öÈçÏÂͼËùʾ£º

´Ëʱ£¬´ò¿ªä¯ÀÀÆ÷£¬ÊäÈëµØÖ·½øÐзÃÎÊ£¨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ģʽÐèÒªÔÚÕýʽ·¢²¼µÄʱºòÈ¡Ïûµô¡£

   
2785 ´Îä¯ÀÀ       35
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì