React-Native學習筆記之第一個RN項目

一似袁、搭建環(huán)境及運行第一個項目

1.按照安裝教程中使用Homebrew一步一步的安裝RN的開發(fā)環(huán)境及運行環(huán)境。
2.按照教程創(chuàng)建第一個RN項目

Snip20170822_1.png

3.使用命令行運行react-native run-ios
4.加載資源.....等了很久勿决,無任何報錯愿棋。。诈嘿。一臉懵逼堪旧。
5.使用Xcode打開iOS文件夾下的工程文件削葱。
6.報錯信息如下:
Snip20170822_7.png

React/RCTbundleURLProvider.h not found未找到文件。
7.檢查RN版本 react-native --version 0.47.2
版本過高淳梦,boost下載未成功析砸。
8.使用命令:react-native init MyApp --version 0.44.3創(chuàng)建指定版本的App
9.編譯程序不報錯。
10.使用Xcode查看RN項目結構:
Snip20170822_4.png

11.繼續(xù)輸入命令:react-native run-ios運行成功爆袍。
12.運行結果
Snip20170822_3.png

13.找到index.ios.js文件使用sublime打開
Snip20170822_8.png

14.編輯內容后繼續(xù)使用命令:react-native run-ios運行結果如下:

Snip20170822_6.png

Snip20170822_2.png

第一個項目Hello World了已經首繁。

二、思考第一個問題:react-native init AwesomeProject 這個命令做了什么螃宙,是怎樣創(chuàng)建 RN 模板項目的蛮瞄?

實際上,在按照教程安裝環(huán)境后谆扎,會在/usr/local/bin/加上react-native腳本挂捅,實際是個node.js腳本,也就是github上的react-native-cli/index.js,在命令行全局調用react-native就會調用這個腳本堂湖。這個文件的注釋也可以看到闲先,這只是一個轉接層,所有命令都會轉接到local-cli上无蜂,但很奇怪react-native init創(chuàng)建工程的邏輯部分在這個轉接層react-native-cli/index.js伺糠,部分在 local-cli/init/init.js,其他命令則全部轉接到 local-cli上斥季。

看看執(zhí)行 react-native init AwesomeProject 的流程:
  • 安裝 react-native 依賴:在AwesomeProject 目錄執(zhí)行npm install react-native训桶,安裝react-native 所有依賴的 node 模塊。這是 init命令第一個做的事情酣倾,代碼在 react-native-cli/index.js -> run()舵揭,復制項目模板:安裝依賴后init 命令隨即轉接到 local-cli,通過 local-cli/generator 初始化項目躁锡,復制項目模板午绳,模板文件在 local-cli/templates里。
  • 鏈接 native 代碼源文件:項目模板復制后需要把剛才安裝的node_module/react-native 里的源文件鏈接到 natvie 工程上映之,不同平臺有不同邏輯拦焚,都在local-cli/link 里處理 native 工程的鏈接。iOS 處理邏輯在 local-cli/link/ios/杠输。
    這一步驟處理后赎败, AwesomeProject.xcodeproj 所需要的模塊都鏈接完成,可以直接運行蠢甲,可以看到工程 Libraries 里所有模塊都是從AwesomeProject/node_modules/react-native/ 里鏈接過來的僵刮。
    react-native 模塊依賴了 500 多個npm 模塊,這在前端界也算是正常,這些模塊小部分是 RN 源碼依賴的 JS 模塊妓笙,大部分是用于前端構建,包括 JS 編譯/打包/語法檢測/http服務中間層等能岩。
    RN 模板項目創(chuàng)建過程大致就是這樣寞宫。

項目 JS 源碼在哪里,如何跑起來的拉鹃?

在生成的AwesomeProject模板項目里辈赋,iOS 端所依賴的所有模塊和源碼直接可以在工程里看到。但 JS 端的源碼在項目里只看到業(yè)務實現(xiàn)代碼index.ios.js膏燕,XCode 項目跑起來后钥屈,index.ios.js就執(zhí)行生效了,RN 核心 JS 代碼在哪里坝辫,有哪些篷就,怎么跑起來的,都是個黑盒近忙,接下來拆解下竭业,看看 JS 代碼是怎樣運行起來的。

兩種模式

RN 在 iOS 上對 JS 腳本的處理分兩種模式:

  • 本地 Server模式及舍。在本地自建一個 Server未辆,客戶端通過請求的方式獲取 JS 代碼。對于在模擬器跑 debug 版锯玛,會使用這種方式咐柜,用于接入 chrome 調試和腳本實時更新。
  • 本地靜態(tài)bundle 模式攘残。編譯時就把所有相關 JS 文件打包編譯到 APP 里拙友,運行時直接本地讀取。對于所有 release 版肯腕,或無法連接本地 ServeriPhone 真機上的 debug 版献宫,會使用這種方式。

本地 Server 模式在下一節(jié) chrome 調試再描述实撒,這里先看看本地靜態(tài) bundle 模式姊途。
本地靜態(tài) bundle
在本地靜態(tài)Bundle模式中,最終所有 JS 代碼都會打包成一個文件知态,客戶端最終只需讀取一個打包后的 JS 文件執(zhí)行捷兰。這里從依賴分散的 JS 源文件,到最終可執(zhí)行的單個 JS负敏,有一個編譯和打包 JS 的處理過程贡茅。這套處理過程的啟動是在主工程AwesomeProject.xcodeproj Build Phases里執(zhí)行了一個腳本node_modules/react-native/packager/react-native-xcode.sh
,最終它在 Release版或真機上執(zhí)行了這樣一條打包命令:

react-native bundle --entry-file index.ios.js --platform ios --dev true --reset-cache --bundle-output main.bundle --assets-dest assets

這個命令最終會輸出一個 main.bundle文件,實際是個 JS 文件顶考,包含了 RN 所有核心代碼和我們項目的業(yè)務代碼(這里只有index.ios.js)赁还。
這個打包命令包含非常多處理,流程很長驹沿,算是整個 RN 部署工具的核心艘策,主要實現(xiàn)在 react-native/packager里,在這個生成靜態(tài) bundle 的流程里渊季,主要做的事情是:

  1. 編譯/解析依賴
    現(xiàn)代前端工程中朋蔫,編譯幾乎已經是必須的了,這里編譯主要做兩件事:ES6 -> 通用JS却汉,JSX -> JS驯妄。
    RN 源碼以及業(yè)務代碼都是以 ES6 的語法去寫,像 import xxx這種寫法在不支持ES6語法的 JS 引擎上是無法運行的合砂,需要編譯成 require('xxx')青扔。此外像 JSX這種在 JS 代碼里嵌入 XML 標簽的語法糖也需要編譯成普通 JS 語法才能在 JS引擎上運行,所以需要一個編譯的過程既穆。此外需要把 JS 文件的依賴也解析出來赎懦,因為這涉及到對 JS 代碼的解析,把 require('xxx')語句解析出來幻工,所以這部分也是在編譯過程中處理励两。
    這里統(tǒng)一用 Babel 這個庫去做所有編譯的工作。它的官網(wǎng)也說得很清楚它做了什么工作囊颅,除了編譯当悔,后續(xù)會提到的 SourceMap 也是用它生成,由 packager/src/JSTransformer去封裝編譯解析后的數(shù)據(jù)踢代。
    解析依賴是在 packager/src/JSTransformer/worker/extract-dependencies.js盲憎,這里用 babel解析出當前文件中 require的內容后組裝返回。編譯是在 packager/src/JSTransformer/worker/worker.js
    里胳挎。
  2. 管理依賴饼疙、打包壓縮
    上述解析依賴僅提取了當前 JS 文件依賴的文件名,并沒有做依賴文件查找/讀取/拼裝/更新等工作慕爬,這個工作在 packager/src/node-haste里做窑眯,把一個個 JS 文件封裝成一個個Module,根據(jù)上述解析出來的依賴信息医窿,去讀取依賴文件磅甩,并遞歸檢測依賴,直到所有依賴都加載完畢姥卢。
    這里面還有層層處理卷要,最終所有依賴模塊會封裝成一個 packager/src/Bundler渣聚,提供給 cli 命令行調用,打包壓縮是小意思僧叉,在local-cli/bundle.js里處理了奕枝。
  3. 請求執(zhí)行
    在本地靜態(tài) bundle 模式下,RN 最終會統(tǒng)一執(zhí)行上述生成的 main.bundle瓶堕,所有 JS 代碼都在這里面倍权,由 RCTBundleURLProvider.m處理執(zhí)行,整個 RN 應用就跑起來了捞烟。
    main.bundle 里是合并后的 JS 代碼,如果想要看這個 JS 文件合并之前是包括哪些 JS 源文件当船,可以在上述模塊組裝的過程中去打出每個模塊的信息题画,例如在 packager/src/Bundler/Bundle.jsaddModule()
    方法里加上 console.log(moduleTransport.sourcePath)就能看到所有依賴的 JS 文件路徑。另外通過下述 SourceMap 能更方便地看到德频。
代碼流程

從 cli 命令 – 編譯文件 – 解析依賴 – 組裝數(shù)據(jù) – 寫入文件苍息,這個過程在代碼中實現(xiàn)流程很長,這里就不列出來了壹置,大致涉及的幾個文件的作用列以下:

local-cli/bundle/ - cli命令入口竞思,傳參,獲取組裝好的 Bundle壓縮/寫入文件
packager/src/Bundler/Bundle.js - 保存 bundle相關的所有模塊信息/依賴/源碼
packager/src/Bundler/index.js - 組裝 Bundle 對象packager/src/JSTransformer - babel 轉接钞护,編譯 JS盖喷,解析依賴
packager/src/node-haste - 管理依賴 cache,把 JS 源文件模塊封裝成 Module 對象
packager/src/Resolver - JS 模塊組裝打包成一個文件并不只是直接把 JS 源碼拼一起难咕,還需要重新封裝模塊课梳,處理引用邏輯

第二部分文字引自bang's blog

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末余佃,一起剝皮案震驚了整個濱河市暮刃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌爆土,老刑警劉巖椭懊,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異步势,居然都是意外死亡氧猬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進店門立润,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狂窑,“玉大人,你說我怎么就攤上這事桑腮∪” “怎么了?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長丛晦。 經常有香客問我奕纫,道長,這世上最難降的妖魔是什么烫沙? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任匹层,我火速辦了婚禮,結果婚禮上锌蓄,老公的妹妹穿的比我還像新娘升筏。我一直安慰自己,他們只是感情好瘸爽,可當我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布您访。 她就那樣靜靜地躺著,像睡著了一般剪决。 火紅的嫁衣襯著肌膚如雪灵汪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天柑潦,我揣著相機與錄音享言,去河邊找鬼。 笑死渗鬼,一個胖子當著我的面吹牛览露,可吹牛的內容都是我干的。 我是一名探鬼主播譬胎,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼肛循,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了银择?” 一聲冷哼從身側響起多糠,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浩考,沒想到半個月后夹孔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡析孽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年搭伤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袜瞬。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡怜俐,死狀恐怖,靈堂內的尸體忽然破棺而出邓尤,到底是詐尸還是另有隱情拍鲤,我是刑警寧澤贴谎,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站季稳,受9級特大地震影響擅这,放射性物質發(fā)生泄漏。R本人自食惡果不足惜景鼠,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一仲翎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧铛漓,春花似錦溯香、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至问顷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間禀梳,已是汗流浹背杜窄。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留算途,地道東北人塞耕。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像嘴瓤,于是被迫代替她去往敵國和親扫外。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,982評論 2 361

推薦閱讀更多精彩內容