React-Native 随笔

学习基础:
  1. js的基础知识,
  2. rect.js基础
  3. JSX语法基础
  4. FlexBox布局

安装
  1. 安装node.js
    下载地址: https://nodejs.org/en/
  2. 运行 npm install -g react-native-cli安装react-native-cli。
  3. 运行react-native init [your project name],这样就会自动生成一个基本的ReactNative项目。
  4. cd到项目中执行 react-native start,会部署本地的package服务。
  5. 重新启动一个命令行, cd到项目中, 执行react-native run-android

注意:android项目可能会没有缺少local.properties文件,项目运行时会报错,可以从本地别的项目里拷贝一份放进去。


兼容性
  1. JS文件中平台区分
var { Platform} = React;
if(Platform.OS === 'ios'){
   //ios相关操作
}else{
   //android相关操作
}

Platform不止可以区分平台,还可以区分Android版本号等。

  1. 文件后缀区分不同平台
    你有my-icon.ios.png和my-icon.android.png,Packager就会根据平台而选择不同的文件, 同理js文件也会根据后缀的不同.ios.js和.android.js,自动找到匹配相应的文件。
  2. 图片适配不同屏幕
    可以使用@2x,@3x这样的文件名后缀,来为不同的屏幕精度提供图片。
├── button.js
 └── img 
       ├── check@2x.png
       └── check@3x.png
<Image source={require('./img/check.png')} />

Android打包
  1. 确保Android项目中有assets目录
  2. 执行:
react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/

成功后会在assets目录中生成index.android.bundle和index.android.bundle.meta两个文件表示已经打包成功了。
放在js目录下的图片会自动打包到android项目的drawable目录下。比如我在
*\MyReactDemo\js\login\img
目录下为了适配不同屏幕有三张图片

login-background.png
login-background@2x.png
login-background@3x.png

打包后会自动修改名称并添加到相应的drawable目录下

Paste_Image.png

打包的时候只会把js里用到的图片导入到drawable,其他相应的图片并没有导进去, 这里应该是做了检查,防止导入不用图片资源。


增量热更新

由于官方没有提供热更新方案, 可以使用微软推出的Codepush,但是服务器在国外,可能会有些问题,没有增量更新。
想实现增量热更新:
参考http://www.jianshu.com/p/2cb3eb9604ca
注意文章有些地方需要注意:

  1. 更换index.android.bundle目录应该是重写Application中的ReactNativeHost的getJsBundleFile()方法。


    Paste_Image.png
  2. bundle位置变化后图片地址访问不到。
    当下载后的bundle文件放入SDCard,会出现图片不能加载的问,这是因为bundel文件存在不同位置,路径解析方式会有不同。
    找到Image.ios.js或者Image.android.js文件,查看render方法。


    发现通过resolveAssetSource来做地址解析,打开resolveAssetSource.js

    发现通过resolver.defaultAsset返回资源地址, 在AssetSourceResolver.js中找到defaultAsset()函数。

    这里会根据bundle文件加载方式不同,图片路径会通过不同的方式加载。如果路径而不是从assets里面加载的话,会从文件bundle文件所在路径下加载图片。

    通过注释我们知道只要把图片资源和bundle文件放到同一个目录下面就可以访问到, 但是我实际操作后发现有些特殊情况需要注意。
    比如开发的项目中:
    访问图片的js文件路径: /js/login/LoginPage.js
    图片的访问方式: <Image style={styles.container} source={require("./img/icon_search.png")}>
    图片放到同级目录img下: /js/login/img/icon_search.png
    正确的文件路径应该是在sdcard中在bundle包同级目录下的/drawable-mdpi/js_login_img_icon_search.png

    这是因为在getAssetPathInDrawableFolder方法中会通过屏幕deviceScale的属性找到对应的drawable目录,然后再做一个拼接。最后拼接出来的图片地址:

  3. 这种方式如果用户清理缓存数据后js文件又回到了原始状态,这个可以可以通过每次启动检查更新来避免。


常见问题

Q:RN所支持的最低iOS和Android版本?
A:Android >= 4.1 (API 16) iOS >= 7.0

Q:可以使用现有的js库吗?
A:由于RN理论上更接近nodejs的运行环境,所以对nodejs的库兼容更好一些。浏览器端的js库,涉及到DOM、BOM、CSS等功能的模块无法使用,因为RN的环境中没有这些东西。

Q: 可以使用现有的objc/swift/java库吗
A: 可以但是要做更改。

Q:可以热更新吗?苹果允许吗?
A:官方没有提供热更新方案, 苹果目前的政策明确允许基于javascriptCore的热更新,可以使用微软推出的Codepush来更新文件。

报错

** 1.invariant violation:expected a component class,got[object object]**
创建自定义组件首字母要大写,否则会报错.**

** 2. Module 0 is not a registered callable module.**
将gradle升级成最新版本(cd Android) 进入android目录执行:sudo ./gradlew clean) 或者通过android studio工具升级.

** 3. android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?**
该错误属于安卓Native的错误,如果引用的Activity不存在或者已经销毁,再次引用就会报该错误,如果是React Native调用原生控件的话,创建控件需要引用:getCurrentActivity()

** 4.android.app.Application cannot be cast to com.facebook.React.ReactApplication.**
需要将创建的MainApplication在AndroidManifest.xml配置好.

** 5. Element type is invalid: expected a string (for built-in components) or a class/function but got: object**
发生原生一般是你引用了无效的组件,如果组件确实正确,看下引用的组件是否正常导出:(export defalut)

** 6. react native undefined is not an object (evaluating this....**
发生该错误的一般是忘记bind(this),只要回调函数中需要用到this的,一般都需要bind.

** 7. react native - expected a component class, got [object Object]**
该错误可能是你引用了小写的组件,组件首字母一定要大写,比如<login/>应该写成<Login/>**

** 8. Invariant Violation:Application XXXX has not been registered.**
请确保index.*.js中的
AppRegistry.registerComponent('项目名',() => ...);
MainActivity.java中的
@Overrideprotected String getMainComponentName() { return "项目名";}
都保持一致。

** 9. 遇到403 Forbidden错误.**
首先运行netstat -ano 检查默认端口8081被占用的情况,如果被占用可以关掉占用的程序或者修改端口。
修改端口方法:

  1. 找到\node_modules\react-native\local-cli\server\server.js修改default端口号

    Paste_Image.png

  2. 在MainActivity中添加

@Override   
protected void onCreate(Bundle savedInstanceState) {      
      super.onCreate(savedInstanceState);       
      mSp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
      mSp.edit().putString("debug_http_host","localhost:7777").commit();      
}

端口修改后用chrome调试会有问题, 这是因为调试走的端口并没有被修改,抱歉没有找到修改的地方,哪位大神找到了麻烦告诉我一声,我的解决方法是在调试的时候手动修改debugerWorker.js加载bundle地址的端口号。



学习资料

Flex布局学习:
http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html
资源集合:
https://github.com/reactnativecn/react-native-guide#%E7%BB%84%E4%BB%B6

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容