1. nvm
nvm的目录是~/.nvm
1  | nvm alias default 8.11.3 #使用node 8.11.3作为默认版本  | 
1.1 特定node的目录
比如node 6.9.5的目录是
.nvm/versions/node/v6.9.5/lib/node_modules
2. yarn
npm模块的依赖,现在用yarn,它的缓存在~/.npm。
注意在安装nvm的情况下,不要再安装node了`brew install yarn –without-node
有三个NativeModule, JavaScriptModule, createViewManagers
应该有三个,导出模块或者原生View,都是用RCT_EXPORT_MODULE
Android上,我发现一个View始终不显示,后来发现原因,是原生的View需要重绘,调用自己的requestLayout,再调用measureLayout
这个bug我找了好久,最后没办法试了一下,居然解决了。
1  | private final Runnable mLayoutRunnable = new Runnable() {  | 
Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能。
CF是由C语言实现的,而不是Objective-C,所以如果用到了CF,就需要手动管理内存,ARC是无能为力的。当然因为CF和Foundation之间的友好关系,它们之间的管理权也是可以移交的,这个后面再说。
Objective-C是ARC管理的对象,而Core Foundation不是ARC管理的对象,所以才要特意这样转换,这与id类型向void*转换是一个概念。也就是说,当这两种类型(有ARC管理,没有ARC管理)在转换时,需要告诉编译器怎样处理对象的所有权。
__bridge_retained 是编译器替我们做了 retain 操作,而 __bridge_transfer 是替我们做了 release。
Foundation框架定义的是OC类的基础层,它的根是NSObject类,(和NSObject及NSCopying协议一起)定义了基本的对象属性和行为。除了提供一组有用的基本对象类之外,它还引入了一些OC语言不涵盖的功能的范例。Foundation预期实现以下几个功能:
1  | git branch -m old_branch new_branch # Rename branch locally  | 
All commits from this branch will be added to the base branch via a merge commit.
创建一个专门用于合并的commit,保留原始的commit id.
The 1 commit from this branch will be added to the base branch.
创建一个commit,包含所有的changes,但是commit id丢失了。
The 1 commit from this branch will be rebased and added to the base branch.
这里的1 commit我不是很理解,其实是整体一组commits。它们的修改时间(Date)没有变化,但是提交时间(commite Date)时间统一变为rebase命令的执行时间。
重新Rebase对象的分支,然后所有的commit id和commit Date变了,changes,commit message,Date没变。
git 做diff时,是按照一个起始点,然后把所有changes显示出来。如果是三方合并,它们是从共同起始点开始,看相同的行有没有修改。所以如果从master到development或者相反的方向,不要使用rebase,也不要使用Squash,因为它们会修改commit的id,导致merge的时候出现冲突。
默认commit的时候,Date和commit Date是一样的,但是rebase之后commit Date的时间变成了rebase执行时的时间。
怎么选项merge方式:
git pull –rebase,如果有冲突,解决冲突后git rebase –continue.
git rebase target,把head rebase到target的Head上,然后本地修改会以它为起点,产生diff。之后执行git rebase –continue.
然后远程分支直接强制push。git push -f
react-native-web中把Image转为了div,使用了bacground-image:url(‘xxxx’),还有background-size:’contain’ or ‘cover’
这个时候是无痕模式,没有WebSQL写入权限,可以用cookie。
错误设置了zIndex,导致一个Tag显示在Modal层之上。一开始我怀疑是Modal层的问题,比如overflow或者position,backgroundColor,验证不是之后。因为Dom树,React的渲染树没有问题。后来才发现Tag多了一个zIndex:5,不知道谁加的,显然这个是不必要的。所以去除后,bug修复。zIndex可以穿透position: fixed的Modal层,所以和mobile app不一样,mobile app上Modal层是独立原生的,靠zIndex穿透不了。
nginx的缓存设置成{expires -1},意思是永不缓存。
比如我用的react-moda,在其children中设置flex:1,chrome没有问题,iOS 11也么有问题,ios就有问题。原因是设置flex:1的元素其父容器没有设置width和height。解决方案就是不用flex,用固定width和height。但是我不明白的就是
1  | //View 没有任何style。children都设置了width和height  | 
有的时候,没有显示内容,解决方案有下面:
<View>上,加上一个div,设置它的style,display:flex如果serch param是空数组或者是undefined,传到新页面是undefined,所以需要做w未定义检查。
空数组传不过去,只能做未定义检查。
1  | // lodash map 总会返回一个数组,无论参数是否为空  | 
react-native run-andorid 总是提示device not found, 但是adb devices 能发现模拟器。而且同时有gc overhead limit exceeded错误,并提醒gradle内存分配不够。我更新了genymotion,错误一样。后来按照提示在~/.gradle/gradle.properties中增加了
1  | org.gradle.jvmargs=-Xmx2048M  | 
这样gradle就不报错了,执行react-native run-android成功安装到模拟器。
其实一开始按照提示来做,就不会有问题,只是我认为之前一直没有改gradle配置,也可以运行,并且./gradlew assembleRelease打包也没问题,只有debug有问题,所以认为是模拟器问题。最终还是gradle的问题,下次先按提示来改,这个提示还是正确的,并不是误报。
这个是放所有文件的地方,里面有多个project
管理一个项目的地方,里面有多个scheme
管理一个target,生成一个产品(APP),勾选Share之后才能共享给他人使用。
一个管理编译设置和文件引用的配置(.plist文件),继承project的设置,可以根据需要改写
该文件将App ID、开发者证书、设备绑定到一块儿,在开发者中心配置好后可以添加到Xcode上,也可以直接在Xcode上连接开发者中心生成,真机调试时需要在PP文件中添加真机的UDID。
默认xcode带有debug和release Configurations(Project->Info),最大区别就是宏Build Settings->Preprocessor Macros DEBUG=1 为DEBUG,即开发环境,否则是生产环境。其它configuration都是duplicate自这两个,还是看这个宏。
1  | import backIcon from '../assets/svg/back.svg'  | 
1  | import backIcon from '../assets/svg/back.svg'  | 
1  | import backIcon from '../assets/svg/back.svg'  |