【移動應用開發(fā)技術】移動應用跨平臺框架江湖將現(xiàn)終結者?速來參拜來自Facebook的React Native_第1頁
【移動應用開發(fā)技術】移動應用跨平臺框架江湖將現(xiàn)終結者?速來參拜來自Facebook的React Native_第2頁
【移動應用開發(fā)技術】移動應用跨平臺框架江湖將現(xiàn)終結者?速來參拜來自Facebook的React Native_第3頁
【移動應用開發(fā)技術】移動應用跨平臺框架江湖將現(xiàn)終結者?速來參拜來自Facebook的React Native_第4頁
【移動應用開發(fā)技術】移動應用跨平臺框架江湖將現(xiàn)終結者?速來參拜來自Facebook的React Native_第5頁
免費預覽已結束,剩余1頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

【移動應用開發(fā)技術】移動應用跨平臺框架江湖將現(xiàn)終結者?速來參拜來自Facebook的ReactNative

February062015Facebook讓所有ReactConf的參與人員都可以初嘗ReactNative的源碼一個編寫原生移動應用的方法。該方法運用了React.js的所有強大的功能來將其應用到原生應用。你可以通過使用其內(nèi)嵌的基本元素來編寫基于Javascript的組件,這些組件都是擁有著iOS和Android控件的支撐的。首先,我知道Facebook現(xiàn)在還沒有完全將其開源是個很挫的事情啦,但他們現(xiàn)在正在將該項目往開源的方向推進了。他們現(xiàn)在正在把跟Facebook環(huán)境相關的代碼給移除掉并且正在準備建立一套接受開發(fā)人員對該開源項目進行貢獻和參與的流程。我認為他們在努力往開源這個方向推進是個很好的事情,說明他們真的很在意React社區(qū)了。相信這個項目很快就能完全開源了。其實本人并不認為開源的步驟慢點是個根本性的錯誤了。如果你認為是的話我將很樂意跟你進行探討,但請允許我把該討論放在另外一個議題里面吧。因為如果你被該討論打斷思路的話,在這里你可能會錯過我們今天對如何通過ReactNative編寫原生移動應用的潮流已經(jīng)發(fā)生改變的討論。這種改變最大的地方就是它使用起來更像是在編寫一個網(wǎng)路應用。本人已經(jīng)算是開發(fā)iOS應用多年的老手了,故此我有著很多原生應用開發(fā)的經(jīng)驗。在跟ReactNative勾搭上后,我只能用以下的表情來表達我的心情:相信我們都聽過各種由Javascript驅動的跨平臺原生應用開發(fā)框架,比如Titanium,

PhoneGap,以及其他各種各樣的允許不同層面與原生環(huán)境進行轉化的項目。所有這些框架看起來都是比較挫的:無論你現(xiàn)在是想把一個網(wǎng)絡應用包裝在一個WebView里面,或者是想要硬套HTML&CSS這套很難用來構建移動應用的技術。對于后者,你幾乎無時無刻不在直面原生對象,這在性能方面來說注定就是一個失敗的嘗試。ReactNative就不一樣,它的布局方面其實是運行在一個獨立的線程里面的,所以UI主線程就能如往常一樣的盡可能的空閑出來進行界面動畫等的呈現(xiàn)處理(它同時也提供了flexbox

來簡化布局,這可并不是所有框架都能提供出來的)。這里你僅僅需要淺嘗就能領略到ReactNative所隱藏的無限潛力。它工作起來會讓你感覺你是在做網(wǎng)絡開發(fā)一樣的舒暢。而事實上你確是在開發(fā)著一個真實的原生應用,事實上是根本分不出來這里面的區(qū)別的。在UI層面上,這事實上是根本沒有區(qū)別的,使用到的都是像正常一樣眩眼滑動的原生的UIViews。這其實都是軟件工程的功勞。同時這就完全進一步的證明了一個事實就是React.js是構建一個跨平臺應用的正確方式。我可以使用該方式來像編寫一個網(wǎng)絡應用一樣來編寫一個原生應用。我們完全可以從今開始把DOM作為一個實現(xiàn)的細節(jié),就好像UIViews一樣。我不否認我是很喜歡網(wǎng)絡編程的,但如果我們一步步的埋頭慢慢的認真檢查每一個錯誤,我們就很容易把一些重大的問題跟忽略掉。網(wǎng)絡編程的方式來編寫應用從根本上說就是個很古怪的事情:HTML加上CSS所造成的混亂會對各種框架制造路障而不是讓它們變得更好。也許ReactNative會最終是一個指引你回到正確的道路上面來的正確方式。我期盼著看到它是如何讓網(wǎng)絡編程方式變成一個更好的移動應用編程方式。我們不要把它想象成一個和網(wǎng)絡編程背道而馳的東西,而要把它想象成是一個從網(wǎng)絡編程進入到另外一個方向的原型。到了這里你是否已經(jīng)感覺眼花繚亂無所適從了?沒事,我將會通過示例告訴你ReactNative是如何工作的!當然你可以在這里和這里通過視頻學到更多的這方面的知識了。ReactNative使用的是iOS上的JavaScriptCore來運行Javascript(Android和其他平臺將會在將來進行支持)。重要的一點是它將Javascript放在一個獨立的線程上運行(其他框架如Titanium也是這樣做的)。你使用Javascript來編寫一個控件跟使用React.js其實沒有太大的區(qū)別,除了你應該使用的是如View和Text而非div和a之外。你將會獲得使用React生成UI組件的所有的優(yōu)點(保守的說,這是非常牛X的!!!)。請謹記,JavaScript不僅僅是一門語言,它還是一個平臺。存在著大量的優(yōu)秀的"JS轉換"工具供你使用。ReactNative將你在另外一個線程通過Javascript編寫的UI以最小數(shù)量的數(shù)據(jù)發(fā)送給UI主線程來把它橋接轉換成原生的組件。比如把一個View轉換成UIView。最贊的地方是你不需要擔心你的UI主線程的更新來現(xiàn)實最新的改動;你只要聲明你將需要UI基于某種狀態(tài)進行橋接轉換就行了,React使用的是一個獨特的算法把最小量的必須的改動發(fā)送到該橋接來反映UI的變化(天地會珠海分舵注:如果你清楚增量存儲的概念的話將會很容易理解這句話)。編寫原生UI從未如此的簡單,況且這將不會有如播放動畫卡頓等諸如此類的問題的出現(xiàn),因為JS是在一個獨立于UI主線程的線程中運行的。動畫播放將會比吃了瀉藥還要順暢!基于ReactNative的一個OpenGL應用我的第一個ReactNative應用其實并不是一個傳統(tǒng)的應用:我編寫的是一個波前對象模型演示應用。我個人一直對游戲開發(fā)比較感興趣,但是我對編寫原生UI卻很反感。ReactNative剛好給了我一個使用編寫網(wǎng)頁UI的方式來編寫原生UI的方案。我保證你將會看到大量的使用原生導航和動畫之類的傳統(tǒng)應用演示。我認為通過非常簡便的把ReactNative置身于OpenGL控件上面來完成相應的工作是一項很酷的事情。去把ReactNative集成在你的項目里面其實是個很簡單的事情,你只需要在你的控制器種創(chuàng)建一個RCTRootView,然后告訴它你的JS是擺在哪里,并把它添加到窗口上面就完成了。在我的嘗試中,我是首先創(chuàng)建了一個OpenGL的控件,然后把RCTRootView作為一個子控件添加到該控件上面。該集成的過程是完全一個***的過程,哦,不好意思,是一個完全毫無痛苦的過程。(天地會珠海分舵注:近來被電視和路邊廣告轟炸的暈了,到處都是***之類的廣告,看到無痛兩個字就立刻神經(jīng)反射的聯(lián)系到***來了)你可以按下Cmd+R來立刻刷新你的UI來現(xiàn)實你修改的任何更新。這里僅僅RCTRootView會進行更新,所以我可以很容易的對ui進行修改然后刷新ui來獲得最近的修改,而并不需要重新加載OpenGL層。以下是一個控件示例,一個用來列出可用文件列表并在其中一項被點擊后加載一個網(wǎng)格的ObjList控件。這里將會用到一個和其他任何原生應用一樣的原生的用來僅僅在控件內(nèi)部進行滾動顯示的ListView控件,但在這里進行使用確實一個極其簡單的事情。var

ObjList

=

React.createClass({

//

a

few

methods

clipped

selectModel:

function(file)

{

controller.loadMesh(file);

},

renderRow:

function(file)

{

return

View(

null,

TouchableHighlight(

{

onPress:

()

=>

this.selectModel(file),

underlayColor:

'rgba(0,

0,

0,

.6)'

},

Text({

style:

{

height:

30,

color:

'white'

}},

file)

)

);

},

render:

function()

{

var

source

=

this.getDataSource(ps.files);

return

ListView({

style:

{

flex:

1

},

renderRow:

this.renderRow,

dataSource:

source

});

}

});在我的App控件里面我有一個handlSearch方法來相應文本輸入的改變。這里我對控件的狀態(tài)做一些改變,一邊讓應用和ObjList控件接受到最新的狀態(tài)改變來將最新的文件列表給顯示出來。handleSearch:

function(e)

{

var

text

=

e.nativeEvent.text;

var

files

=

allFiles.filter(x

=>

x.indexOf(text.toLowerCase())

!==

-1);

this.setState({

files:

files

});

}請注意ObjList控件里面的controller.loadMesh()這個調(diào)用。這其實是一個Objective-C的一個方法,這里我已經(jīng)把它做了一個導出標識了,這樣橋接就會找到它并使它在JS中變成可用。跟橋接進行協(xié)同工作其實是一個非常簡單的事情,且將會變得越來越簡單。以下就是loadMesh的實現(xiàn)代碼:-

(void)loadMesh:(NSString

*)path

{

RCT_EXPORT();

dispatch_async(dispatch_get_main_queue(),

^{

teapotNode_.material.diffuse

=

[self

randomColor];

teapotNode_.wavefrontMeshA

=

[REMeshCache

meshNamed:path];

[self

reset];

});

}RCT_EXPORT()將該方法標識成使一個導出方法(事實上在其他地方實現(xiàn)的對該類進行實例化的工作會有點多)。這些方法將會在一個獨立的線程中被調(diào)用,但是我這里需要的使在主線程對該mesh進行加載(因為這將會把數(shù)據(jù)加載到OpenGL當中),所以這里我網(wǎng)隊列中排隊了一塊運行在主線程中的代碼。以下的視頻將會給大家一個更完整的演示:/embed/OPFf53fdUmQ在聲明的過程中

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論