推薦幾個 React 性能優化工具

本文翻譯自 5 Recommended Tools for Optimizing Performance in ReactJS,做者 Chidume Nnamdi,有較大的刪改。css

Profiler

Code SandBox

能夠前往 codesandbox.io/s/react-pro… 在線編輯效果。前端

Profiler 是 React 中的一個組件,由 B. Vaughn 開發,它能夠測量 React 應用渲染的頻率和渲染所花費的時間資源。Profiler 提供一個函數屬性 onRender,當組件 mount 或者 update 的時候,這個函數會接受到一些時間指標。用這些時間指標你就能夠發現效率低下的代碼了。java

import React, { Profiler } from 'react';

...
<Profiler id="Counter1" onRender={this.callback1(this)}>
  <Counter1 /> </Profiler>
複製代碼

id 用來標識對應的 Profiler 組件,onRender 函數會在組件 mount 或者 update 的時候執行,它的參數結構以下:python

function onRenderCallback( id, phase, actualDuration, baseDuration, startTime, commitTime, ) {
  console.log('onRenderCallback', {
    id,
    phase,
    actualDuration, 
    baseDuration,
    startTime,
    commitTime,
  })
}
複製代碼
  • id 組件 id;
  • phase 執行階段,mount 或者 update;
  • actualDuration Profiler 和子組件渲染當前的更新所花費的時間,這個值在首次 mount 的時候比 update 階段的值大;
  • baseDuration 子組件最近一次渲染所持續的時長
  • startTime 開始渲染當前的更新的時間戳
  • commitTime React 提交當前更新的時間戳

這些數據能夠幫助咱們分析組件運行的效率,找到性能瓶頸。react

React Developer tools

React Developer tools 是 React 官方團隊發佈的一個瀏覽器插件,功能十分強大。我要介紹的是 Highlight Update 這個功能。這個工具用來檢測組件重複渲染很是有效。他能夠用不一樣的顏色來標識組件的邊框,顏色越黃表示這個組件重複渲染的次數越多。android

若是你有一個組件樹像下面這樣:ios

若是 Main 組件重複渲染了,那麼封裝 Counter 和 Count 組件的邊界就會出現一個邊框表示重複渲染。git

咱們激活這個特性以後,在 ReactJS 官網開啓關閉右側的菜單,會出現邊框提示:github

如何激活這個特性呢?找到調試工具的 Components 一欄,點擊右上角的小齒輪,再選中彈窗中的 Highlight updates when components render.web

邊框的類型取決於重複渲染的程度,重複渲染越多,顏色越深。

|    綠色 - 低頻次更新
|    藍色 - 通常頻次更新
v    紅色 - 高頻次更新
複製代碼

經過使用這個工具,咱們能夠經過邊框顏色來輕易找到有性能問題的組件,並對它作針對性的優化。

why-did-you-render

github.com/welldone-so…,這個工具是由 Welldone Software 開發的,用來對組件重複渲染給出反饋。

它會對組件的 props 作 diff,若是組件從新渲染了,可是 props 並沒改變,它會在命令行提醒你 props 並無變化。

重複渲染在小型應用中影響可能不大,可是在大型項目中將確定會有影響。

這個工具嵌入到了 React 組件的生命週期中,因此他能在組件從新渲染時比對 props 是否變化。

使用方法很簡單,先安裝

npm install @welldone-software/why-did-you-render --save
複製代碼

而後註冊一次:

whyDidYouRender(React, {
  trackAllPureComponents: true
});
複製代碼

而後對 class component:

class Counter extends React.Component {
  static whyDidYouRender = true;
  render() {
   //...
  }
}
複製代碼

對函數組件:

function Counter() {
  return(
   // ...
  )
}
Counter.whyDidYouRender = true;
複製代碼

下面是一個完整的例子,每次 setState 時候,style={{ width: "100%" }} 都是一個新的值,因此會觸發比對。

import React from "react";
import "./styles.css";
const whyDidYouRender = require("@welldone-software/why-did-you-render");
whyDidYouRender(React, {
  trackAllPureComponents: true
});
export default class App extends React.Component {
  constructor() {
    super();
    this.state = {
      count: 1
    };
  }
  render() {
    return (
      <div className="App"> <button onClick={() => this.setState({ count: this.state.count + 1 })}> add </button> <p>{this.state.count}</p> <Comp style={{ width: "100%" }} /> </div> ); } } function Comp(props) { return <div>100</div>; } Comp.whyDidYouRender = true; 複製代碼

前往 Code SandBox 測試 codesandbox.io/s/distracte…

Performance timeline (Browser profiling)

這個工具是 Chrome 自帶的調試工具,在 Performance 一欄中。

它能夠很是有效地查看嚴重重複渲染的組件,它也能夠很方便地查看 UI 沒必要要的更新及其出現的頻次。

在使用工具以前,先以開發模式把你的 React app 啓動起來。

而後,打開開發者工具,切換到 Performance 面板。

點擊中間的圓點或者用快捷鍵 command + e,開發者工具就開始錄製了,而後你能夠在你的應用中作一些交互動做。

建議錄製時間在 20 秒以上,時間到了以後,點擊中間的 stop,或者左上角紅點。

而後咱們就能夠看到時間線了。

咱們能夠滑動選擇一片區域,而後經過 W 放大或者經過 S 縮小。選中一片區域,經過 W 鍵一直放大。

每一個橙色的條表明一個執行過程,在這個條中你能夠看到組件名、組件執行的階段、以及執行時間。在上面這張圖片中,App 的執行階段是 update 階段,這表示 App 組件這段時間是在執行更新操做,執行所耗費的時間是 1.71 ms。

組件每次渲染的時候一個新的黃條就會生成,若是一個組件屢次渲染,經過這個 Timings 圖表可讓你更容易追因。每一個黃條的長度表示組件的執行時間,黃條越長,執行時間也越長。你可使用這個工具來診斷頁面。


若是你以爲文章不錯,請點上一個贊👍,若是你有疑惑,能夠在評論區提問,創做不易,您的點贊和評論是對我最大的鼓勵~~

歡迎關注公衆號 雲影sky,分享的不只僅是技術,還有成長~~


神策數據招人啦

神策數據(sensorsdata.cn) 招人啦~~

公司在北京、上海、武漢、成都、合肥、深圳招人中,待遇優厚~

零食、肥宅快樂水、免費午飯晚餐、晚上下班免費坐車...

神策數據(Sensors Data)隸屬於神策網絡科技 (北京) 有限公司,是專業的大數據分析平臺服務提供商,致力於幫助客戶實現數據驅動。公司圍繞用戶級大數據分析和管理需求,推出神策分析、神策智能運營、神策智能推薦、神策用戶畫像、神策客景等產品。

目前,神策已積累中國銀聯、中國電信、小米、中郵消費金融、海通證券、廣發證券、東方證券、中原銀行、百信銀行、中青旅、平安壽險、四川航空、翼支付、好將來、VIPKID、華潤、有贊、百姓網、貨拉拉、閃送、驢媽媽、Keep、36氪、拉勾、VUE、春雨醫生、聚美優品、撈月狗、紛享銷客、媽媽幫等 1000 餘家付費企業用戶的服務和客戶成功經驗,爲客戶全面提供指標梳理、數據模型搭建等專業的諮詢、實施和技術支持服務。

創始團隊

創始人、CEO 桑文鋒:在百度任職 8 年,構建了百度用戶日誌大數據平臺。歷任軟件工程師、高級軟件工程師、項目經理、高級項目經理、技術經理,2015 年離職建立神策數據,針對企業級用戶推出用戶行爲分析產品神策分析,幫助企業實現數據驅動。

聯合創始⼈、CTO 曹犟:清華⼤學計算機碩⼠,2008 年⾄ 2014 年就任於百度⼤數據部,擔任百度⽤戶數據倉庫(BUDW)技術負責⼈,2015 年 4 ⽉成爲神策數據聯合創始⼈並擔任神策數據 CTO 職務。

聯合創始⼈、COO 劉耀洲:中國地質⼤學計算機應⽤技術碩⼠。曾供職於新浪、阿⾥巴巴、百度等公司,2015 年 4 ⽉離開百度,做爲聯合創始⼈創⽴神策數據並任 COO。

聯合創始⼈、技術 VP 付⼒⼒:畢業於北京理⼯⼤學軟件⼯程專業,2008 年⾄ 2013 年期間歷任百度新產品研發部、⽹頁搜索部、基礎架構部⼯程師。現任神策數據聯合創始⼈及技術VP。

融資日曆

  • 公司於 2015 年成立,天使輪融資 600w 人民幣
  • 2016 年得到 400w 美圓 A 輪融資
  • 2017 年得到 1100w 美圓 B 輪融資
  • 2018 年得到 4400w 美圓 C 輪融資
  • 2020 年 5 月得到 3000w 美圓 C+ 輪融資

紅杉資本、華平投資、DCM 中國、襄禾資本持續跟投,公司技術有挑戰,待遇也很是好,誠邀各位大牛加入~~

社招 JD

前端研發、前端架構師(北京、成都、武漢)

工做職責:

  • 負責數據可視化分析業務的 Web 前端研發;
  • 與產品設計師一塊兒,優化整個產品的使用流程,爲使用者提供更好的數據可視化效果;
  • 負責前端新技術的探索與實踐;

咱們的挑戰:

  • 單頁面複雜 Web 應用,須要管理 10 萬行業務代碼,代碼量還在快速增加中;
  • 與大量數據打交道,須要對數據業務有深層次的理解;
  • 服務大量客戶,產品快速迭代的同時,要讓系統在健康的軌道上發展;

對工程師的要求:

  • 熟練掌握 HTML/CSS/JavaScript 等前端基礎技術;
  • 能寫出高質量的代碼,有良好的代碼風格、瞭解各類設計模式;
  • React/Vue/Angular 技術棧至少掌握其中一種,對背後的設計思路應該比較瞭解,讀源碼應該沒什麼困難;
  • 10 萬行代碼在瀏覽器裏運行,性能方面是個挑戰,怎麼分析、優化性能應該有必定的瞭解;
  • 很好的業務理解能力,與大數據打交道,須要理解的不僅是頁面上有哪些 UI 組件;
  • 有可視化相關經驗優先(掌握Canvas/SVG/WebGL等Web渲染技術及標準,熟悉D三、ECharts、Highcharts、AntV、THREEJS等開源庫)

Java 研發工程師、Java架構師(北京、武漢)

工做職責:

  • 負責神策大數據產品 Web 後端的架構設計和開發工做;
  • 維護和升級現有技術框架,保證系統的穩定性和性能;
  • 理解大數據分析產品業務需求,負責新功能的技術開發;
  • 團隊合做,參與大數據導入、存儲與查詢方向的技術調研和技術攻關;

職位要求:

  • 計算機或相關專業畢業,本科及以上學歷;
  • 精通 Java 語言,具備紮實的計算機技術基礎和良好的編程習慣;
  • 熟悉 Spring/MyBatis/Netty/Nginx 等 Web 開源技術和框架;
  • 精通數據庫設計(MySQL優先),優秀的SQL編寫及調優能力,熟悉常見NoSQL存儲,如Hbase/Kudu/Redis/Mongodb等;
  • 瞭解 Hadoop/Hive/Spark/Impala 等開源大數據技術優先;
  • 善於學習新知識,主動性強;
  • 良好的團隊合做精神,較強的溝通能力;

推薦系統研發工程師、專家(北京)

工做職責:

  • 負責大規模推薦系統及機器學習相關係統設計與實現;
  • 設計和實現高可用、可擴展、高性能的存儲與計算系統:

崗位要求:

  • 精通 Python, C++, Java 中的一種語言, 數據結構、算法基礎;
  • 計算機基礎知識紮實,熟悉 Linux 開發環境, 操做系統原理, 對分佈式系統具備濃厚興趣;
  • 能快速理解業務場景,從具體問題中抽象出通用的解決方案;
  • 瞭解經常使用機器學習、天然語言處理等算法;
  • 有推薦系統、搜索引擎、計算廣告系統等相關工做經驗優先;
  • 有實際的大規模分佈式系統相關工做經歷優先;
  • 有 Hadoop 相關係統使用和開發經驗優先;

測試開發工程師(北京、武漢、合肥)(合肥是 ios android SDK 測試)

工做職責:

  • 負責數據應用產品的測試開發工做,協同產品經理、研發團隊交付高質量的產品;
  • 對產品質量問題進行跟蹤分析和報告,推進測試中發現問題及時合理的解決;
  • 完善研發過程當中質量問題的發現機制,提高測試效率;

崗位要求:

  • 計算機相關專業,本科及以上學歷;
  • 具備3年以上大型項目系統級測試經驗,熟悉軟件研發流程;
  • 熟悉至少一種 BUG 追蹤及持續集成工具的使用;
  • 熟悉前端測試自動化框架,有前端自動化測試經驗者優先;
  • 至少熟悉python、shell、java等一門腳本語言;
  • 具備較強的業務分析能力,較好的溝通表達和綜合協調能力;
  • 作事積極主動,責任心強,有快速學習能力,對大數據方向感興趣。

運維工程師、架構師(北京、合肥)

崗位職責:

  • 負責神策分析 SaaS 集羣環境的運維;
  • 負責神策分析私有部署環境的產品安裝及運維工做;
  • 參與產品安裝程序及運維繫統的改進;
  • 向客戶提供其它運維相關的技術支持;

任職要求:

  • 本科或本科以上學歷,計算機相關專業;
  • 有兩年以上互聯網行業的運維經驗;
  • 熟悉Linux系統,有 Hadoop 等分佈式系統的運維經驗;
  • 熟悉 Shell、Python 等至少一種腳本語言;
  • 具備良好的語言表達能力和客戶溝通能力,有較強的壓力承受能力;

ios、android、web JS SDK 研發工程師(合肥)

工做職責:

  • 負責神策 SDK 的設計、開發、優化。

崗位要求:

  • 本科及以上學歷,計算機或相關專業;
  • 三年及以上相關平臺(ios、android、web)開發經驗;

ios sdk

  • IOS sdk 精通 Object-C、RunTime 等 iOS 主流開發技術;
  • 熟悉各個不一樣版本 iOS 的特色;
  • 精通多線程和網絡編程,對高性能程序設計、架構有較多的工程經驗;
  • 具備較強的分析問題和解決問題的能力;
  • 具有良好的團隊協做能力、溝通能力和學習能力,有責任感。

android sdk

  • 有紮實的 Java 語言基礎、精通 Android 體系結構,熟悉 Framework 層;
  • 精通多線程和網絡編程,對高性能程序設計、架構有較多的工程經驗;
  • 有完整的 Android 項目經驗;

web js sdk

  • 負責神策前端 SDK 相關的調研,開發,維護,客戶支持;
  • 前端 SDK 包括,Web ,微信小程序,支付寶小程序,其餘小程序,快應用等。
  • 熟練而且全面的掌握 JavaScript 各類基礎知識及技術細節,好比做用域,Cookie 等;
  • 時刻關注前沿的 JS 技術,包括 ES6,React,Vue 等;

產品設計師(北京)

職位描述:

  • 負責神策數據系列產品的界面設計工做;
  • 根據產品需求尋找合適的設計方案,輸出交互和 UI 細節;
  • 對上線後效果和用戶體驗負責,推進產品持續改進;
  • 與產品經理,工程師緊密溝通協做,共同達成目標;

職位要求:

  • 2 年以上設計經驗,有完整的 PC 端、移動端產品設計經驗;
  • 有 B 端設計經驗優先;
  • 具有優秀的視覺和必定的交互設計能力,熟練掌握設計工具,重視設計細節同時具有總體意識;
  • 有較強的邏輯思惟能力和溝通能力,準確理解信息,清晰表達想法,在團隊合做中促成共識;
  • 優秀的學習能力,自我驅動,追求效率,好奇心強,不自我設限;
  • 提供完整的做品集;

產品經理、產品 Leader(北京)

工做職責:

  • 負責用戶行爲分析產品線的需求分析、設計、交付;
  • 對上線後效果負責,推進產品持續改進;
  • 參與智能化營銷、標籤、畫像、推薦、慧報等產品的探索與驗證。

職位要求:

  • 三年以上產品經驗,有數據產品經驗;
  • 優秀的產品需求設計能力,能產出高質量原型與文檔,熱愛數據分析領域;
  • 系統思考能力、自我驅動、迭代思惟,對數據產品有看法和實踐;
  • 計算機、數學等理工科背景優先。

數據分析師(北京、上海、深圳)

工做職責:

  • 協助客戶梳理數據應用需求,從客戶業務需求場景出發,指導客戶完成多維度指標體系搭建,協助客戶在神策數據平臺上完成數據採集、分析與應用全流程工做;
  • 以解決客戶業務問題爲目標,結合行業經驗與方法論,提供諮詢服務和專題分析報告;
  • 梳理客戶成功案例,造成行業解決方案,沉澱各業務領域的知識庫;
  • 與產品部門、技術部門配合,基於項目實踐,產出產品改進需求,推進產品持續優化與完善;

崗位要求:

  • 2年以上互聯網或諮詢行業數據關聯工做經驗,數據產品、數據分析、數據運營崗優先;
  • 熟悉數據平臺的總體搭建,具有可視化數據或者營銷平臺搭建項目經驗優先;
  • 熟練使用統計分析工具,邏輯嚴謹,可以獨立分析和解決問題;
  • 具有優秀的溝通及服務意識,良好的現場表達能力,可以獨立負責和推動項目;
  • 具有極強的學習能力和自我驅動意識,可以發現問題並解決問題;
  • 對大數據行業感興趣;

校招 JD

前端工程師(北京)

工做職責:

  • 負責神策核心數據產品的 Web 前端的開發
  • 與產品設計師一塊兒,優化整個產品的使用流程,爲使用者提供更好的數據可視化效果
  • 與團隊夥伴一塊兒進行前端新技術的探索與實踐

崗位要求:

  • 計算機相關專業,本科及以上學歷
  • 熟悉 HTML/CSS/JavaScript 等前端相關技術,瞭解前沿的 JS 技術更加分,包括 ES6,React,Vue 等
  • 對寫代碼以外的事情能熟練運用各類工程工具處理,對工具背後的工做原理應該有一些瞭解
  • 對大數據方向感興趣,對接觸各類互聯網產品感興趣,樂於培養自身的產品意識
  • 快速學習能力,主動性強

後端研發工程師(北京)

工做職責:

  • 負責大數據產品的後端研發工做;
  • 負責存儲、查詢、導入等相關模塊的具體開發與維護;
  • 提高產品總體的運行效率與穩定性。

崗位要求:

  • 本科及以上學歷,計算機相關專業;
  • 對大數據方向感興趣,樂於幫助客戶實現數據驅動;
  • 計算機基礎知識紮實,熟悉主流開發語言及操做系統原理,對分佈式系統具備濃厚興趣;
  • 對接觸各類互聯網產品感興趣,樂於培養自身的產品意識;
  • 快速學習能力;主動性強。

機器學習算法工程師(北京)

工做職責:

  • 分析金融、新聞、短視頻等互聯網行業的業務問題,調研適合客戶需求的機器學習算法,肯定評估目標;
  • 處理業務數據,完成離線與在線的特徵工程;
  • 負責機器學習算法研發與調優;

崗位要求:

  • 本科或本科以上學歷,計算機相關專業者優先;
  • 熟悉數據挖掘、機器學習等相關知識;
  • 能快速學習、研發適用於多種業務場景的機器學習算法;
  • 快速學習能力;主動性強。

把你的簡歷砸過來吧~~

Sensors Data - 給客戶帶來價值

簡歷投遞:liu3248184446@outlook.com

相關文章
相關標籤/搜索