查看原文內容html
咱們很高興的宣佈React v16.0發佈了! 這個版本有不少長期被使用者期待的功能,包括:react
(下面逐一說明)git
新的版本支持組件的render方法返回包含元素的數組類型,代碼以下:github
render() { //不須要再把全部的元素綁定到一個單獨的元素中了 return [ // 別忘記加上key值 <li key="A"/>First item</li>, <li key="B"/>Second item</li>, <li key="C"/>Third item</li>, ]; }
新的版本也支持render方法返回的類型爲strings。npm
關於render()方法的詳細說明,請查看API文檔。數組
以前的React,渲染過程當中若是遇到運行時的錯誤,可能會致使整個React組件的崩潰,併產生一些隱藏的錯誤信息,須要從新刷新才能恢復。爲了解決這個問題,React16 使用了一個更有彈性的錯誤處理策略。默認狀況下,若是一個錯誤是在組件的渲染或者生命週期方法中被拋出,整個組件結構就會從根節點中卸載。這種方式阻礙了被壞數據的展現,然而,卻不是很好的用戶體驗。瀏覽器
新的策略,對於這種一出現錯誤就卸載整個組件app的方式進行了改善,你可使用error boundaries(錯誤邊緣)來進行處理,它是專門用來抓取其下子組件錯誤並向視圖展現錯誤信息的組件。將error boundaries(錯誤邊緣)想象成try{}catch(){}語句,只是它是React專用而已。安全
想要查看更多關於這個特性的說明,請查看這篇文章。架構
Portals(掛載方式)提供了一個很是好的方式,能夠將渲染的children插入到一個DOM節點,而這個節點能夠是存在於當前組件dom結構外的其餘節點。app
render() { // 能夠沒必要建立一個新的div標籤,divNode是一個存在於dom結構的節點,不須要考慮這個節點的位置 return React.createPortal( this.props.children, divNode, ); }
React16更好的支持服務端html的渲染,再也不須要服務端進行初始化渲染以匹配結果了,它會嘗試從新利用盡量多的已經存在的DOM節點。
服務端渲染器被徹底重寫用以支持流。React的核心成員Sasha Aicken,它是這個功能的貢獻者,寫了一篇很是好的文章來描述React16 SSR的提高。「渲染流的方式可以減小獲取響應首字節前所花費的毫秒數(TTFB),將頁面文檔的開頭沿着電纜發送到瀏覽器端時,下一部分的頁面文檔已經造成了。用這種流的方式,全部的主流瀏覽器都會更早的開始解析和渲染頁面文檔」。
取代以前忽略不識別的HTML和SVG屬性的方式,新的版本將會把它們傳遞給DOM元素。這個新特性會讓咱們擺脫可用的React屬性白名單,從而減小文件的大小。
除了上面提交到的這些特性,React16要比v15.6.1更小!
文件大小的變化部分歸功於打包工具的改變。React如今使用Rollup針對不一樣的目標格式建立打包,進而使文件大小和運行時性能都表現優秀。
React16是React第一個創建在一個稱爲"Fiber"全新架構的版本。你能夠經過閱讀Facebook的工程博客瞭解Fiber所有的內容。
這個版本中的大部分功能,好比error boundaries和fragments,這都是經過重寫和核心架構來實現這些可能的。而過後的幾個版本中,你可以回去更多的新特性,由於咱們會開始全力釋放React的所有潛能。
也許最讓人興奮的地方是咱們正致力於async rendering(異步渲染)的工做 —— 這個策略能經過週期性的向瀏覽器發佈執行任務從而協同調度渲染工做。結果就是使用異步渲染,應用將會更加響應式,由於React避免了主線程的阻塞。
咱們認爲異步渲染是一個充滿意義的功能,它表明了React的將來。爲了可以保證現有項目平滑的融合v16.0版本,這個版本咱們並無啓動任何異步的特性,可是在接下來的幾個月裏咱們會很是高興的請它隆重登場。請你們拭目以待!
就長期的升級來講,儘管React16只是包括了一些有意義的內部改變,這個版本和其餘主要的React版本仍可勢均力敵。在今年早期的時候,新版版已服務於React和Messenger.com,而後咱們經過發佈一些beta版本和候選版原本解決增長的問題。除少數例外,若是你的項目使用v15.6版本沒有任何警示,那麼能夠升級到v16來服務項目了。
Hydrating一個服務端渲染的容器如今有了一個明確的API,若是你要進行服務端渲染,請使用ReactDOM.hydrate方法替換ReactDOM.render,客戶端的渲染請保持使用ReactDOM.render方法。
setState:
瀏覽器單文件版本構建文件的名字和路徑的改變是爲了強調開發和生產環境的不一樣。以下所示:
( Over... )