概要
React.jsを勉強しようと思って簡単なfizzbuzz表示するだけのものを作ってみました。
動作ページはこちら
役割
ツール名 | 役割 |
---|---|
React.js | UIを構築するためのライブラリ。フレームワークではない。 |
Babel | ES6など新しい記法を既存のブラウザでも動くようにトランスパイルしてくれる |
webpack | ES6のimportを解釈して必要な依存ファイルをかき集めてビルドしてくれる |
環境
- React.js 0.14.7
- Babel 6.5.2
- webpack 1.12.14
前提
今回はReactでコンポーネントを作成するだけで、Fluxは使用しません。
準備
フォルダ用意
$ mkdir fizzbuzz $ cd fizzbuzz $ mkdir src dist
src
にはビルド前の.jsxファイルをdist
にはビルド後の.jsファイルが生成されます。
プロジェクト初期化
$ npm init
ビルド用ツールの用意
$ npm install --save webpack babel babel-core babel-loader babel-preset-es2015 babel-preset-react
babelの設定
.babelrc
を用意してpresetを設定します。
{ "presets": ["es2015", "react"] }
webpackの設定
webpack.config.js
というファイルを用意します。中身は以下です。
module.exports = { entry: __dirname + "/src/fizzbuzz.jsx", output: { path: __dirname + "/dist", filename: "fizzbuzz.js" }, module: { loaders: [{ test: /\.jsx?$/, loader: 'babel-loader', exclude: /node_modules/ }] } };
ちゃんと動くか確かめるため、以下の検証用ファイルを用意します。
$ touch ./src/fizzbuzz.jsx
中にはconsole.log()
でも入れておいてください。
webpackが動くか確認
$ webpack Hash: a07a7a4b12c56a889d12 Version: webpack 1.12.14 Time: 392ms Asset Size Chunks Chunk Names fizzbuzz.js 1.42 kB 0 [emitted] main + 1 hidden modules
dist
フォルダを見るとちゃんと生成されてます。
$ tree dist/ dist/ └── fizzbuzz.js
npm run でビルドが動くようにする。
package.json
に以下を追記します。
{ ... "scripts": { ... "build": "rm -rf dist/*.js && webpack", "watch": "rm -rf dist/*.js && webpack -w" }, ... }
確認してみます。
$ npm run build
先ほどのwebpackと同じ結果でしたら大丈夫です。
作成
HTMLファイルの用意
dist/index.html
<!doctype html> <html> <head> <meta charset="UTF-8"> <title>fizzbuzz sample</title> </head> <body> <h1>fizzbuzz sample</h1> <div id="fizzbuzz"></div> <script src="fizzbuzz.js"></script> </body> </html>
reactの用意
$ npm install --save react react-dom
reactのコンポーネント作成
src/fizzbuzz.jsx
を以下のようにします。
import React from "react"; import ReactDom from "react-dom"; class FizzBuzz extends React.Component { constructor(props) { super(props); } render() { return ( <h1>react component test</h1> ); } } ReactDom.render( <FizzBuzz />, document.getElementById("fizzbuzz") );
React.Component
を継承し、render
メソッドを実装すると、Reactコンポーネントになります。 Reactコンポーネントは、クラス名をそのままJSXのタグに使うことができます。
index.html
を開いてみると、ちゃんと表示されます。
fizzbuzzのロジックを記述
import React from "react"; import ReactDom from "react-dom"; class FizzBuzz extends React.Component { constructor(props) { super(props); this.state = { count: 0, display: 0 }; setInterval(() => this.tick(), 1000); } tick() { var n = this.state.count + 1; this.setState({ count: n, display: this.display(n) }); } display(n) { if (n % 15 === 0) { return 'FizzBuzz'; } if (n % 3 === 0) { return 'Fizz'; } if (n % 5 === 0) { return 'Buzz'; } return n } render() { return ( <h1>{this.state.display}</h1> ); } } ReactDom.render( <FizzBuzz />, document.getElementById("fizzbuzz") );
動作確認
dist/index.html
を起動すると以下のように数字がカウントアップされて、fizzbuzzが表示されます。
13のとき
15のとき