[React-01] React的起源和發(fā)展

React 起源于 Facebook 的內(nèi)部項目辆脸,因為該公司對市場上所有 JavaScript MVC 框架抵栈,都不滿意,就決定自己寫一套齿拂,用來架設(shè)Instagram 的網(wǎng)站。做出來以后肴敛,發(fā)現(xiàn)這套東西很好用署海,就在2013年5月開源了吗购。

React與傳統(tǒng)MVC的關(guān)系

輕量級的視圖層A JavaScript library for building user interfaces

React不是一個完整的MVC框架砸狞,最多可以認為是MVC中的V(View)捻勉,甚至React并不非常認可MVC開發(fā)模式;React 構(gòu)建頁面 UI 的庫刀森□馄簦可以簡單地理解為,React 將將界面分成了各個獨立的小塊研底,每一個塊就是組件埠偿,這些組件之間可以組合、嵌套榜晦,就成了我們的頁面冠蒋。

React高性能的體現(xiàn):虛擬DOM

React高性能的原理:

在Web開發(fā)中我們總需要將變化的數(shù)據(jù)實時反應(yīng)到UI上,這時就需要對DOM進行操作乾胶。而復(fù)雜或頻繁的DOM操作通常是性能瓶頸產(chǎn)生的原因(如何進行高性能的復(fù)雜DOM操作通常是衡量一個前端開發(fā)人員技能的重要指標(biāo))抖剿。

React為此引入了虛擬DOM(Virtual DOM)的機制:在瀏覽器端用Javascript實現(xiàn)了一套DOM API∈读基于React進行開發(fā)時所有的DOM構(gòu)造都是通過虛擬DOM進行斩郎,每當(dāng)數(shù)據(jù)變化時,React都會重新構(gòu)建整個DOM樹喻频,然后React將當(dāng)前整個DOM樹和上一次的DOM樹進行對比孽拷,得到DOM結(jié)構(gòu)的區(qū)別,然后僅僅將需要變化的部分進行實際的瀏覽器DOM更新半抱。而且React能夠批處理虛擬DOM的刷新脓恕,在一個事件循環(huán)(Event Loop)內(nèi)的兩次數(shù)據(jù)變化會被合并,例如你連續(xù)的先將節(jié)點內(nèi)容從A-B,B-A窿侈,React會認為A變成B炼幔,然后又從B變成A UI不發(fā)生任何變化,而如果通過手動控制史简,這種邏輯通常是極其復(fù)雜的乃秀。

盡管每一次都需要構(gòu)造完整的虛擬DOM樹,但是因為虛擬DOM是內(nèi)存數(shù)據(jù)圆兵,性能是極高的跺讯,部而對實際DOM進行操作的僅僅是Diff分,因而能達到提高性能的目的殉农。這樣刀脏,在保證性能的同時,開發(fā)者將不再需要關(guān)注某個數(shù)據(jù)的變化如何更新到一個或多個具體的DOM元素超凳,而只需要關(guān)心在任意一個數(shù)據(jù)狀態(tài)下愈污,整個界面是如何Render的耀态。

React Fiber:

在react 16之后發(fā)布的一種react 核心算法,React Fiber是對核心算法的一次重新實現(xiàn)(官網(wǎng)說法)暂雹。之前用的是diff算法首装。

在之前React中,更新過程是同步的杭跪,這可能會導(dǎo)致性能問題仙逻。

當(dāng)React決定要加載或者更新組件樹時,會做很多事涧尿,比如調(diào)用各個組件的生命周期函數(shù)系奉,計算和比對Virtual DOM,最后更新DOM樹现斋,這整個過程是同步進行的喜最,也就是說只要一個加載或者更新過程開始偎蘸,中途不會中斷庄蹋。因為JavaScript單線程的特點,如果組件樹很大的時候迷雪,每個同步任務(wù)耗時太長限书,就會出現(xiàn)卡頓。

React Fiber的方法其實很簡單——分片章咧。把一個耗時長的任務(wù)分成很多小片倦西,每一個小片的運行時間很短,雖然總時間依然很長赁严,但是在每個小片執(zhí)行完之后扰柠,都給其他任務(wù)一個執(zhí)行的機會,這樣唯一的線程就不會被獨占疼约,其他任務(wù)依然有運行的機會卤档。

React的特點和優(yōu)勢

  1. 虛擬DOM

之前您操作dom的方式是通過document.getElementById()的方式,這樣的過程實際上是先去讀取html的dom結(jié)構(gòu)程剥,將結(jié)構(gòu)轉(zhuǎn)換成變量劝枣,再進行操作

而reactjs定義了一套變量形式的dom模型,一切操作和換算直接在變量中织鲸,這樣減少了操作真實dom舔腾,性能真實相當(dāng)?shù)母撸椭髁鱉VC框架有本質(zhì)的區(qū)別搂擦,并不和dom打交道

  1. 組件系統(tǒng)

react最核心的思想是將頁面中任何一個區(qū)域或者元素都可以看做一個組件 component

那么什么是組件呢稳诚?

組件指的就是同時包含了html、css瀑踢、js采桃、image元素的聚合體

使用react開發(fā)的核心就是將頁面拆分成若干個組件懒熙,并且react一個組件中同時耦合了css、js普办、image工扎,這種模式整個顛覆了過去的傳統(tǒng)的方式

  1. 單向數(shù)據(jù)流

其實reactjs的核心內(nèi)容就是數(shù)據(jù)綁定,所謂數(shù)據(jù)綁定指的是只要將一些服務(wù)端的數(shù)據(jù)和前端頁面綁定好衔蹲,開發(fā)者只關(guān)注實現(xiàn)業(yè)務(wù)就行了

  1. JSX 語法

在vue中肢娘,我們使用render函數(shù)來構(gòu)建組件的dom結(jié)構(gòu)性能較高,因為省去了查找和編譯模板的過程舆驶,但是在render中利用createElement創(chuàng)建結(jié)構(gòu)的時候代碼可讀性較低橱健,較為復(fù)雜,此時可以利用jsx語法來在render中創(chuàng)建dom沙廉,解決這個問題拘荡,但是前提是需要使用工具來編譯jsx

React相關(guān)的解決方案

  • web: react-dom + react-router
  • app: react-native + react-navigation
  • VR: react-360
  • 狀態(tài)管理: redux/mobx…
  • UI框架: antd/material…
  • 多端統(tǒng)一解決方案: taro…
  • 相關(guān)腳手架: create-react-app/react-native-cli/umi…
  • 調(diào)試工具: react-devtools

官方腳手架create-react-app

全局安裝create-react-app

$ npm install -g create-react-app

創(chuàng)建一個項目

$ create-react-app your-app 注意命名方式

Creating a new React app in /dir/your-app.

Installing packages. This might take a couple of minutes. 安裝過程較慢,可以使用yarn
Installing react, react-dom, and react-scripts... 

如果不想全局安裝撬陵,可以直接使用npx

$ npx create-react-app your-app 也可以實現(xiàn)相同的效果

這需要等待一段時間珊皿,這個過程實際上會安裝三個東西

  • react: react的頂級庫
  • react-dom: 因為react有很多的運行環(huán)境,比如app端的react-native, 我們要在web上運行就使用react-dom
  • react-scripts: 包含運行和打包react應(yīng)用程序的所有腳本及配置巨税,要了解更多的配置可以系統(tǒng)學(xué)習(xí)一下webpack.

出現(xiàn)下面的界面蟋定,表示創(chuàng)建項目成功:

Success! Created your-app at /dir/your-app
Inside that directory, you can run several commands:

  npm start
    Starts the development server.

  npm run build
    Bundles the app into static files for production.

  npm test
    Starts the test runner.

  npm run eject
    Removes this tool and copies build dependencies, configuration files
    and scripts into the app directory. If you do this, you can’t go back!

We suggest that you begin by typing:

  cd your-app
  npm start

Happy hacking!

根據(jù)上面的提示,通過cd your-app命令進入目錄并運行npm start即可運行項目草添。

生成項目的目錄結(jié)構(gòu)如下:

├── README.md                           使用方法的文檔
├── node_modules                    所有的依賴安裝的目錄
├── package-lock.json           鎖定安裝時的包的版本號,保證團隊的依賴能保證一致驶兜。
├── package.json                    
├── public                              靜態(tài)公共目錄
└── src                                     開發(fā)用的源代碼目錄

常見問題:

  • npm安裝失敗
    • 切換為npm鏡像為淘寶鏡像
    • 使用yarn,如果本來使用yarn還要失敗远寸,還得把yarn的源切換到國內(nèi)
    • 如果還沒有辦法解決抄淑,請刪除node_modules及package-lock.json然后重新執(zhí)行npm install命令
    • 再不能解決就刪除node_modules及package-lock.json的同時清除npm緩存npm cache clean --force之后再執(zhí)行npm install命令
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市驰后,隨后出現(xiàn)的幾起案子肆资,更是在濱河造成了極大的恐慌,老刑警劉巖倡怎,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迅耘,死亡現(xiàn)場離奇詭異,居然都是意外死亡监署,警方通過查閱死者的電腦和手機颤专,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钠乏,“玉大人栖秕,你說我怎么就攤上這事∠埽” “怎么了簇捍?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵只壳,是天一觀的道長。 經(jīng)常有香客問我暑塑,道長吼句,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任事格,我火速辦了婚禮惕艳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘驹愚。我一直安慰自己远搪,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布逢捺。 她就那樣靜靜地躺著谁鳍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪劫瞳。 梳的紋絲不亂的頭發(fā)上倘潜,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音柠新,去河邊找鬼窍荧。 笑死辉巡,一個胖子當(dāng)著我的面吹牛恨憎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播郊楣,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼憔恳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了净蚤?” 一聲冷哼從身側(cè)響起钥组,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎今瀑,沒想到半個月后程梦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡橘荠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年屿附,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哥童。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡挺份,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贮懈,到底是詐尸還是另有隱情匀泊,我是刑警寧澤优训,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站各聘,受9級特大地震影響揣非,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜躲因,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一妆兑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧毛仪,春花似錦搁嗓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至衡怀,卻和暖如春棍矛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抛杨。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工够委, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人怖现。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓茁帽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親屈嗤。 傳聞我的和親對象是個殘疾皇子潘拨,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • React基礎(chǔ) React組件化編程 Create React App 創(chuàng)建React 前端工程 題外話題:頁面性...
    BeautifulHao閱讀 1,542評論 0 3
  • 原教程內(nèi)容詳見精益 React 學(xué)習(xí)指南,這只是我在學(xué)習(xí)過程中的一些閱讀筆記饶号,個人覺得該教程講解深入淺出铁追,比目前大...
    leonaxiong閱讀 2,834評論 1 18
  • 作為一個合格的開發(fā)者,不要只滿足于編寫了可以運行的代碼茫船。而要了解代碼背后的工作原理琅束;不要只滿足于自己的程序...
    六個周閱讀 8,443評論 1 33
  • 40、React 什么是React算谈?React 是一個用于構(gòu)建用戶界面的框架(采用的是MVC模式):集中處理VIE...
    萌妹撒閱讀 1,014評論 0 1
  • 在上一節(jié)中涩禀,我們學(xué)習(xí)了Nginx+PHP7+MySQL的安裝配置,在這一篇文章中濒生,我們來學(xué)習(xí)如何在一個Nginx服...
    易百教程閱讀 7,930評論 0 11