Data Scientistになりたかったアプリエンジニアのブログ

技術的な諸々を書き留めていきます

React+MaterialUI+Expressでスケルトンプロジェクトを作る

まずはexpressプロジェクトを作る

まずはexpressプロジェクトをつくるために、express-generatorをインストールする

$ npm install -g express-generator

インストールできたらexpressアプリを作成。

$ express app_name

app_nameのところは皆さんの好きなアプリ名を入れて下さい。

$ cd app_name
$ npm install

これで必要なnode_modulesがインストールされます。

次に、app_name/routes/user.jsを以下のように編集します。

var express = require('express');
var router = express.Router();

/* GET users listing. */
router.get('/', function(req, res, next) {
  res.json([{
    id: 1,
    username: "Kiriyama"
  }, {
    id: 2,
    username: "Nikaido"
  }]);
});

module.exports = router;

さらにport:3001でexpressサーバーが起動するように、package.jsonを以下のように書き換えます。

{
  "name": "app_name",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "PORT=3001 node ./bin/www"
  },
  "dependencies": {
    "body-parser": "~1.18.2",
    "cookie-parser": "~1.4.3",
    "debug": "~2.6.9",
    "express": "~4.15.5",
    "jade": "~1.11.0",
    "morgan": "~1.9.0",
    "serve-favicon": "~2.4.5"
  }
}

書き換えたら、下記のコマンドを打って、expressサーバーが起動することを確認する。

$ npm start

expressサーバーが起動したら、ブラウザで

http://localhost:3001/users

にアクセスし、

[{"id":1,"username":"Kiriyama"},{"id":2,"username":"Nikaido"}]

が表示されることを確認する。

Reactプロジェクトを作る

まずはReactプロジェクトを作る便利なツールのcreate-react-appをインストールします。

$ npm install -g create-react-app

インストールできたら、app_name直下で、下記のコマンドを実行して、Reactのスケルトンプロジェクトを作ります。

$ create-react-app client

インストールが長いですが、終わったらapp_name/client/package.jsonを開き、以下のようにproxyを追加します。

{
  "name": "client",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "react": "^16.0.0",
    "react-dom": "^16.0.0",
    "react-scripts": "1.0.14"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  },
  "proxy":"http://localhost:3001"
}

これは、create-react-appでスケルトンプロジェクトを作るとデフォルトでは、create-react-appの開発サーバーが立ち上がり、前の段落で作ったExpressサーバーと通信しません。 これでは、開発がしにくいので、port:3001で立ち上がるように設定したExpressサーバーに通信するようにproxy設定をしています。

次に、create-react-appで作ったReactのコードがExpressサーバーからのデータを受け取れるか確認します。

app_name/client/App.jsを開き、以下のように編集します。

import React, { Component } from 'react';
import './App.css';

class App extends Component {
  state = {users: []}

  componentDidMount() {
    fetch('/users')
      .then(res => res.json())
      .then(users => this.setState({ users }));
  }

  render() {
    return (
      <div className="App">
        <h1>Users</h1>
        {this.state.users.map(user =>
          <div key={user.id}>{user.username}</div>
        )}
      </div>
    );
  }
}

export default App;

編集が終わったら、app_name直下npm startをして、expressサーバーを起動した後、app_name/client直下でnpm startを実行します。 実行したら、ブラウザが自動で開きますので、ユーザーの情報がブラウザに表示されて入れば完了です。

Material-UIを導入する

最後に、Reactと一緒に使われることが多いCSSフレームワークMaterial-UIを導入します。

app_name/client直下で次のコマンドを実行します。

$ npm install material-ui@next --save

次にapp_name/client/App.jsを下記のように編集します。

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
import Button from 'material-ui/Button';

class App extends Component {
  state = {users: []}
  
    componentDidMount() {
      fetch('/users')
        .then(res => res.json())
        .then(users => this.setState({ users }));
    }
  
    render() {
      return (
        <div className="App">
          <h1>Users</h1>
          {this.state.users.map(user =>
            <div key={user.id}>{user.username}</div>
          )}
          <Button raised color="primary">
            Hello World
          </Button>
        </div>
      );
    }
}

export default App;

編集を終えたら、再度npm startを実行し、ユーザー名の下にボタンが出て入ればMaterial-UIの導入は完了です。