余談:react-reduxを使用しているWebサイト(アプリケーション)
https://github.com/reactjs/redux/issues/310
わかる範囲でもこれだけあるみたいです。すごいですね。
実装
- es6
- react, react-dom,
- react-router
- redux
テストまで書くと長くなって読みづらいので分けます。
es6
- 公式サイト
- 基本的には公式サイトのspecを見ていく感じになりますが、英語かつ専門用語辛い。。
- Reduxは基本es6で書かれているので、spec読みながらExampleを見るのが良さそうだ!
実装で一番重要と思われるコードの再利用だけピックアップ。
// addという名前が名前空間に登録される
export function add(x, y) {
return x + y
}
export
で名前を登録していく。前まではmodule.exports
だったもの?
セミコロンがないのは間違いではなく、es6?es7?から省略可能らしい。
このコードを別のファイルで使う場合はimport
する。前まではrequire
だったもの?
import { add } from 'register_name'
console.log(add(1, 2))
export default
で登録するとimport方法が変わるらしい。
export default function add(x, y) {
return x + y
}
import add from 'register_default' // import apple from 'register_default' でも問題ない
console.log(add(1, 2))
specを見ると、default
を指定するとdefault
名前空間に登録されるようだ。
また、一つのモジュールにはdefault
が一つしか存在してはいけない(syntax error)ので、import
する名前はなんでも良い。
default
名前空間に登録されているものは{}
をつけず取り出せる。
逆にdefault
を指定しないと定義した名前が登録され、import
の祭に{}
で名前を囲んであげなければならない。
ちなみに、module.exports
で登録した名前は、各ライブラリを見る限りdefault
名前空間に登録されるようだ。それ以外のvar
などは{}
で取り出せるところを見るとdefault
以外で登録されている?
react, react-dom
npm install --save-dev react react-dom
- React, ReactDOM公式サイト
- React作者によるHowTo
-
React
自体はこの箇所でReactIsomorphic
がassignされているように、実態はReactIsomorphicにあるようだ。 -
ReactDOM
はこの箇所がnpmでインストールされるようだ。
React, ReactDOMの使い方は公式サイトを見るとしてビルド方法だけピックアップ。
前提として、es6+babel+webpack
を想定しています。
{
...,
// npm runの引数を定義します
"scripts": {
"compile": "babel --presets es2015 src/ -d lib/",
// 素のReactはdevelopモードで遅いらしいのでproductionモードでビルドする
// npm install --save-dev cross-envが前提です
"build": "cross-env NODE_ENV=production webpack",
"build:dev": "npm run compile && npm run build",
"test": "echo \"Error: no test specified\" && exit 1"
},
...,
}
$ npm run build:dev
あとはwebpack.config.js
で指定したビルド先のPATHを<script src='dist/index.js'></script>
のようにhtmlに書けばOK。
すごく簡単!
cross-env
を使いたくない場合は、Reactの公式サイトのようにwebpack.config.js
の中でハードコード。
react-router
- React Router公式サイト
npm install --save-dev react-router
公式サイトのTutorialのlesson2,3だけ試します。
$ tree -a -I 'node_modules|.git|.DS_Store|dist|lib|.vscode|.gitignore'
├── .babelrc
├── .eslintrc
├── index.react.router.html
├── package.json
├── src
│ ├── index.react.router.js
│ └── modules
│ ├── About.js
│ ├── App.js
│ └── Repos.js
└── webpack.config.js
import React from 'react'
import { Router, Route, hashHistory } from 'react-router'
import { render } from 'react-dom'
import App from './modules/App'
import About from './modules/About'
import Repos from './modules/Repos'
render((
<Router history={hashHistory}>
<Route path="/" component={App}/>
<Route path="/about" component={About}/>
<Route path="/repos" component={Repos}/>
</Router>
), document.getElementById('app'))
import React from 'react'
import { Link } from 'react-router'
export default React.createClass({
render() {
return (
<div>
<h1>Hello, world!</h1>
<ul role='nav'>
<li><Link to='/about'>About</Link></li>
<li><Link to='/repos'>Repos</Link></li>
</ul>
</div>
)
}
})
import React from 'react'
export default React.createClass({
render() {
return <div>About</div>
}
})
import React from 'react'
export default React.createClass({
render() {
return <div>Repos</div>
}
})
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>React and React Router Example</title>
</head>
<body>
<div id="app"></div>
<script src="dist/index.react.router.js"></script> <!-- dist/はcompile後のPATH -->
</body>
<html>
わかりやすくていいですね!
redux
- 公式Example
- 作者が
You’ll know when you need Flux. If you aren’t sure if you need it, you don’t need it.
と言っているように、React
を使っていくうちにFlux
を導入すべきと感じるまでは使わないほうが良いようだ。
まずは、React
, ReactDOM
, Router
を頑張るかぁ。
テスト編に続く・・(完)