React Nativeʵս£¨Ò»£©£ºÅäÖÃºÍÆð²½
2015 Äê 9 Ô 15 ºÅ£¬React Native for Android
·¢²¼¡£ÖÁ´Ë£¬React »ù±¾Íê³ÉÁ˶Զà¶ËµÄÖ§³Ö¡£»ùÓÚ React / React Native ¿ÉÒÔ£º
1.HTML5¡¢Android¡¢iOS ¶à¶Ë´úÂ븴Óã»
2.ʵʱÈȲ¿Êð¡£
ÔÚ½ÓÏÂÀ´µÄʱ¼ä£¬ÎÒ»áͨ¹ýһϵÁÐÎÄÕÂÀ´½éÉÜ React Native¡£±¾ÎĽéÉÜ»·¾³ÅäÖÃÒÔ¼°ÈçºÎ½¨Á¢Ò»¸ö¼òµ¥µÄÏîÄ¿¡££¨×¢£º±¾ÆªÎÄÕÂ
iOS ºÍ Android ¿ª·¢¶¼ÊÊÓᣣ©
ĿǰʹÓà React Native ¿ª·¢Ö»ÄÜÔÚ Mac ϵͳ ÉϽøÐС£Ð´ iOS µÄͬѧ£¬Ó¦¸Ã¶¼ÊÇ Mac
£¨³ýÁËÌýËµÍøÒ×ÓÐЩ²¿ÃÅд iOS ¸øºÚÆ»¹ûÖ®Í⣬¹þ¹þ¹þ¹þ£©¡£ ¿ª·¢ Android µÄͬѧ, Èç¹û¹«Ë¾Åä·¢µÄ²»ÊÇ
Mac µÄ»°£¬½¨Òé×Ô¼ºÈëÊÖÒ»¸ö£¬ÄÜÏÔÖøÌá¸ßÉú²úÁ¦£¬¾Íµ±Í¶×Ê×Ô¼º°É¡£ÎÒ´ó°¢Àï¶Ô Android ¿ª·¢Ò²ÊDz»¸ø
Mac µÄ£¨²»ÖªµÀ¹«Ë¾Ê²Ã´Ë¼Â·£¬ÏÖÔÚµ¹ÊÇ¿ÉÒÔÉêÇë Mac airÁË£¬airµÄÐÔÄÜ¡¡£©£¬ËùÒÔÎÒÒ²ÊÇ×Ô¼ºÂòµÄ¡£
»·¾³ÅäÖÃ
ÐèÒª°²×°µÄÓУº
Homebrew
Homebrew ÊÇ Mac ÖеÄÒ»¸ö°ü¹ÜÀíÆ÷¡£Ã»Óа²×°µÄ»°£¬µã»÷ ÕâÀï°²×°£¬Îҵİ汾ÈçÏ£º
mac-2:~ srain$ brew -v Homebrew 0.9.5 (git revision ac9a7; last commit 2015-09-21) |
°æ±¾¹ýµÍ½«»áµ¼ÖÂÎÞ·¨°²×°ºóÐø¼¸¸ö×é¼þ¡£¿ÉÓà brew update Éý¼¶¡£
Node.js ºÍ npm
Node.js ÐèÒª 4.0 ¼°ÆäÒÔÉϰ汾¡£°²×°ºÃÖ®ºó£¬npm Ò²ÓÐÁË¡£
ͨ¹ý nvm °²×° Node.js
nvm ÊÇ Node.js µÄ°æ±¾¹ÜÀíÆ÷£¬¿ÉÒÔÇáËɰ²×°¸÷¸ö°æ±¾µÄ Node.js °æ±¾¡£
°²×° nvm ¿ÉÒÔͨ¹ý Homebrew °²×°£º
»òÕß°´ÕÕ ÕâÀïµÄ·½·¨°²×°¡£
È»ºó°²×° Node.js£º
nvm install node && nvm alias default node |
Ò²¿ÉÒÔÖ±½ÓÏÂÔØ°²×° Node.js£º https://nodejs.org/en/download/
°²×°ºÃÖ®ºó£¬ÈçÏ£º
mac-2:react-native srain$ node -v v4.0.0 mac-2:react-native srain$ npm -v 2.14.2 |
°²×° watchman ºÍ flow
ÕâÁ½¸ö°ü·Ö±ðÊÇ¼à¿ØÎļþ±ä»¯ºÍÀàÐͼì²éµÄ¡£°²×°ÈçÏ£º
brew install watchman brew install flow |
°²×° React-Native
ͨ¹ý npm°²×°¼´¿É£º
npm install -g react-native-cli |
App¿ª·¢»·¾³µÄÉèÖÃ
iOS
XCode 6.3 ¼°ÆäÒÔÉϼ´¿É¡£
Android
Õâ¸ö±È½ÏÂé·³¡£
ÉèÖû·¾³±äÁ¿£ºANDROID_HOME
export ANDROID_HOME=/usr/local/opt/android-sdk |
SDK Manager °²×°ÒÔϰü£º
Android SDK Build-tools version 23.0.1
Android 6.0 (API 23)
Android Support Repository
³õʼ»¯Ò»¸öÏîÄ¿
ÎĵµÌáµ½£º
react-native init AwesomeProject |
³õʼ»¯Ò»¸öÏîÄ¿£¬ÆäÖÐ AwesomeProject ÊÇÏîÄ¿Ãû×Ö£¬Õâ¸öËæÒâ¡£µÈ´ýÒ»¶Îʱ¼äÖ®ºó£¨¾ßÌåÊÓÍøÂçÇé¿ö¶ø¶¨£©£¬ÏîÄ¿³õʼ»¯Íê³É¡£
½øÈëµ½ÏîĿĿ¼£º
cd AwesomeProject mac-2:AwesomeProject srain$ ls -l total 24 drwxr-xr-x 14 srain staff 476 Sep 21 09:52 android -rw-r--r-- 1 srain staff 1023 Sep 21 11:47 index.android.js -rw-r--r-- 1 srain staff 1065 Sep 20 11:58 index.ios.js drwxr-xr-x 6 srain staff 204 Sep 20 11:58 ios drwxr-xr-x 5 srain staff 170 Sep 21 10:31 node_modules -rw-r--r-- 1 srain staff 209 Sep 20 11:58 package.json |
ÆäÖÐ android ºÍ ios ÖзֱðΪÁ½¸öƽ̨µÄÏîÄ¿Îļþ¡£index.android.js ºÍ index.ios.js
ΪÁ½¸öÒ³Ãæ¶ÔÓ¦µÄ js Îļþ¡£
ÔËÐÐÏîÄ¿
²»¹ÜÊÇ iOS »¹ÊÇ Android£¬ÔÚ¿ª·¢µ÷ÊԽ׶Σ¬¶¼ÐèÒªÔÚ Mac ÉÏÆô¶¯Ò»¸ö HTTP ·þÎñ£¬³ÆÎª¡°Debug
Server¡±£¬Ä¬ÈÏÔËÐÐÔÚ 8081 ¶Ë¿Ú£¬APP ͨ Debug Server ¼ÓÔØ js¡£
iOS ºÍ Android µÄÄ£ÄâÆ÷£¬Á¬½Ó Mac ±¾»úµÄ·þÎñ¶¼ºÜ·½±ã¡£µ«ÊÇͨ¹ý USB »òÕß WiFi
Á¬½Óµ÷ÊÔ£¬¾ÍÉÔ΢Â鷳һЩÁË¡£
iOS
»¹ÊǷdz£¼òµ¥£¬XCode ´ò¿ªÏîÄ¿£¬µã»÷ÔËÐоͺá£ÐÞ¸Ä index.ios.js, ÔÚÄ£ÄâÆ÷ÖÐ ? +
R ÖØÐÂÔØÈë js ¼´¿É¿´µ½ÏàÓ¦µÄ±ä»¯¡£
iOS Õæ»úµ÷ÊÔÒ²¼òµ¥£¬ÐÞ¸ÄHTTPµØÖ·¼´¿É¡£
jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle"]; |
Android
°´ÕÕ¹Ù·½Îĵµ£¬ÐèÒªÒ»¸öÄ£ÄâÆ÷£¨GenymotionÄ£ÄâÆ÷Ò²¿ÉÒÔ£©¡£µ«ÊDz»Ïñ iOS£¬Android ¿ª·¢Æ½Ê±¸ü¶àÊÇÖ±½ÓÓÃÕæ»ú½øÐпª·¢ºÍµ÷ÊÔ£¬ÈçºÎÔËÐв¿Êðµ½Õæ»ú£¬ÏÂÃæ»áÌáµ½¡£
ÔËÐÐÃüÁ
È»ºó¾Í»á²¿Êðµ½Ä£ÄâÆ÷£¬ÐÞ¸Ä index.android.js £¬µ÷³öÄ£ÄâÆ÷²Ëµ¥¼ü£¬Ñ¡ÔñÖØÐÂÔØÈë js
¼´¿É¿´µ½±ä»¯¡£
Android Õæ»úµ÷ÊÔ
ʾÀý App Ö±½Ó²¿Êðµ½Õæ»ú£¬ºìÉ«½çÃæ±¨´í£¬ÎÞ·¨Á¬½Óµ½ Debug Server¡£
Èç¹ûÊÇ 5.0 »òÕßÒÔÉÏ»úÐÍ£¬¿Éͨ¹ý adb ·´Ïò´úÀí¶Ë¿Ú£¬½« Mac ¶Ë¿Ú·´Ïò´úÀíµ½²âÊÔ»úÉÏ¡£
adb reverse tcp:8081 tcp:8081 |
Èç¹û 5.0 ÒÔÏ»úÆ÷£¬Ó¦Óð²×°µ½²âÊÔ»úÉÏÖ®ºó£¬Ò¡¶¯É豸£¬ÔÚµ¯³ö²Ëµ¥ÖÐÑ¡Ôñ Dev Setting >
Debug Server host for device£¬È»ºóÌîÈë Mac µÄ IP µØÖ·£¨ifconfig
ÃüÁî¿É²é¿´±¾»ú IP£©
¹ØÓÚÐÞ¸Ä DevHelper À´½øÐÐºÍ iOS Ò»ÑùµÄ¿ª·¢µ÷ÊÔ£¬ºóÐø¹ØÓÚÈȲ¿Êðʱ£¬ÎÒ»á½éÉܵ½¡£
ÔÚ Android Studio Öе÷ÊÔ¿ª·¢
ÎÒÃÇ¿ÉÄÜÏ£ÍûÔÚ Android Studio ´ò¿ªÏîÄ¿£¬È»ºó±àÒ벿Êðµ½Õæ»ú¡£
Õâ¸öʱºò£¬ÔÚÃüÁîÐÐÆô¶¯ Debug Server ¼´¿É£º
½áÂۺͺóÐø
±¾ÆªÎÄÕ£¬iOS ºÍ Android ¶¼ÊÊÓá£ÖÁ´Ë£¬»·¾³ÅäÖúÍʾÀýÏîÄ¿ÔËÐÐÓ¦¸Ã¶¼ºÃÁË¡£
React Nativeʵս£¨¶þ£©£ºAndroidµÄ´ò°ü
¹ØÓÚ´ò°ü
´ò°üÄ¿µÄ
³ýÁËÈȲ¿Êð£¬ÎÒÃÇÖªµÀ£¬APP ÔËÐеÄʱºò²»Ó¦ÔÙ´Ó Debug Server »ñÈ¡×ÊÔ´¡£·Ö·¢Ó¦ÓÃʱ JS
×ÊÔ´Ó¦¸Ã±»´ò°üµ½ APP ÖС£
ÁíÍâ¶ÔÍâ·¢²¼µÄ°²×°°ü£¬×ÊÔ´ÖеÄÒµÎñ´úÂëµÄ»ìÏýÒ²ÊDZØÐëµÄ¡£
React Native ´ò°ü·½Ê½
Ŀǰ iOS Ó¦ÓÿÉÓà react-native bundle ÃüÁî½øÐдò°ü£¬Í¬Ê±¶Ô Android
µÄÖ§³Ö¹¤×÷Ò²ÒѾ¿ªÊ¼ÁË¡£µ«ÔÚĿǰ npm ÖÐ×îеİ汾£¨0.11.4£©ÔÝʱ»¹²»Ö§³Ö¡£ ×îеĴúÂëÖп´ËÆÒѾ֧³ÖÁË£¬µ«»¹Ã»×îÖÕ·¢²¼¡£µÈÕýʽ·¢²¼Ö§³ÖÁË£¬ÎÒÁíдһƪÎÄÕ½éÉÜʹÓÃ
react-native bundle ÃüÁî½øÐдò°ü¡£
Ŀǰ¶ÔÓÚ Android µÄ React Native Ó¦Ó㬿ÉÓà react-native-gradle
²å¼þ½øÐдò°ü¡£¸Ã²å¼þÁé»îÅäÖôò°ü²ÎÊý£¬Ê¹Óà Gradle Task ½«×ÊÔ´´ò°üµ½×ÊÔ´Îļþ¼Ð¡£
µ« ¹Ù·½¼Æ»®Ê¹Óà react-native bundle ÃüÁî½øÐдò°ü£¬²¢ÇÒÓÐ·ÅÆú¶Ô Gradle ²å¼þÖ§³ÖµÄÇãÏò¡£
¶¼Ê¹Óà react-native bundle ½øÐдò°ü£¬¶Ô¿ª·¢ÈËÔ±À´Ëµ£¬Ö»ÒªÕÆÎÕÒ»Ì×´ò°üÃüÁî¼´¿É¡£µ«ÊǶÔÓÚ
Android µÄ¿ª·¢ÕßÀ´Ëµ£¬²å¼þ·½Ê½Ëƺõ¸ü·ûºÏƽʱµÄ¿ª·¢Ï°¹ß¡£¸÷λ×ÔÐÐÈ¡Éá¡£
React Native ¿ª·¢Ä¿Ç°·Ç³£»îÔ¾£¬´úÂë±äµüƵ·±£¬±¾ÎÄËùÌÖÂ۵ĴúÂë°æ±¾Îª£º
https://github.com/facebook/react-native/tree/0ff3a421c9adbe4137e07e158c9812062b34ea5a
±¾ÎÄÖÐĿǰËùÖ¸µÄʱ¼äΪ: 2015Äê09ÔÂ28ÈÕ20µã£¬Ì«Æ½Ñóʱ¼ä£»Öйú2015Äê09ÔÂ29ÈÕ11µã¡£
react-native-gradle ²å¼þ
±àÒë²å¼þ
½èÖú²å¼þ react-native-gradle£º com.facebook.react:gradleplugin:1.0.+¿ÉÍê³É»ìÏý¼°×ÊÔ´´ò°ü¡£
È»¶øÕâ¸ö²å¼þ²¢Ã»Óз¢²¼µ½ JCenter »òÕß Maven Centry¡£ÐèÒª×Ô¼º±àÒ룬Ȼºó·¢²¼µ½±¾µØ
Maven ¿â¡£Ô´ÂëÔÚ react-native-gradleĿ¼Ï¡£°´ÕÕ Îĵµ±àÒë°²×°£º
mac-2:react-native-gradle srain$ gradle build install |
½á¹ûÊDzâÊÔÓÃÀý±¨´í£¬Õâ¸öÎÊÌ⣬¹Ù·½Ò»Ö±Ã»ÐÞ¸´£¬ÇÒÖÃÖ®²»Àí¡£ ¸ø³öµÄ½âÊÍÇ°ÃæÌáµ½ÁË¡£
ÎÒÃÇ¿ÉÌø¹ý²âÊÔÓÃÀý£¬Ö±½Ó°²×°¡£ËäÈ»¹Ù·½ÌṩµÄ²âÊÔÓÃÀý±¾ÉíÓÐÎÊÌ⣬ÎÞ·¨½øÐвâÊÔ£¬µ«ÎÒÇײâ¿ÉÓá£
ÌâÍâ»°£¬¶ÔÓÚ¸ø³öµÄ½âÊÍ£¬ÏԵ÷dz£²»½²¾¿£¬Ä¿Ç°Õû¸öÏîÄ¿´¦Óڸ߶ȻîÔ¾ÖУ¬ÎĵµºÍʵ¼Ê¹¦ÄÜÑÏÖØÍѽڣ¬ºÜ¶à²»Ò»Öµĵط½¡£
¿´À´ÈκÎÍŶӶ¼»áÃæÁÙÏîĿѹÁ¦£¬±äµÃ½Ú×಻ÔÙÓÅÑŰ¡£¬ËùνµÄÀíÏëÍŶӶ¼ÊÇ˲ʱ̬¡£
Ìø¹ý²âÊÔÓÃÀý£¬Ö±½Ó°²×°£º
mac-2:react-native-gradle srain$ gradle install
°²×°Íê³É£º
mac-2:react-native-gradle srain$ ll ~/.m2/repository/com/facebook/react/gradleplugin/ total 8 drwxr-xr-x 5 srain staff 170 Sep 28 15:10 1.0.0-SNAPSHOT -rw-r--r-- 1 srain staff 326 Sep 28 15:10 maven-metadata-local.xml |
ÔÚÏîÄ¿ÖÐʹÓÃ
build.gradle ÅäÖÃÈçÏ£º
buildscript { repositories { mavenLocal() // ±¾µØÒÀÀµ jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.3.0' classpath 'com.facebook.react:gradleplugin:1.0.+' // ²å¼þÒÀÀµ } } |
app/build.gradle£º
apply plugin: 'com.facebook.react' react { bundleFileName "index.android.bundle" // assets Ŀ¼Ï js ÎļþÃû bundlePath "/index.android.bundle" // js ·¾¶ jsRoot "../" // js Ô´ÎļþλÖà packagerHost "localhost:8081" // debug server µØÖ· packagerCommand "./node_modules/react-native/packager/packager.sh" // ´ò°üÃüÁîµØÖ· devParams { skip true dev true inlineSourceMap false minify false runModule true } releaseParams { skip false dev false inlineSourceMap false minify true runModule true } } |
ÅäÖÃ˵Ã÷
ÉÏÃæ react ÏîÖеÄÅäÖÃÒѾÔÚ×¢ÊÍÖÐ˵Ã÷¡£ÆäÖУ¬packagerCommand ¹Ù·½¸ø³öµÄÎĵµÃèÊöÓÐÎó¡£
devParams ºÍ releaseParams ·Ö±ð debug °æ±¾ºÍ
release °æ±¾µÄ²ÎÊý¡£ËüÃǸ÷ÓÐÎå¸ö²ÎÊý£º
skip ²ÎÊýΪ true ÔòÌø¹ý´Ó±¾µØ×ÊÔ´¼ÓÔØ£¬´Ó Debug Server
ÇëÇó×ÊÔ´¡£Îª false ʱ´Ó´ò°ü×ÊÔ´£¬ÔËÐÐʱ£¬´Ó±¾µØ¼ÓÔØ¡£
ÆäËûËĸö²ÎÊýͨ¹ý url ´«¸ø Debug Server¡£±ÈÈ磺http://localhost:8081/index.android.bundle?dev=true&inlineSourceMap=true&minify=false&runModule=true¡£
²ÎÊýÒâÒåÈçÏ£º
dev: µÈͬÓÚÈ«¾Ö±äÁ¿ __DEV__, React Native ºËÐÄÀà¿âµÄ¿ª·¢Ñ¡Ïî¡£
minify: »ìÏý¡£
inlineSourceMap: ÊÇ·ñ¼ÓÈë source map¡£Ä¬ÈÏΪ
false¡£
runModule: ĬÈÏΪ true£¬ÊÇ·ñÔÚ×îºóÒÔ require(XXX)
µÄÐÎʽ¼ÓÈë module µÄÈë¿Úµã¡£È磺
require("AwesomeProject/index.android.js");
²ÎÊýµÄÓ¢ÎÄ˵Ã÷ÎĵµÔÚ£º https://github.com/facebook/react-native/blob/master/packager/README.md
´ò°ü
ÿ´Î´ò°ü£¬²å¼þ¶¼»á¸ù¾ÝÅäÖ㬾ö¶¨ÊÇ·ñ´ò°üÒÔ¼°ÒÔÔõÑùµÄÅäÖôò°ü×ÊÔ´¡£
Demo
ÕâÀïÊÇÒ»¸ö Demo£º https://github.com/liaohuqiu/ReactNativeTestGradlePlugin¡£
Demo Ö÷ÒªÑÝʾÁË build.gradle µÄÅäÖã¬Óà Android Stuido ´ò¿ª¼´¿ÉÔËÐУ¬²»ÒªÐÞ¸Ä
Dev Setting ÖÐµÄ Debug Server£¬ÒòΪ×ÊÔ´¶¼ÒѾ´ò°ü£¬²»ÔÙÔÚ´Ó Debug Server
ÏÂÔØ¡£¿ÉÒԽ⿪ debug.apk ¿´ assets Ŀ¼ÏµÄÎļþ¡£
ÆäÖаüº¬ÁËÒ»¸ö±àÒë°²×° react-native-gradle µ½±¾µØ Maven ¿âµÄ½Å±¾£¬ÔËÐм´¿É¡£
react-native bundle ÃüÁî¼ò½é
ÃüÁîÓ÷¨ÈçÏ£º
mac-2:AwesomeProject srain$ react-native bundle --help Usage: react-native bundle [options]
Options:
--dev sets DEV flag to true£¬Í¬²å¼þÅäÖÃµÄ dev
--minify minify js bundle£¬Í¬²å¼þÅäÖÃµÄ minify
--root add another root(s) to be used in bundling
in this project
--assetRoots specify the root directories of app
assets
--out specify the output file£¬ Êä³öÎļþµÄλÖÃ
--url specify the bundle file url£¬js bundle ·¾¶ |
¶Ô iOS ´ò°üʱ£º
react-native bundle --minify |
|