搜尋
首頁web前端H5教程2016年度——React.js 最佳实践

  译者按:近几个月React相关话题依旧火热,相信越来越多的开发者在尝试这样一项技术,我们团队也在PC和移动端不断总结经验。2016来了,这应该是React走向成熟的一年,不管你是新手,还是已经对React有所了解,是时候总结一下最佳实践了,让我们看看国外的开发者总结了哪些好的实践吧~


  2015可以算是React之年了,关于其版本发布和开发者大会的话题遍布全球。关于去年React的发展里程碑详情,可以查看我们整理的React 2015这一年

  2016年最有趣的问题可能是,我们该如何编写一个应用呢,有什么推荐的库或框架?

  作为一个长时间使用React.js的开发者,我已经有自己的答案和最佳实践了,但你可能不会同意我说的所有点。我对你的想法和意见很感兴趣,请留言进行讨论。

  

2016年度——React.js 最佳实践


  如果你只是刚开始接触React.js,请阅读React.js教程,或Pete Hunt的React howto


  数据处理

  在React.js应用中处理数据超级简单的,但同时还是有些挑战。

  这是因为你可以使用多种方式,来给一个React组件传递属性数据,从而构建出渲染树。但这种方式并不总是能明显地看出,你是否应该更新某些视图。

  2015开始涌现出一批具有更强功能和响应式解决方案的Flux库,让我们一起看看:


  Flux

  根据我们的经验,Flux通常被过度使用了(就是大家在不需使用的场景下,还是使用了)。

  Flux提供了一种清爽的方式存储和管理应用的状态,并在需要的时候触发渲染。

  Flux对于那些应用的全局state(译者注:为了对应React中的state概念,本文将不对state进行翻译)特别有用,比如:管理登录用户的状态、路由状态,或是活跃账号状态。如果使用临时变量或者本地数据来处理这些状态,会非常让人头疼。

  我们不建议使用Flux来管理路由相关的数据,比如/items/:itemId。应该只是获取它并存在组件的state中,这种情况下,它会在组件销毁时一起被销毁。

  如果需要Flux的更多信息,建议阅读The Evolution of Flux Frameworks。


  使用Redux

  Redux是一个JavaScript app的可预测state容器。

  如果你觉得需要Flux或者相似的解决方案,你应该了解一下redux,并学习Dan Abramov的redux入门指南,来强化你的开发技能。

  Rudux发展了Flux的思想,同时降低了其复杂度。


  扁平化state

  API通常会返回嵌套的资源,这让Flux或Redux架构很难处理。我们推荐使用normalizr这类库来尽可能地扁平化state

  像这样:

const data = normalize(response, arrayOf(schema.user))
state = _.merge(state, data.entities

  (我们使用isomorphic-fetch与API进行通信)


  使用immutable state

  共享的可变数据是罪恶的根源——Pete Hunt, React.js Conf 2015

2016年度——React.js 最佳实践


  不可变对象是指在创建后不可再被修改的对象。

  不可变对象可以减少那些让我们头痛的工作,并且通过引用级的比对检查来提升渲染性能。比如在shouldComponentUpdate中:

shouldComponentUpdate(nexProps) {  
 // 不进行对象的深度对比
 return this.props.immutableFoo !== nexProps.immutableFoo
}


  如何在JavaScript中实现不可变

  比较麻烦的方式是,小心地编写下面的例子,总是需要使用deep-freeze-node(在变动前进行冻结,结束后验证结果)进行单元测试。

return {  
  ...state,
  foo
}
 
return arr1.concat(arr2)

  相信我,这是最明显的例子了。

  更简单自然的方式,就是使用Immutable.js。

import { fromJS } from 'immutable'
const state = fromJS({ bar: 'biz' })  
const newState = foo.set('bar', 'baz')

  Immutable.js非常快,其背后的思想也非常美妙。就算没准备使用它,还是推荐你去看看Lee Byron的视频Immutable Data and React,可以了解到它内部的实现原理。


  Observables and reactive解决方案

  如果你不喜欢Flux/Redux,或者想要更加reactive,不用失望!还有很多方案供你选择,这里是你可能需要的:


  • cycle.js(“一个更清爽的reactive框架”)

  • rx-flux(“Flux与Rxjs结合的产物”)

  • redux-rx(“Redux的Rxjs工具库”)

  • mobservable(“可观测的数据,reactive的功能,简洁的代码”)


  

  路由

  现在几乎所有app都有路由功能。如果你在浏览器中使用React.js,你将会接触到这个点,并为其选择一个库。

  我们选择的是出自优秀rackt社区的react-router,这个社区总是能为React.js爱好者们带来高质量的资源。

  要使用react-router需要查看它的文档,但更重要的是:如果你使用Flux/Redux,我们推荐你将路由state与store或全局state保持同步。

  同步路由state可以让Flux/Redux来控制路由行为,并让组件读取到路由信息。

  Redux的用户可以使用redux-simple-router来省点事儿。


  代码分割,懒加载

  只有一小部分webpack的用户知道,应用代码是可以分割成多个js包的。

require.ensure([], () => {  
  const Profile = require('./Profile.js')
  this.setState({
    currentComponent: Profile
  })
})

  这对于大型应用十分有用,因为用户浏览器不用下载那些很少会使用到的代码,比如Profile页。

  多js包会导致额外的HTTP请求数,但对于HTTP/2的多路复用,完全不是问题。

  与chunk hashing 结合可以优化缓存命中率。

  下个版本的react-router将会对代码分隔做更多支持。

  对于react-router的未来规划,可以去看博文Ryan Florence: ** to Future of Web Application Delivery。


  组件

  很多人都在抱怨JSX,但首先要知道,它只是React中可选的一项能力。

  最后,它们都会被Bable编译成JavaScript。你可以继续使用JavaScript编写代码,但是在处理HTML时使用JSX会感觉更自然。特别是对于那些不懂js的人,他们可以只修改HTML相关的部分。

  JSX是一个类似于XML的JavaScript扩展,可以配合一个简单的语法编译工具来使用它。——深入浅出JSX

  如果你想了解更多JSX的内容,查看文章JSX Looks Like An Abomination – But it’s Good for You


  使用类

  React中可以顺畅地使用ES2015的Class语法。

class HelloMessage extends React.Component {  
  render() {
    returnHello {this.props.name}}
}

  我们在高阶组件和mixins之间更看重前者,所以抛弃createClass更像是一个语法问题,而不是技术问题。(译者注:在Class语法中,React组件的mixins方法将无法使用。)我们认为使用createClass和React.Component没有对错之分。


  属性类型(PropType)

  如果你以前不检查props的类型,那么2016你应该开始改正了。它会帮你节省未来很多时间,相信我。

MyComponent.propTypes = {  
  isLoading: PropTypes.bool.isRequired,
  items: ImmutablePropTypes.listOf(
    ImmutablePropTypes.contains({
      name: PropTypes.string.isRequired,
    })
  ).isRequired
}

  是的,同时也尽可能使用react-immutable-proptypes检查Immutable.js的props。


  高阶组件(Higher order components)

  minins将死,ES6的Class将不对其进行支持,我们需要寻找新的方法。

  什么是高阶组件?

PassData({ foo: 'bar' })(MyComponent)

  简单地,你创建一个从原生组件继承下来的组件,并且扩展了原始组件的行为。你可以在多种场景来使用它,比如鉴权:requireAuth({ role: 'admin' })(MyComponent)(在高阶组件中检查用户权限,如果还没有登录就进行跳转),或者将组件与Flux/Redux的store相连通。

  在RisingStack,我们也喜欢分离数据拉取和controller类的逻辑到高阶组件中,这样可以尽可能地保持view层的简单。


  测试

  好的代码覆盖测试是开发周期中的重要一环。幸运的是,React.js社区有很多这样的库来帮助我们。

  组件测试

  我们最喜爱的组件测试库是AirBnb的enzyme。有了它的浅渲染特性,可以对组件的逻辑和渲染结果进行测试,非常棒对不对?它现在还不能替代selenium测试,但是将前端测试提升到了一个新高度。

it('simulates click events', () => {  
  const onButtonClick = sinon.spy()
  const wrapper = shallow()
  wrapper.find('button').simulate('click')
  expect(onButtonClick.calledOnce).to.be.true
})

  看起来很清爽,不是吗?

  你使用chai来作为断言库吗?你会喜欢chai-enyzime的。


  Redux测试

  测试一个reducer非常简单,它响应actions然后将原来的state转为新的state:

it('should set token', () => {  
  const nextState = reducer(undefined, {
    type: USER_SET_TOKEN,
    token: 'my-token'
  })
 
  // immutable.js state output
  expect(nextState.toJS()).to.be.eql({
    token: 'my-token'
  })
})

  测试actions也很简单,但是异步actions就不一样了。测试异步的redux actions我们推荐redux-mock-store,它能帮不少忙。

it('should dispatch action', (done) => {  
  const getState = {}
  const action = { type: 'ADD_TODO' }
  const expectedActions = [action]
 
  const store = mockStore(getState, expectedActions, done)
  store.dispatch(action)
})

  关于更深入的redux测试,请参考官方文档。


  使用npm

  虽然React.js并不依赖代码构建工具,我们推荐Webpack和Browserify,它们都具有npm出色的能力。Npm有很多React.js的package,还可以帮助你优雅地管理依赖。

  (请不要忘记复用你自己的组件,这是优化代码的绝佳方式。)


  包大小(Bundle size)

  这本身不是一个React相关的问题,但多数人都会对其React进行打包,所以我在这里提一下。

  当你对源代码进行构建时,要保持对包大小的关注。要将其控制在最小体积,你需要思考如何require/import依赖。

  查看下面的代码片段,有两种方式可以对输出产生重大影响:

import { concat, sortBy, map, sample } from 'lodash'
// vs.
import concat from 'lodash/concat';  
import sortBy from 'lodash/sortBy';  
import map from 'lodash/map';  
import sample from 'lodash/sample';

  查看Reduce Your bundle.js File Size By Doing This One Thing,获取更多详情。

  我们喜欢将代码分隔到vendors.js和app.js,因为第三方代码的更新频率比我们自己带吗低很多。

  对输出文件进行hash命名(WebPack中的chunk hash),并使用长缓存,我们可以显著地减少访问用户需要下载的代码。结合代码懒加载,优化效果可想而知。

  如果你对WebPack还很陌生,可以去看超赞的React webpack指南


  组件级的hot reload

  如果你曾使用livereload写过单页面应用,你可能知道当在处理一些与状态相关的事情,一点代码保存整个页面就刷新了,这种体验有多烦人。你需要逐步点击操作到刚才的环节,然后在这样的重复中奔溃。

  在React开发中,是可以reload一个组件,同时保持它的state不变——耶,从此无需苦恼!

  搭建hot reload,可参考react-transform-boilerplate


  使用ES2015

  前面提到过,在React.js中使用的JSX,最终会被Babel.js进行编译。

  

2016年度——React.js 最佳实践



  Bable的能力还不止这些,它可以让我们在浏览器中放心地使用ES6/ES2015。在RisingStack,我们在服务器端和客户端都使用了ES2015的特性,ES2015已经可以在最新的LTS Node.js版本中使用了。


  代码检查(Linters)

  也许你已经对你的代码制定了代码规范,但是你知道React的各种代码规范吗?我们建议你选择一个代码规范,然后照着下面说的来做。

  在RisingStack,我们强制将linters运行在持续集成(CI)系统,已经git push功能上。查看pre-pushpre-commit

  我们使用标准的JavaScript代码风格,并使用eslint-plugin-react来检查React.js代码。

  (是的,我们已经不再使用分号了)


  GraphQL和Relay

  GraphQL和Relay是相关的新技术。在RisingStack,我们不在生产环境使用它们,暂时保持关注。

  我们写了一个Relay的MongoDB ORM,叫做graffiti,可以使用你已有的mongoose models来创建GraphQL server。

  如果你想学习这些新技术,我们建议你去看看这个库,然后写几个demo玩玩。


  这些React.js最佳实践的核心点

  有些优秀的技术和库其实跟React都没什么关系,关键在于要关注社区都在做些什么。2015这一年,React社区被Elm架构启发了很多。

  如果你知道其他2016年大家应该使用的React.js工具,请留言告诉我们。

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
理解H5:含義和意義理解H5:含義和意義May 11, 2025 am 12:19 AM

H5是HTML5,是HTML的第五個版本。 HTML5提升了網頁的表現力和交互性,引入了語義化標籤、多媒體支持、離線存儲和Canvas繪圖等新特性,推動了Web技術的發展。

H5:可訪問性和網絡標準合規性H5:可訪問性和網絡標準合規性May 10, 2025 am 12:21 AM

無障礙訪問和網絡標準遵循對網站至關重要。 1)無障礙訪問確保所有用戶都能平等訪問網站,2)網絡標準遵循提高網站的可訪問性和一致性,3)實現無障礙訪問需使用語義化HTML、鍵盤導航、顏色對比度和替代文本,4)遵循這些原則不僅是道德和法律要求,還能擴大用戶群體。

HTML中的H5標籤是什麼?HTML中的H5標籤是什麼?May 09, 2025 am 12:11 AM

HTML中的H5標籤是第五級標題,用於標記較小的標題或子標題。 1)H5標籤幫助細化內容層次,提升可讀性和SEO。 2)結合CSS可定製樣式,增強視覺效果。 3)合理使用H5標籤,避免濫用,確保內容結構邏輯性。

H5代碼:Web結構的初學者指南H5代碼:Web結構的初學者指南May 08, 2025 am 12:15 AM

HTML5構建網站的方法包括:1.使用語義化標籤定義網頁結構,如、、等;2.嵌入多媒體內容,使用和標籤;3.應用表單驗證和本地存儲等高級功能。通過這些步驟,你可以創建一個結構清晰、功能豐富的現代網頁。

H5代碼結構:組織內容以實現可讀性H5代碼結構:組織內容以實現可讀性May 07, 2025 am 12:06 AM

通過合理的H5代碼結構可以讓頁面在眾多內容中脫穎而出。 1)使用語義化標籤如、、等組織內容,使結構清晰。 2)通過CSS佈局如Flexbox或Grid控制頁面在不同設備上的呈現效果。 3)實現響應式設計,確保頁面在不同屏幕尺寸上自適應。

H5與較舊的HTML版本:比較H5與較舊的HTML版本:比較May 06, 2025 am 12:09 AM

HTML5(H5)與舊版本HTML的主要區別包括:1)H5引入了語義化標籤,2)支持多媒體內容,3)提供離線存儲功能。 H5通過新標籤和API增強了網頁的功能和表現力,如和標籤,提高了用戶體驗和SEO效果,但需注意兼容性問題。

H5與HTML5:澄清術語和關係H5與HTML5:澄清術語和關係May 05, 2025 am 12:02 AM

H5和HTML5的區別在於:1)HTML5是網頁標準,定義結構和內容;2)H5是基於HTML5的移動網頁應用,適用於快速開發和營銷。

HTML5特徵:H5的核心HTML5特徵:H5的核心May 04, 2025 am 12:05 AM

HTML5的核心特性包括語義化標籤、多媒體支持、表單增強和離線存儲與本地存儲。 1.語義化標籤如、等提高了代碼可讀性和SEO效果。 2.多媒體支持通過和標籤簡化了嵌入媒體內容的過程。 3.表單增強引入了新的輸入類型和驗證屬性,簡化了表單開發。 4.離線存儲和本地存儲通過ApplicationCache和localStorage等提高了網頁性能和用戶體驗。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中