React+webpack+es6的環境配置及demo改寫

寫於 2016.05.14css

前言

項目地址:jrainlau/react-es6html

git clone https://github.com/jrainlau/react-learning
cd react-learning && npm install
npm run dev

而後瀏覽器打開localhost:8080便可
複製代碼

最近在家閒得無聊,因此打算折騰一下react。在此以前,我是一個vue的重度使用用戶,可是看到react確實很是火爆,因此也就趁此機會去了解一下react,增加一下見識。前端

學習react的參考資料,很大一部分來自 @阮一峯 的React入門實例教程。可是阮大神是用傳統的script標籤以及es5的寫法,因此我針對教程,經過配置webpack,最終使用es6的寫法來改寫教程的demo,結合組件化的思想,完成最終的demo的改寫。vue

環境配置

環境配置參照了@minooo 的文章:webpack-es6-react (爲系統學習React佈一個良好的開局)。這裏引用一些關鍵包的說明:react

package.json 中的 包/庫 部分說明

  • babel-core babel6 的基礎模塊
  • babel-eslint ESLint 是前端JS代碼檢測利器。而 babel-eslint 則容許你檢測全部的 Babel 代碼。
  • babel-loader 這個包容許你使用 Babel 和 webpack 轉譯(Transpiling) JavaScript 文件。
  • babel-plugin-react-transform 這個插件經過任意轉換的方式去封裝 React 組件。換句話說,你能夠爲所欲爲的擺弄你的組件了。
  • babel-plugin-transform-runtime 在 Babel 轉換過程當中,詳細的展現引用的相關輔助工具和內置命令,並自動的聚合填充你的代碼而不會污染全局。
  • babel-preset-es2015 此預設包含了全部的 es2015 插件。
  • babel-preset-react 此預設包含了全部的 React 插件。
  • babel-preset-stage-0 此預設包含了 stage 0 中的全部插件。
  • eslint JavaScript 語法檢測利器:分析出你代碼潛在的錯誤和非標準用法。
  • eslint-plugin-react ESLint 中關於 React 語法檢測的插件。
  • react-transform-hmr 一個 React 轉換裝置,該裝置經過引用 Hot Module Replacement API 使熱重載 React 的類成爲可能。
  • react-transform-catch-errors 呈現你 React 組件的錯誤信息。
  • webpack-dev-server 爲 wepack app 提供一個服務器,若是你的代碼有任何變化,瀏覽器將自動刷新顯示,極大的方便前期開發。
  • babel-runtime Babel 自帶的運行環境。

另外,我增長了style-loadercss-loaderlessless-loader這四個包用於加載.less文件模塊。(注意,less-loaderless必須同時存在才能正常工做。)linux

根目錄下文件部分說明

  • .babelrc : 什麼是 .babelrc 文件呢?熟悉 linux 的同窗必定知道,rc 結尾的文件一般表明運行時自動加載的文件,配置等。一樣在這裏也是有一樣做用的。裏面的 env 字段,能夠對 BABEL_ENV 或 NODE_ENV 指定不一樣的環境變量,進行不一樣編譯。
  • eslintignore 通知 eslint 忽略那些不該該被檢測的文件。
  • eslintrc eslint 配置文件,使 JavaScript 代碼規範化,標準化書寫。

使用es6改寫demo

首先能夠參考這篇文章React on ES6+,裏面說起了關於如何使用es6進行react開發的方法。webpack

使用React.Component代替React.createClassgit

// The ES5 way
var Photo = React.createClass({
  handleDoubleTap: function(e) { … },
  render: function() { … },
});

// The ES6+ way
class Photo extends React.Component {
  handleDoubleTap(e) { … }
  render() { … }
}
複製代碼

使用static關鍵字完成屬性初始化工做(這是es7的內容,注意state能夠直接經過state = { key: value }來定義)es6

// The ES5 way
var Video = React.createClass({
  getDefaultProps: function() {
    return {
      autoPlay: false,
      maxLoops: 10,
    };
  },
  getInitialState: function() {
    return {
      loopsRemaining: this.props.maxLoops,
    };
  },
  propTypes: {
    autoPlay: React.PropTypes.bool.isRequired,
    maxLoops: React.PropTypes.number.isRequired,
    posterFrameSrc: React.PropTypes.string.isRequired,
    videoSrc: React.PropTypes.string.isRequired,
  },
});

// The ES6+ way
class Video extends React.Component {
  static defaultProps = {
    autoPlay: false,
    maxLoops: 10,
  }
  static propTypes = {
    autoPlay: React.PropTypes.bool.isRequired,
    maxLoops: React.PropTypes.number.isRequired,
    posterFrameSrc: React.PropTypes.string.isRequired,
    videoSrc: React.PropTypes.string.isRequired,
  }
  state = {
    loopsRemaining: this.props.maxLoops,
  }
}
複製代碼

constractor中定義stategithub

// The ES5 way
var Video = React.createClass({
  getInitialState: function() {
    return {
      loopsRemaining: ...
    };
  }
});

//The ES6 way
class Video extends React.Component {
    constructor(props) {
        super(props)
        this.state = {
            loopsRemaining: ...
        }
    }
}
複製代碼

組件化思路

經過es6的模塊功能,能夠很方便地利用webpack實現頁面組件化。

咱們總共有7個小的demo,我把它們做爲不一樣的組件,最終加載到根組件中:

// app.js

import React, { Component } from 'react'
import Component1 from './demo1.js'
import Component2 from './demo2.js'
import Component3 from './demo3.js'
import Component4 from './demo4.js'
import Component5 from './demo5.js'
import Component6 from './demo6.js'
import Component7 from './demo7.js'

export default class Demo extends Component {
  render() {
    return (
      <div>
        <Component1></Component1>
        <Component2></Component2>
        <Component3 title='Props example'></Component3>
        <Component4>
            <span>Hello</span>
            <span>React</span>
        </Component4>
        <Component5 content='This is the content'></Component5>
        <Component6></Component6>
        <Component7></Component7>
      </div>
    )
  }
}
複製代碼

具體請進入個人項目查看代碼。

能夠看到,經過es6的改寫,在react中實現組件化是很是清晰簡單的,只須要把須要的組件import進來便可。

另外,因爲我很是討厭行內樣式,而且是不寫less會死星人,因此並無按照官方推薦的樣子去定義一個style object,而是經過less-loader在須要定義樣式的地方直接把樣式require進來,像這樣:

// demo7.js

render() {
    let word = this.state.words
    require('../less/test.less')
    return (
        <div>
            <h3 className='test-h1'>DEMO 7, state</h3>
            <p>{ word }</p>
            <input type="text" onChange={ this.stateFn }/>
            <hr/>
        </div>
    )
}
複製代碼

結語

這個demo僅僅做爲入門學習使用,react更多深層次的內容可能會在後續慢慢更新,好比加上react-router,redux什麼的……若是這篇文章可以對你有所啓發是最好不過,若是有任何錯漏也歡迎拍磚指出,謝謝你們~

相關文章
相關標籤/搜索