create-react-app不得不說(shuō)的事兒以及如何升級(jí)react18
前言
身為React的堅(jiān)定擁躉,我長(zhǎng)期采用create-react-app(簡(jiǎn)稱CRA)與customize-cra結(jié)合的項(xiàng)目搭建方式。在最近一次升級(jí)react-scripts和react18的過(guò)程中,我遇到了諸多挑戰(zhàn)。超過(guò)20個(gè)的錯(cuò)誤使得項(xiàng)目無(wú)法運(yùn)行,解決這些問(wèn)題耗費(fèi)了我大量時(shí)間。更令我頭疼的是,移動(dòng)端的px2rem功能也失效了。這使我開始反思:作為React開發(fā)者,我們真正需要怎樣的開發(fā)環(huán)境?

什么是cra?
對(duì)于React項(xiàng)目的開發(fā),如何快速搭建一個(gè)友好、可靠且自帶性能優(yōu)化的環(huán)境曾讓我倍感困擾。這需要關(guān)注Babel配置,學(xué)習(xí)各類Webpack配置,以及如何進(jìn)行性能優(yōu)化,這其中的復(fù)雜度和耗時(shí)令人頭疼。對(duì)此,業(yè)界巨頭Facebook給出了答案:create-react-app(簡(jiǎn)稱CRA)。
盡管CRA的開發(fā)環(huán)境相對(duì)簡(jiǎn)陋,它提供了許多基礎(chǔ)配置,但在生產(chǎn)環(huán)境中仍有許多需要額外配置的地方。例如,初始化的CRA項(xiàng)目默認(rèn)不支持Less,需要我們自行添加less-loader。這引出了我們對(duì)更多靈活性和自定義需求的渴望。
customize-cra的挑戰(zhàn)
當(dāng)我們希望對(duì)CRA進(jìn)行更多擴(kuò)展而無(wú)法直接eject時(shí),customize-cra成為了當(dāng)前的一個(gè)解決方案。這也帶來(lái)了額外的配置問(wèn)題,例如需要引入config-overrides等配置文件。這在一定程度上背離了CRA的零配置初心,并可能使開發(fā)者重新陷入對(duì)Webpack的復(fù)雜配置之中。

理想的項(xiàng)目構(gòu)建方式
我開始從一名React初級(jí)開發(fā)者的角度思考:我期望的項(xiàng)目能直接在生產(chǎn)環(huán)境中運(yùn)行,無(wú)需擔(dān)心Webpack配置。這個(gè)項(xiàng)目從出生起就自帶最佳性能優(yōu)化、分包、CDN支持,并能隨時(shí)擁抱最新的React版本和新技術(shù)。
我的實(shí)踐之路
為了滿足這些需求,我開始探索用自定義的scripts替換CRA自帶的scripts。具體做法如下:
eject的過(guò)程

我拉取了最新的CRA項(xiàng)目并進(jìn)行eject操作,這樣我能獲取到最原始的CRA項(xiàng)目的Webpack配置。
lemon-scripts的誕生
接下來(lái),我創(chuàng)建了一個(gè)名為lemon-scripts的GitHub和npm項(xiàng)目?;趀ject出來(lái)的代碼,我進(jìn)行了一些自定義開發(fā)。
如何使用lemon-scripts
如果你是初學(xué)者且正在考慮搭建項(xiàng)目,我推薦你使用已經(jīng)集成了lemon-scripts的reactapp——lemon-react-app。此項(xiàng)目配置更加面向生產(chǎn)環(huán)境,支持移動(dòng)端適配,特別適合H5項(xiàng)目的快速上手,并且已經(jīng)完美支持了react18。使用`lemon-scripts`管理你的React項(xiàng)目

一、引言
如果你已經(jīng)擁有一個(gè)現(xiàn)成的React項(xiàng)目,并希望利用`lemon-scripts`來(lái)簡(jiǎn)化開發(fā)流程,那么這篇文章將為你提供詳細(xì)的指導(dǎo)。`lemon-scripts`是開發(fā)者在日常工作中積累的實(shí)用工具的集合,旨在提高開發(fā)效率和項(xiàng)目質(zhì)量。
二、配置與使用
你需要在項(xiàng)目中安裝`lemon-scripts`。如果你的項(xiàng)目是基于Create React App(CRA)構(gòu)建的,安裝過(guò)程將更為簡(jiǎn)便。接下來(lái),通過(guò)修改項(xiàng)目的`package.json`文件中的scripts部分,你可以輕松集成`lemon-scripts`。示例配置如下:
```json

"scripts": {
"start": "lemon-scripts start",
"build": "lemon-scripts build",
"analyze": "lemon-scripts build --analyze"
}

```
請(qǐng)注意,由于每個(gè)React項(xiàng)目的復(fù)雜性不同,配置和使用的細(xì)節(jié)可能會(huì)有所不同。`lemon-scripts`可能不保證在所有項(xiàng)目中都能完美工作。如果遇到問(wèn)題,建議查看官方文檔或提交問(wèn)題反饋。
三、功能特點(diǎn)
`lemon-scripts`基于CRA內(nèi)置的`react-scripts`進(jìn)行了一些功能性擴(kuò)展,旨在提供更強(qiáng)大的支持和優(yōu)化。主要特點(diǎn)包括:
1. 支持LESS:無(wú)需額外配置即可直接使用LESS樣式。

2. SVG支持:提供兩種引入SVG的方式(file url 或 Component),相比CRA更加靈活。
3. 分包與CDN:支持將多個(gè)React生態(tài)包打包為CDN,使bundle文件更純凈,只包含你的業(yè)務(wù)代碼。
4. 移動(dòng)端H5適配:原生支持響應(yīng)式布局,適應(yīng)不同屏幕尺寸。
5. Webpack分析:通過(guò)原生支持Webpack分析,輕松掌握項(xiàng)目細(xì)節(jié)。
6. 路徑別名解析:無(wú)縫結(jié)合Webpack的別名解析功能。

7. 支持多頁(yè)和單頁(yè)應(yīng)用:滿足不同項(xiàng)目結(jié)構(gòu)的需求。
四、基于`lemon-scripts`的進(jìn)階項(xiàng)目——`lemon-react-app`
對(duì)于希望快速開展項(xiàng)目的開發(fā)者來(lái)說(shuō),CRA的純凈性有時(shí)可能過(guò)于簡(jiǎn)單?;赻lemon-scripts`,你可以改造整個(gè)工程,使其更加面向生產(chǎn)環(huán)境。通過(guò)集成更多的實(shí)用功能和優(yōu)化措施,`lemon-react-app`旨在提供一個(gè)更加完善的開發(fā)環(huán)境。
五、額外說(shuō)明與注意事項(xiàng)
1. 支持LESS的具體實(shí)現(xiàn):通過(guò)替換SCSS的正則表達(dá)式并引入`less-loader`來(lái)實(shí)現(xiàn)對(duì)LESS的支持。請(qǐng)注意,原始的CRA并不支持LESS。

2. SVG的導(dǎo)入方式:可以使用`import Logo from '@/images/logo.svg'`并使用``或`
3. 分包與CDN的使用:`lemon-scripts`預(yù)先將一些穩(wěn)定的庫(kù)抽離成CDN依賴,如react、react-dom等。這樣可以在開發(fā)前提供一個(gè)純凈的環(huán)境,使bundle文件主要包含你的業(yè)務(wù)代碼,從而提高構(gòu)建速度和打包效率。
通過(guò)使用`lemon-scripts`,你可以簡(jiǎn)化React項(xiàng)目的開發(fā)流程,提高開發(fā)效率和項(xiàng)目質(zhì)量。希望這篇文章能為你提供有價(jià)值的指導(dǎo)和信息。
使用CDN模塊與替換配置
在您的項(xiàng)目中,您可能會(huì)發(fā)現(xiàn)默認(rèn)的CDN服務(wù)并不符合您的需求。好消息是,通過(guò)lemon-scripts,您可以輕松地在package.json中進(jìn)行配置替換。 如果您不需要特定的CDN模塊,可以在配置文件中添加以下信息來(lái)移除或替換默認(rèn)CDN:```json
"cdnModules": [

{
"name": "react",
"path": "react.min.js"
}
]

```
lemon-scripts默認(rèn)使用七牛云作為CDN服務(wù)。但如果您想使用自己的CDN服務(wù),只需在package.json中添加相應(yīng)的配置即可:```json
"cdnSourcePaths": ""
```
根據(jù)您的需求填寫對(duì)應(yīng)的CDN源路徑即可。這樣設(shè)置后,您的項(xiàng)目將使用您指定的CDN服務(wù)。

移動(dòng)端H5適配與配置
對(duì)于移動(dòng)端H5項(xiàng)目,lemon-scripts提供了靈活的適配方案。 在package.json中設(shè)置設(shè)計(jì)尺寸,如375、750或其他自定義尺寸。內(nèi)置px2rem-loader將自動(dòng)根據(jù)您設(shè)置的設(shè)計(jì)尺寸進(jìn)行適配。```json
"designSize": 375
```
這樣設(shè)置后,您的移動(dòng)端H5項(xiàng)目將自動(dòng)適配不同的移動(dòng)設(shè)備尺寸。

Webpack分析與可視化
lemonscripts內(nèi)置了webpackanalyzeplugin插件,用于分析項(xiàng)目的構(gòu)建情況。要開啟分析功能,只需在命令行中加入--analyze。 通過(guò)對(duì)構(gòu)建過(guò)程進(jìn)行可視化分析,您可以更好地了解項(xiàng)目的依賴關(guān)系和資源使用情況,從而優(yōu)化性能。Alias解析與路徑配置
在TypeScript項(xiàng)目中,使用別名(alias)是一種方便的方式來(lái)組織代碼結(jié)構(gòu)。在lemon-scripts中,這一需求得到了很好的支持。項(xiàng)目中的別名配置會(huì)直接從tsconfig.paths.json中讀取。這意味著任何在TypeScript配置文件中定義的路徑別名都可以在項(xiàng)目中直接使用。例如: 您的tsconfig.paths.json文件可能包含如下配置: ```json { "compilerOptions": { "paths": { "@/global/": ["src/global/"], ... } } } ``` 使用lemon-scripts時(shí),這些別名會(huì)自動(dòng)生效,讓您在項(xiàng)目中輕松引用各種模塊和文件。這對(duì)于使用TypeScript和自定義CRA配置的同學(xué)來(lái)說(shuō)尤其方便。 無(wú)需額外配置,您就可以享受到別名帶來(lái)的便利性和代碼組織的靈活性。 lemon-scripts通過(guò)自動(dòng)讀取TypeScript的配置信息簡(jiǎn)化了別名解析的過(guò)程。這使得開發(fā)者能夠更輕松地管理和組織項(xiàng)目中的模塊和文件路徑。
多頁(yè)與單頁(yè)模式的切換
在開發(fā)過(guò)程中,有時(shí)需要根據(jù)項(xiàng)目需求切換多頁(yè)或單頁(yè)模式。lemon-scripts提供了靈活的支持。 在package.json中設(shè)置"multiPage"為true即可開啟多頁(yè)面模式。
如何用 React Native 創(chuàng)建 iOS 應(yīng)用
React Native 是一種結(jié)合了 Web 應(yīng)用和原生應(yīng)用優(yōu)勢(shì)的解決方案。
它允許開發(fā)者使用 JavaScript 來(lái)構(gòu)建 iOS 和 Android 原生應(yīng)用。
React Native 的核心思想是使用 JavaScript 和 React 來(lái)抽象操作系統(tǒng)原生 UI 組件,代替?zhèn)鹘y(tǒng)的 DOM 元素渲染。
這意味著開發(fā)者可以在熟悉的 JavaScript 和 React 開發(fā)環(huán)境中構(gòu)建世界一流的應(yīng)用程序體驗(yàn)。
通過(guò) React Native,您可以充分利用原生應(yīng)用的性能和功能優(yōu)勢(shì),同時(shí)保持跨平臺(tái)的開發(fā)效率和一致性。

創(chuàng)建 React Native iOS 應(yīng)用的過(guò)程相對(duì)簡(jiǎn)單。您可以使用 React Native CLI 來(lái)初始化一個(gè)新項(xiàng)目、安裝依賴項(xiàng)并創(chuàng)建應(yīng)用程序的基本結(jié)構(gòu)。
然后,您可以開始編寫 JavaScript 代碼并使用 React Native 的原生組件來(lái)構(gòu)建用戶界面。
React Native 還提供了一系列工具和庫(kù),幫助您更輕松地管理和組織代碼、集成第三方服務(wù)、進(jìn)行調(diào)試和測(cè)試等。
React Native 為開發(fā)者提供了一種使用 JavaScriptReact Native:一種跨平臺(tái)的開發(fā)效率之巔
一、引言

React Native作為一種流行的移動(dòng)應(yīng)用開發(fā)框架,以其獨(dú)特的優(yōu)勢(shì)吸引了眾多開發(fā)者的關(guān)注。它允許開發(fā)者使用一種語(yǔ)言(JavaScript)為任何平臺(tái)高效地編寫代碼,極大地提高了開發(fā)效率和便捷性。Facebook作為React Native的積極推動(dòng)者,已經(jīng)在多個(gè)應(yīng)用程序產(chǎn)品中廣泛使用了React Native,并持續(xù)為其投資。
二、React Native的優(yōu)勢(shì)
React Native的益處顯而易見。它減少了開發(fā)人力,節(jié)省了時(shí)間,避免了iOS與Android版本發(fā)布的時(shí)間差,使得開發(fā)新功能更為迅速。通過(guò)使用React Native,開發(fā)者能夠?qū)W⒂跇I(yè)務(wù)邏輯的實(shí)現(xiàn),而無(wú)需過(guò)多關(guān)注底層細(xì)節(jié)。
三、創(chuàng)建iOS應(yīng)用前的準(zhǔn)備
在開始使用React Native創(chuàng)建iOS應(yīng)用之前,我們建議先下載React Native的代碼框架。GitHub上提供了豐富的示例項(xiàng)目,如2048游戲、Movies應(yīng)用、SampleApp、TicTacToe游戲和UIExplorer等。這些示例項(xiàng)目對(duì)于學(xué)習(xí)如何使用React Native創(chuàng)建UI非常有幫助。尤其是UIExplorer APP,它幾乎用到了每一個(gè)APP中需要?jiǎng)?chuàng)建的UI控件。

四、安裝必要的工具
要使用React Native,首先需要安裝相應(yīng)的工具。推薦使用Homebrew的方式來(lái)安裝nvm、watchman和flow。在Mac下,可以通過(guò)一行命令完成安裝。如果已經(jīng)安裝了這些工具,可以跳過(guò)此步驟。
五、構(gòu)建第一個(gè)React Native項(xiàng)目
在終端中找到希望保存的項(xiàng)目文件,然后運(yùn)行特定的文件夾來(lái)構(gòu)建第一個(gè)React Native項(xiàng)目。使用CLI工具來(lái)構(gòu)建Native項(xiàng)目,完成后將在終端窗口中打開Xcode的BookSearch.xcodeproj。運(yùn)行應(yīng)用程序后,模擬器將啟動(dòng)應(yīng)用程序的運(yùn)行。一個(gè)終端窗口也將打開。當(dāng)Native應(yīng)用程序啟動(dòng)時(shí),它將加載JavaScript應(yīng)用程序。
React Native為開發(fā)者提供了一種高效、便捷的開發(fā)方式。通過(guò)學(xué)習(xí)和掌握React Native,開發(fā)者可以使用一種語(yǔ)言為多個(gè)平臺(tái)編寫高質(zhì)量的應(yīng)用程序,從而提高開發(fā)效率,節(jié)省時(shí)間成本,實(shí)現(xiàn)更快速的新功能開發(fā)。運(yùn)行開發(fā)服務(wù)器與構(gòu)建React Native應(yīng)用的詳細(xì)指南

一、終端啟動(dòng)與服務(wù)器響應(yīng)
當(dāng)我們打開終端,服務(wù)器開始接收指令并處理請(qǐng)求。針對(duì)本次應(yīng)用的開發(fā),特定的Native工具負(fù)責(zé)讀取并構(gòu)建JSX和JavaScript代碼。這是一個(gè)關(guān)鍵步驟,為后續(xù)的開發(fā)流程鋪平了道路。
二、模擬器的運(yùn)行與操作
運(yùn)行應(yīng)用后,你會(huì)看到一個(gè)模擬器。模擬器是開發(fā)過(guò)程中的重要工具,它允許你在本地環(huán)境中預(yù)覽應(yīng)用的表現(xiàn)。要操作模擬器,你可以遵循幾個(gè)步驟:查看歡迎屏幕上的關(guān)鍵指令,編輯用戶界面,修改index.ios.js文件等。
三、代碼修改與重載

當(dāng)你在開發(fā)過(guò)程中修改JavaScript代碼時(shí),需要重新加載應(yīng)用以查看變化。使用Command-R來(lái)重載應(yīng)用。如果你需要更多的選項(xiàng),可以使用Command-Control-Z打開開發(fā)者菜單。這個(gè)菜單提供了實(shí)時(shí)重載、瀏覽器調(diào)試等實(shí)用功能。
四、錯(cuò)誤處理與模擬器的紅色屏幕
在開發(fā)過(guò)程中,可能會(huì)遇到紅色屏幕模擬器,這通常表示有錯(cuò)誤消息。錯(cuò)誤消息能幫助你判斷問(wèn)題所在,無(wú)論是代碼問(wèn)題還是服務(wù)器問(wèn)題。當(dāng)收到如“無(wú)法連接到服務(wù)器”的錯(cuò)誤消息時(shí),應(yīng)檢查終端是否有“流程終止”的錯(cuò)誤提示,并嘗試關(guān)閉終端窗口,停止在Xcode中的應(yīng)用并重新運(yùn)行。對(duì)于其他錯(cuò)誤,如語(yǔ)法錯(cuò)誤或網(wǎng)絡(luò)請(qǐng)求超時(shí),嘗試重新加載可能就能解決問(wèn)題。
五、開發(fā)工具與IDE的選擇
在構(gòu)建應(yīng)用程序時(shí),我們需要打開index.ios.js文件。推薦使用適合web開發(fā)的IDE。雖然Xcode是蘋果開發(fā)者常用的工具,但在代碼格式化、自動(dòng)完成和語(yǔ)法錯(cuò)誤突出顯示方面,它可能不如一些專門的JavaScript IDE靈活。你可以選擇如RudbyMine或其他支持JavaScript和JSX的IDE。這些工具將幫助你在開發(fā)過(guò)程中更高效、更準(zhǔn)確地工作。

React Native應(yīng)用開發(fā)是一個(gè)涉及多個(gè)步驟和工具的過(guò)程。從終端的啟動(dòng)到模擬器的運(yùn)行,再到代碼修改和錯(cuò)誤處理,每一步都需要細(xì)心和耐心。選擇合適的工具和IDE也是提高效率的關(guān)鍵。希望這份指南能幫助你在開發(fā)過(guò)程中更順利、更高效地工作。React技術(shù)解析與JSX應(yīng)用簡(jiǎn)介
一、React解構(gòu)賦值簡(jiǎn)介
通過(guò)解構(gòu)賦值,我們可以輕松地從React或其他對(duì)象中提取出我們需要的屬性。例如,你給出的代碼中的這一行:
var { AppRegistry, StyleSheet, Text, View } = React;
這就是從React對(duì)象中解構(gòu)出AppRegistry、StyleSheet、Text和View等屬性。這使得我們可以在文件作用域內(nèi)引用它們,而不必每次都使用完全限定的名稱。如果不使用解構(gòu)賦值,那么每次使用組件時(shí)都需要使用如“React.AppRegistry”這樣的完整名稱。

二、React類與JSX
接下來(lái),我們看到的是一個(gè)使用React創(chuàng)建的類——BookSearch。這個(gè)類只有一個(gè)渲染函數(shù),其任務(wù)就是決定什么會(huì)被輸出到屏幕上。在這個(gè)渲染函數(shù)中,我們使用了JSX(JavaScript語(yǔ)法擴(kuò)展)來(lái)構(gòu)建應(yīng)用程序的UI。
三、JSX與標(biāo)簽的使用
如果你熟悉XML(甚至HTML),你會(huì)發(fā)現(xiàn)JSX非常容易上手。JSX具有相似的標(biāo)簽開啟與關(guān)閉功能,以及使用屬性來(lái)設(shè)置標(biāo)簽值的功能。在提供的代碼中,我們看到了如何使用不同的Text標(biāo)簽來(lái)展示不同的信息,如歡迎語(yǔ)、啟動(dòng)指南,以及開發(fā)菜單的快捷鍵等。
四、JSX的優(yōu)勢(shì)

使用JSX來(lái)構(gòu)建React應(yīng)用程序的UI,有其獨(dú)特的優(yōu)勢(shì)。它提供了一種直觀的方式來(lái)定義UI的結(jié)構(gòu),使得代碼更易于閱讀和理解。對(duì)于那些有大量UI代碼的項(xiàng)目來(lái)說(shuō),通過(guò)大型的JSX樹結(jié)構(gòu)能更好地組織和管理代碼。JSX還可以幫助我們避免一些常見的編程錯(cuò)誤,提高代碼的質(zhì)量和穩(wěn)定性。
五、JSX與純JavaScript的比較
雖然React允許我們使用純JavaScript來(lái)編寫代碼,但JSX提供了一種更直觀、更簡(jiǎn)潔的方式來(lái)定義UI。盡管你可以選擇不使用JSX,但許多開發(fā)者發(fā)現(xiàn),使用JSX能使得React的開發(fā)過(guò)程更加順暢。使用JSX還是純JavaScript,主要取決于開發(fā)者的偏好和項(xiàng)目需求。
React和JSX為我們提供了一種全新的方式來(lái)構(gòu)建用戶界面,使得開發(fā)者能夠更專注于邏輯和數(shù)據(jù)的處理,而不用過(guò)多關(guān)注底層的UI細(xì)節(jié)。希望這篇文章能幫助你更好地理解React和JSX的基本概念和應(yīng)用。React Native樣式設(shè)計(jì)詳解
一、樣式創(chuàng)建與定義

在React Native中,樣式是通過(guò)StyleSheet.create方法進(jìn)行創(chuàng)建的。給定的樣式對(duì)象包含了各種屬性,如容器、文字、邊距等,它們分別對(duì)應(yīng)著不同的UI組件。例如,我們可以定義一個(gè)名為container的樣式對(duì)象,它擁有flex、justifyContent、alignItems等屬性,用于控制容器組件的布局和樣式。我們也定義了welcome和instructions兩種樣式,分別用于設(shè)置文字大小和顏色等屬性。這些樣式可以在JSX代碼中通過(guò)style屬性應(yīng)用到不同的組件上。
二、React Native的樣式應(yīng)用
如果你熟悉Web開發(fā)和CSS,那么React Native的樣式應(yīng)用應(yīng)該會(huì)很熟悉。React Native使用CSS樣式來(lái)定義應(yīng)用程序的UI。在JSX代碼中,我們可以看到不同風(fēng)格的代碼被用在不同的地方。例如,通過(guò)style={style.container}來(lái)設(shè)置容器的外部視圖,這個(gè)視圖包含了其他的UI組件。樣式的應(yīng)用使得UI組件的呈現(xiàn)更加豐富多彩。
三、React Native與Web開發(fā)的對(duì)比
React Native充分利用了Facebook的現(xiàn)有輪子,是一個(gè)很優(yōu)秀的集成作品。整個(gè)系統(tǒng)結(jié)構(gòu)與Web開發(fā)有所區(qū)別,例如JSX與HTML、CSS-layout與CSS、ECMAScript 6與ECMAScript 5等。對(duì)應(yīng)到前端開發(fā)上,React Native使用View來(lái)代替DOM,這使得整個(gè)系統(tǒng)的性能更加高效。無(wú)需編譯,只要更新云端的JS代碼并reload一下,整個(gè)界面就可以完全改變。這對(duì)于前端程序員來(lái)說(shuō),降低了學(xué)習(xí)成本,也大大減少了代碼量。

四、React Native iOS開發(fā)的評(píng)價(jià)
React Native在iOS開發(fā)中的表現(xiàn)非常出色。它充分利用了Native code的優(yōu)勢(shì),同時(shí)讓開發(fā)者能夠使用更加熟悉的前端技術(shù)來(lái)開發(fā)iOS應(yīng)用。React Native的開發(fā)效率高,熱重載特性使得開發(fā)過(guò)程更加流暢。React Native的社區(qū)活躍,有很多現(xiàn)成的庫(kù)和工具可以幫助開發(fā)者快速構(gòu)建應(yīng)用。雖然相比于原生開發(fā),React Native的學(xué)習(xí)曲線可能稍微陡峭一些,但是它的優(yōu)點(diǎn)使得它成為了一個(gè)值得學(xué)習(xí)的技術(shù)。
五、總結(jié)
React Native是一種非常優(yōu)秀的移動(dòng)應(yīng)用開發(fā)框架,它結(jié)合了前端技術(shù)與Native code的優(yōu)勢(shì),使得開發(fā)者能夠更高效地構(gòu)建出高質(zhì)量的移動(dòng)應(yīng)用。無(wú)論是從開發(fā)效率、性能還是社區(qū)支持方面,React Native都是一個(gè)值得考慮的選擇。如果你熟悉前端技術(shù)并且希望將這些技術(shù)應(yīng)用到移動(dòng)應(yīng)用開發(fā)上,那么React Native是一個(gè)不錯(cuò)的選擇。React Native系統(tǒng)深度解析:優(yōu)點(diǎn)、缺點(diǎn)與未來(lái)展望
=======================

一、React Native簡(jiǎn)介及其優(yōu)勢(shì)
React Native作為一種跨平臺(tái)的移動(dòng)應(yīng)用開發(fā)框架,復(fù)用React系統(tǒng)不僅降低了學(xué)習(xí)和開發(fā)成本,還充分利用了React的分層和diff機(jī)制。通過(guò)將js層傳遞給Native層經(jīng)過(guò)diff處理的json數(shù)據(jù),Native能夠?qū)⑦@些數(shù)據(jù)映射成真正的布局視圖。這種機(jī)制使得開發(fā)者可以繼續(xù)使用熟悉的類css方式進(jìn)行布局編寫,通過(guò)css-layout工具轉(zhuǎn)換成約束布局。
二、通信機(jī)制與調(diào)試體驗(yàn)
React Native系統(tǒng)采用js-objc單向調(diào)用機(jī)制,將原生UI組件的方法通過(guò)JavaScriptCore或WebView(針對(duì)低版本iOS)映射到JavaScript中。整個(gè)調(diào)用過(guò)程異步進(jìn)行,使得React Native可以在桌面Chrome中運(yùn)行js代碼。通過(guò)WebSocket連接Native code和桌面Chrome,調(diào)試體驗(yàn)得到了極大的提升。
三、操作抽象與響應(yīng)機(jī)制

四、開發(fā)便捷性與遺留問(wèn)題
開發(fā)便捷性是React Native的一大優(yōu)點(diǎn)。修改js代碼后,可以通過(guò)內(nèi)建的Node.js watcher編譯成bundle,在模擬器中快速預(yù)覽效果。通過(guò)Chrome調(diào)試工具,可以進(jìn)行斷點(diǎn)單步調(diào)試等操作。
系統(tǒng)仍然依賴原生組件暴露出來(lái)的組件和方法,這在某些情況下限制了開發(fā)者的操作。例如,ScrollView等組件在Native層擁有大量,但這些在現(xiàn)有版本中的React Native并未完全暴露。當(dāng)前版本中的許多組件是iOS only的,這要求開發(fā)者在不同平臺(tái)上編寫不同的代碼。
五、React Native的未來(lái)發(fā)展與挑戰(zhàn)
盡管React Native已經(jīng)超越了許多Hybrid方案,但其仍然面臨許多挑戰(zhàn)。由于最外層是React,初次學(xué)習(xí)成本高,但React確實(shí)讓后續(xù)開發(fā)變得簡(jiǎn)單了一些。React Native仍然很不完善,文檔不全,集成到現(xiàn)有應(yīng)用中的指導(dǎo)文檔也剛剛發(fā)布。官方表示,Android版本的發(fā)布將在半年后,屆時(shí)整個(gè)系統(tǒng)設(shè)計(jì)可能還會(huì)有很大的變化。對(duì)于開發(fā)者來(lái)說(shuō),如何適應(yīng)并充分利用React Native的優(yōu)勢(shì),同時(shí)應(yīng)對(duì)其挑戰(zhàn),將是未來(lái)發(fā)展的重要課題。

React Native作為一種新興的跨平臺(tái)移動(dòng)應(yīng)用開發(fā)框架,具有許多優(yōu)點(diǎn)和挑戰(zhàn)。我們需要深入了解其機(jī)制和特點(diǎn),以更好地應(yīng)對(duì)未來(lái)的開發(fā)挑戰(zhàn)。深入解析React Native:從TabBarItemIOS到核心機(jī)制
一、發(fā)現(xiàn)與解讀
在瀏覽代碼的過(guò)程中,我發(fā)現(xiàn)了名為TabBarItemIOS的代碼片段。它似乎是一個(gè)用于構(gòu)建iOS應(yīng)用中的標(biāo)簽頁(yè)項(xiàng)目的組件。其中有一個(gè)名為_ix_DEPRECATED的函數(shù),被用于設(shè)置圖標(biāo),同時(shí)有一個(gè)待處理的注釋:“// TODO(nicklockwood): How can this fit our require system?” 這引發(fā)了我進(jìn)一步探究的興趣。
二、背景與調(diào)研手段
近期,我們的團(tuán)隊(duì)對(duì)尚未開源的React Native進(jìn)行了深入研究。我們通過(guò)反編譯Facebook Group應(yīng)用的ipa代碼,獲得了數(shù)百個(gè)JS文件。經(jīng)過(guò)格式化并閱讀這些源碼,我對(duì)React Native的內(nèi)部核心機(jī)制有了基本了解。

三、React Native的核心實(shí)現(xiàn)之概述
React Native并非一個(gè)簡(jiǎn)單的Hybrid app,它不使用webview來(lái)執(zhí)行JS,而是依賴JavascriptCore。其核心由iOS Native code提供,包括十?dāng)?shù)個(gè)核心類(如RCTDeviceEventEmitter、RCTRenderingPerf等)和組件(如RCTView、RCTTextField、RCTTextView、RCTModalFullscreenView等)。這些核心類和組件構(gòu)成了React Native的JS部分,進(jìn)一步組合成基本組件(如Popover、Listview等),以供上層業(yè)務(wù)使用。
四、獨(dú)特的CSS子集實(shí)現(xiàn)
React Native解決樣式問(wèn)題的方式相當(dāng)獨(dú)特且強(qiáng)大。他們實(shí)現(xiàn)了一套類似css的子集,采用facebook/css-layout的GitHub的C語(yǔ)言版本為基礎(chǔ)。這套子集允許JS工程師通過(guò)拼裝基本組件來(lái)創(chuàng)建可用的React組件。在ppt中,我們看到了類似flex-direction: column的代碼,這正是css-layout支持的語(yǔ)法,展示了其強(qiáng)大的樣式處理能力。
五、工程師的角色與任務(wù)

在React Native項(xiàng)目中,JS工程師主要解決如何將基本組件拼裝成可用的React組件的問(wèn)題,而Native Code的工程師則致力于提供核心組件并確保足夠的擴(kuò)展性、靈活性和性能。兩者相互協(xié)作,共同推動(dòng)React Native應(yīng)用的開發(fā)與優(yōu)化。
以上是我在對(duì)React Native進(jìn)行深入研究后的一些理解和見解。隨著對(duì)該框架的進(jìn)一步探索和實(shí)踐,我相信還會(huì)有更多有趣和深入的認(rèn)識(shí)等待我們?nèi)グl(fā)現(xiàn)。React Native的設(shè)計(jì)與考慮
React Native與ReactJS的關(guān)系背景
盡管我對(duì)React Native的理解基于學(xué)習(xí)和使用Angular的經(jīng)驗(yàn),但我嘗試深入探討其設(shè)計(jì)理念。React Native與ReactJS有著緊密的聯(lián)系,但兩者在設(shè)計(jì)上存在一些顯著的差異。我將在接下來(lái)的內(nèi)容中詳細(xì)闡述這些差異和聯(lián)系。
ReactJS的設(shè)計(jì)理念

在理解React Native之前,我們需要先了解ReactJS的設(shè)計(jì)理念。ReactJS中的核心設(shè)計(jì)包括:
1. 使用工廠模式創(chuàng)建元素:ReactJS中的createElement方法并不直接返回實(shí)體DOM對(duì)象,而是返回一個(gè)包含多個(gè)元素的數(shù)組。這種設(shè)計(jì)使得組件的重用和組合變得更加靈活。
2. DOM的生成與渲染:ReactJS通過(guò)源碼中的ui/browser目錄下的代碼將元素?cái)?shù)組轉(zhuǎn)換成實(shí)際的DOM結(jié)構(gòu)。這種設(shè)計(jì)使得開發(fā)者可以專注于組件的邏輯,而無(wú)需關(guān)心DOM的具體生成過(guò)程。
3. 可擴(kuò)展的渲染核心:ReactJS的底層渲染核心是可以更換的,這使得React可以根據(jù)不同的平臺(tái)和需求進(jìn)行定制和優(yōu)化。這種靈活性為React Native的設(shè)計(jì)提供了基礎(chǔ)。
React Native的設(shè)計(jì)理念與實(shí)現(xiàn)

基于ReactJS的設(shè)計(jì)理念,React Native旨在通過(guò)JS開發(fā)Native應(yīng)用。其主要實(shí)現(xiàn)方式包括:
1. 橋接JS與Native代碼:通過(guò)替換ui/browser目錄中的代碼為一套Native的橋接JS,React Native可以直接復(fù)用React的MVVM模式,實(shí)現(xiàn)數(shù)據(jù)自動(dòng)映射到Native層。特別是iOS版本,通過(guò)injectGenericComponentClass方法注入核心組件的方法到JS中。
2. 核心API的設(shè)計(jì):Native代碼中實(shí)現(xiàn)了三組核心API,包括提供核心組件的API、方法和對(duì)css進(jìn)行解析及返回Style的ComputedStyle。這些API保證了Native開發(fā)的簡(jiǎn)潔性和高效性。
React Native的優(yōu)勢(shì)與劣勢(shì)
相比于傳統(tǒng)的Hybrid app和Webapp,React Native具有以下優(yōu)勢(shì):

1. 性能優(yōu)勢(shì):不使用WebView,解決了WebView帶來(lái)的交互和性能問(wèn)題,使得Native應(yīng)用的性能得到了充分的發(fā)揮。
2. 強(qiáng)大的擴(kuò)展性:由于Native端提供的是基本控件,JS可以自由組合使用,使得開發(fā)者可以創(chuàng)建出功能豐富、高度定制化的應(yīng)用。
3. 優(yōu)質(zhì)的動(dòng)畫效果:Native端可以輕松實(shí)現(xiàn)高質(zhì)量的動(dòng)畫效果,這些動(dòng)畫效果在Web開發(fā)中難以實(shí)現(xiàn)。
相較于Native app,React Native的劣勢(shì)也顯而易見:
1. 擴(kuò)展性仍然有限:盡管React Native允許通過(guò)更新遠(yuǎn)端JS來(lái)直接更新app,但其擴(kuò)展性仍然遠(yuǎn)遠(yuǎn)不如直接寫Native code。

2. 概念轉(zhuǎn)換的難題:從Native到Web的開發(fā)轉(zhuǎn)換,需要雙方的理解和妥協(xié),這可能會(huì)增加開發(fā)難度和成本。
一、React Native概述
React Native是一種構(gòu)建原生應(yīng)用程序的框架,它允許開發(fā)者使用JavaScript和React來(lái)編寫代碼。與傳統(tǒng)的原生開發(fā)相比,React Native能夠提供更快速的開發(fā)周期和更好的用戶體驗(yàn)。
二、CSS與React Native的關(guān)聯(lián)
在React Native中,CSS扮演了重要的角色。雖然它使用了一套閹割版的CSS,但通過(guò)css-layout,開發(fā)者可以獲得最終的樣式,并將其轉(zhuǎn)換為原生應(yīng)用的表達(dá)方式。例如,iOS中的Constraint、origin、Center等屬性都可以在React Native中找到對(duì)應(yīng)的實(shí)現(xiàn)。

三、動(dòng)畫在React Native中的應(yīng)用
動(dòng)畫是提升用戶體驗(yàn)的關(guān)鍵元素之一。React Native提供了強(qiáng)大的動(dòng)畫庫(kù),使得開發(fā)者能夠輕松地創(chuàng)建流暢、自然的動(dòng)畫效果。這些動(dòng)畫可以與應(yīng)用程序的其它部分無(wú)縫集成,為用戶帶來(lái)無(wú)與倫比的體驗(yàn)。
四、跨平臺(tái)開發(fā)的復(fù)雜性
盡管React Native支持Android和iOS兩個(gè)平臺(tái),但兩者的封裝和概念轉(zhuǎn)換存在一定的復(fù)雜性。開發(fā)者需要針對(duì)不同的平臺(tái)編寫特定的代碼,以確保應(yīng)用程序在各種設(shè)備上都能正常運(yùn)行。盡管如此,React Native仍然為跨平臺(tái)開發(fā)提供了許多便利的工具和組件,簡(jiǎn)化了開發(fā)過(guò)程。
五、React Native的特點(diǎn)與優(yōu)劣

1. 特點(diǎn):
快速開發(fā):使用JavaScript和React編寫的代碼,使得開發(fā)過(guò)程更加快速和高效。
豐富的組件庫(kù):React Native擁有龐大的開源社區(qū)和豐富的組件庫(kù),開發(fā)者可以輕松地構(gòu)建復(fù)雜的應(yīng)用程序。
良好的用戶體驗(yàn):React Native應(yīng)用程序具有與原生應(yīng)用程序相似的性能和用戶體驗(yàn)。
2. 優(yōu)劣:

優(yōu)勢(shì):開源、跨平臺(tái)支持、良好的性能和用戶體驗(yàn)、豐富的社區(qū)和組件庫(kù)。
劣勢(shì):對(duì)于大型項(xiàng)目,可能需要處理復(fù)雜的依賴關(guān)系和構(gòu)建配置。由于React Native的更新速度較快,開發(fā)者需要不斷學(xué)習(xí)和適應(yīng)新的技術(shù)和工具。
React Native為前端工程師和系統(tǒng)開發(fā)者提供了一個(gè)強(qiáng)大的工具,使他們能夠快速地構(gòu)建高質(zhì)量的原生應(yīng)用程序。盡管存在一些挑戰(zhàn),但React Native的開源性和強(qiáng)大的社區(qū)支持使得它成為了一個(gè)值得信賴的選擇。