最近在寫React Native的項目 在這里記錄一下,推薦reactnative中文網。要養成良好的習慣,上圖??
從頭開始
寫項目肯定要舒適化項目對吧
react-native init MyReactNativeProject
提示:你可以使用--version參數創建指定版本的項目。
例如 react-native init MyReactNativeProject --version 0.39.2。注意版本號必須精確到兩個小數點。
在模擬器上運行
當你完成了初始化React Native新項目后,就可以在項目目錄下運行react-native run-ios來啟動模擬器。如果一切配置都沒有問題,應該很快就能看到你的應用在iOS模擬器上運行起來。
指定模擬的設備類型
你可以使用--simulator
參數,在其后加上要使用的設備名稱來指定要模擬的設備類型(目前默認為"iPhone 6")。如果你要模擬iPhone 4s,那么這樣運行命令即可:
react-native run-ios --simulator "iPhone 4s"。
你可以在終端中運行
xcrun simctl list devices
來查看具體可用的設備名稱。
在設備上運行
你可以在真機上訪問開發服務器以快速測試和迭代。首先需要確保設備已使用usb連接至電腦,同時和電腦處在同一wifi網絡內,然后在Xcode中選擇你的設備作為編譯目標(左上角運行按鈕的右邊),然后點擊運行按鈕即可。如果你需要在真機上啟用調試功能,則需要打開RCTWebSocketExecutor.m文件,然后將其中的"localhost"改為你的電腦的IP地址,最后啟用開發者菜單中的"Debug JS Remotely"選項。
項目的時候我們肯定會用到別人造好的輪子對吧就是所謂的三方庫How to use?
npm install 庫的名稱 —save
// 生產環境需要的庫 會在package.json文件中的dependencies中記錄來鏈接庫
npm install 庫的名稱 --save-dev
// 開發環境下的庫 會在package.json文件中的devDependencies中記錄來鏈接庫
react-native link
// 完成了!現在所有的原生依賴都成功地鏈接到你的iOS/Android項目了。
提示:有寫三方庫是不需要link的 有寫三方庫link不成功,需要自己手動添加。
項目寫完了是不是要打包?
開發React Native的過程成,js代碼和圖片資源運行在一個Debug Server上,每次更新代碼之后只需要使用command+R鍵刷新就可以看到代碼的更改,這種方式對于調試來說是非常方便的。
但當我們需要發布App到App Store的時候就需要打包,使用離線的js代碼和圖片。這就需要把JavaScript和圖片等資源打包成離線資源,在添加到Xcode中,然后一起發布到App Strore中。
打包離線資源需要使用命令
react-native bundle
React Native的react-native bundle
命令是用來進行打包的命令,
react-native bundle
的詳細命令選項https://github.com/facebook/react-native/blob/master/local-cli/bundle/bundleCommandLineArgs.js。
其中我們常使用的一線命令選項:
--entry-file ,ios或者android入口的js名稱,比如index.ios.js
--platform ,平臺名稱(ios或者android)
--dev ,設置為false的時候將會對JavaScript代碼進行優化處理。
--bundle-output, 生成的jsbundle文件的名稱,比如./ios/bundle/index.ios.jsbundle
--assets-dest 圖片以及其他資源存放的目錄,比如./ios/bundle
打包命令如下:
react-native bundle --entry-file index.ios.js --platform ios -- dev false --bundle-output ./ios/bundle/index.ios.jsbundle --assets-dest ./ios/bundle
打包的時候注意先在ios文件夾下創建一個build文件夾
為了方便使用,也可以把打包命令寫到npm script中:
"scripts": {
"start": "node node_modules/react-native/local-cli/cli.js start",
"bundle-ios":"node node_modules/react-native/local-cli/cli.js bundle --entry-file index.ios.js --platform ios --dev false --bundle-output ./ios/bundle/index.ios.jsbundle --assets-dest ./ios/bundle"
},
然后運行命令直接打包:
npm run bundle-ios
jsCodeLocation
在ios中AppDelegate里可以看到設置JavaScript代碼位置的代碼:
Debug Server上的設置
NSURL *jsCodeLocation;
jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios&dev=true"];
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
moduleName:@"FreshqiaoReact"
initialProperties:nil
launchOptions:launchOptions];
在開發的過程中可以在這里配置Debug Server的地址,當發布上線的時候,就需要使用離線的jsbundle文件,因此需要設置jsCodeLocation為本地的離線jsbundle。
設置離線的jsCodeLocation:
jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"bundle/index.ios" withExtension:@"jsbundle"];
離線包里的.jsbundle文件是經過優化處理的,因此運行效率也會比Debug的時候更高一些。
如果報錯
RCTSRWebSocket.m報錯,需要在報錯的錯誤處SecRandomCopyBytes(kSecRandomDefault, sizeof(uint32_t), (uint8_t*)mask_key)做處理,只需在該處加上(void)即可。如下:(void)SecRandomCopyBytes(kSecRandomDefault, sizeof(uint32_t), (uint8_t *)mask_key);
處理 RCTSRWebSocket.m還是不行。還需要在RCTScrollView.m 做出修改
@implementation RCTCustomScrollView
{
__weak UIView *_dockedHeaderView;
RCTRefreshControl *_refreshControl; //加入此行
}
不然會報 Use of undeclared identifier '_refreshControl'; did you mean 'refreshControl'?錯誤,RCTScrollView.m 位于Xcode項目中libraries下React.xcodeproj / React / View
運行github上的項目
npm install -g React-native-cli
npm install
react-native start