在实际开发过程当中,常常须要同时运行和修改多个React Native工程,好比运行github上的开源项目以观察某种控件的实际效果。那么此时,各项目下的初始化(npm install)就会很是的痛苦,由于React Native的文件很是大,以0.17.0为例,安装后达到309MB。尽管,咱们能够经过阿里npm等镜像站的方式加速下载的过程,可是下载后的进一步编译也很是地耗时。node
此外,多React Native工程还带来了React Native自身的冗余,若是建立了十几个工程,那么多占用的空间轻松达到3GB以上,很是地不友好。react
个人解决思路是:用npm link替代npm install。npm link [package-name]
命令的原理是,去[prefix]/lib/node_modules/下检索是否已经全局安装了当前的package,若是是,则直接用软连接的方法在本地路径指向全局package。若是没检索到,则会先在全局路径下安装该package,再去创建软连接。npm获取全局路径的命令是:npm config get prefix
。android
须要注意的是,有package.json的路径下,不要类比npm install
,就这么执行npm link
。此时npm link会把当前路径做为一个本地package,在全局路径下建立一个软连接。由此可知,npm link并不会像npm install同样,读取package.json中的依赖并自动配置。git
npm install -g react-native cd [program_path] npm link react-native
简单三步搞定。而后运行react-native run-android
,打个Android包检测一下。github
纳尼,报错以下:npm
Looks like you installed react-native globally, maybe you meant react-native-cli?
To fix the issue, run:
npm uninstall -g react-native
npm install -g react-native-clijson
缘由很简单,react-native框架其实由两个部分组成:react-native和react-native-cli,前者用于提供编译环境,后者则是封装了react-native开发过程当中所要用到的命令,如react-native start
,实质就是封装了sh ./node_modules/react-native/packager/packager.sh
。react-native
官方文档要求全局安装react-native-cli,可是局部安装react-native,这是有缘由的。若是你先全局安装了react-native-cli,会在/usr/local/bin下生成一个名为react-native的软连接,其指向为:react-native -> ../lib/node_modules/react-native-cli/index.js*
。而随后再次"全局"安装react-native的时候,又会生成一个名为react-native的软连接,覆盖了react-native-cli安装时生成的软连接,其指向是:../lib/node_modules/react-native/local-cli/wrong-react-native.js
。因而可知,React Native官方已经意识到了这个问题,然而不知何缘由并不推荐全局安装React Native。然而笔者从节约硬盘空间和加快初始化的角度,认为仍是有必要全局安装React Native,从而快速npm link的,因此有必要研究该报错的原理。框架
所以,针对这个报错,两种解决方法:设计
先npm install -g react-native
,再npm install -g react-native-cli
。然而,若是之后使用过程当中又升级了全局React Native,此时需看方案2。
cd /usr/local/bin
,ln -s ../lib/node_modules/react-native-cli/index.js react-native
,便可从新建立一个指向react-native-cli的软连接。若是prefix的地址不是默认的,则ln -s prefix/lib/node_modules/react-native-cli/index.js react-native
。
当前这个自动添加统一依赖的方法,存在一个问题。全部依赖于全局路径下的React Native都必须是一个版本的,npm link并无提供多版本号依赖的解决方法。所以,仍是建议选择一个经常使用的React Native版本安装在全局路径,个别需求其余版本号的React Native的项目,使用npm install
来配置局部依赖。
插说一句,npm自身的依赖管理设计仍是很是优秀的,然而React Native实在是太大了,并且咱们彻底有理由相信,他会更大。他其实应该是与Android SDK, Java SDK通常重量级的开发SDK,所以更应该借鉴rvm,设计一个React Native Version Manager。然而却委身于node_modules,于是产生了这种无奈的冗余。
====================================
若是您以为个人文章对您有所启迪,请点击文末的推荐按钮,您的鼓励将会成为我坚持写做的莫大激励。 by DesGemini