Nerv - 京東高性能前端框架

82112714 6年前發布 | 39K 次閱讀 高性能

Nerv 是一款由京東凹凸實驗室打造的類 React 前端框架。目前已廣泛運用在 京東商城 (JD.COM)核心業務及 TOPLIFE 全站。Nerv 基于React標準,使用 Virtual Dom 技術,擁有和 React 一致的 API 與生命周期,如果你已經對 React 使用非常熟悉,那么使用 Nerv 開發對你來說絕對是零學習成本。

與此同時,相比于 React 以及市面其他同類型框架,Nerv 更具體積輕量,性能高效的特點。并且,它符合當下國情,可以完美兼容 IE8 及以上瀏覽器。

特性

  • 更小的體積:

    Gzip 后僅有9k,不到 React 三分之一的體積,低性能設備也能高速地加載并解析執行。

  • 更高的性能:

    高效、同步的 diff 算法和諸多優化策略使得 Nerv 成為性能最高的前端框架之一。

  • 完備的生態:

    無需 nerv-compat,只需要在稍稍設置就能享受整個 React 生態的共同成果。

  • 更一致的渲染:

    不僅在瀏覽器上能高效地渲染,在服務器上 Nerv 同樣能高效地運行。

  • 更優的兼容:

    和大多數現代框架不同,Nerv 將繼續保持對 IE8 的兼容。

  • 更具說服力的案例:

    不管是京東首頁的高流量,還是 Toplife 的復雜業務,Nerv 都經受住了來自于真實業務的考驗。

性能

在 Nerv 開發過程中,我們針對虛擬 Dom 算法做了一次升級,將并行的虛擬 Dom diff 過程替換成同步的,邊 diff 邊 patch ,這樣大幅度提升了虛擬 Dom 更新的速度。同時我們還對diff算法進行了探索升級,參照目前市面上最快的虛擬 Dom 算法對我們的代碼進行了改造。

經過重構升級后,我們的框架性能大幅提升,如下可見。

更多性能數據詳見官網。

項目背景

是的,我們又造了一個輪子,也是一次拋離傳統開發模式的技術革新。同行們或許有疑問,目前市面上已經有非常多的同類型技術框架,為什么我們還要不厭其煩地打造一個呢?這當然不是在做無用功。

日常開發中,相對于 Vue ,我們更傾向于選擇 React 模式作為我們的開發標準,因為 React 天生組件化且函數式編程的方式,更加靈活且便于維護。

然而,React 仍然有一些不能滿足我們需求的地方:

  • IE8 瀏覽器兼容性:當前環境所限,即便很不情愿,我們仍然要支持 IE8。
  • 體積:React 大概 130kb 的體積。在低網速 / 低版本瀏覽器 / 低配置設備的加載速度和解析速度都不能讓我們滿意。
  • 性能:React 的 Virtual Dom 算法(React 自己叫 Reconciler)并沒有做太多的優化。

而我們的新輪子 —— Nerv,它完全能提供上述 React 的所有優點,并且它也能完全滿足我們自己的需求:更好的兼容性、更小的體積、更高的性能。

安裝

推薦使用 npm 的方式進行開發,享受 Node 生態圈和 Webpack 工具鏈帶來的便利。

npm install nervjs --save

簡單示例

下面是一個計時器的例子。

import Nerv from 'nervjs'

class Counter extends Nerv.Component {
  setTime = () => {
    const date = new Date()
    const year = date.getFullYear()
    const month = date.getMonth() + 1
    const day = date.getDay()
    const hour = date.getHours()
    const minute = date.getMinutes()
    const sec = date.getSeconds()
    this.setState({
      year,
      month,
      day,
      hour,
      minute,
      sec
    })
  }

  componentWillMount () {
    this.setTime()
  }

  componentWillUnmount () {
    clearInterval(this.interval)
  }

  componentDidMount () {
    this.interval = setInterval(this.setTime, 1000)
  }

  componentWillReceiveProps () {
    this.setTime()
  }

  render () {
    const { year, month, day, hour, minute, sec } = this.state
    return (
      <div className='counter'>
        <span>The time is</span>{year}-{month}-{day} {hour}:{minute}:{sec}
      </div>
    )
  }
}

export default Counter

更多詳細例子可閱讀文檔 NervJs 了解。

 

來自:https://aotu.io/notes/2018/03/22/nerv/

 

 本文由用戶 82112714 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!