多React Native項目時依賴管理的最佳實踐

在實際開發過程當中,常常須要同時運行和修改多個React Native工程,好比運行github上的開源項目以觀察某種控件的實際效果。那麼此時,各項目下的初始化(npm install)就會很是的痛苦,由於React Native的文件很是大,以0.17.0爲例,安裝後達到309MB。儘管,咱們能夠經過阿里npm等鏡像站的方式加速下載的過程,可是下載後的進一步編譯也很是地耗時。node

此外,多React Native工程還帶來了React Native自身的冗餘,若是建立了十幾個工程,那麼多佔用的空間輕鬆達到3GB以上,很是地不友好。react

npm link原理

個人解決思路是:用npm link替代npm install。npm link [package-name]命令的原理是,去[prefix]/lib/node_modules/下檢索是否已經全局安裝了當前的package,若是是,則直接用軟連接的方法在本地路徑指向全局package。若是沒檢索到,則會先在全局路徑下安裝該package,再去創建軟連接。npm獲取全局路徑的命令是:npm config get prefixandroid

須要注意的是,有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.shreact-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的,因此有必要研究該報錯的原理。框架

所以,針對這個報錯,兩種解決方法:設計

  1. npm install -g react-native,再npm install -g react-native-cli。然而,若是之後使用過程當中又升級了全局React Native,此時需看方案2。

  2. cd /usr/local/binln -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

相關文章
相關標籤/搜索