React.jsをNode.js+Webpack+Babelで環境構築

React.jsの環境構築難しくない?

環境構築...思ったよりもかなり難しかった..。

要件

以下の要件で進めていこうと思います。

   1. React.jsをNode.jsで利用できる

   2. 極力テンプレとして利用できる

   3. ローカルサーバを起動できる

   4. Hello WorldをWeb上に表示できる

   5. ComponentsとPropsの記述方法が簡易にわかる

 

どうしてWebpackとBabelを利用するのか

  まずReact.jsとは?

    React.jsは主にDOM操作を仮想DOMを用いることにより

    簡潔に記述することが可能なライブラリである。

    また、コンポーネントベースと言って

    例えば、オブジェクトクラスをコンポーネントに分割するように

    コンポーネントにわけて記述し仮想DOMが操作できるため、

    構造的に可読性の高い記述が可能になっている。

 

  Babelを利用する理由

    Babelを利用する理由として、

    ほとんどのブラウザがES6に対応していないため、

    ES6で規格が決まっているReact.jsを

    ES5にトランスパイルすることで

    ブラウザに認識させる役割を担っている。

  Webpackを利用する理由

    主にはBabelとReact.jsをバインドするために用いる

    今回はせっかくなのでWebpackを用いてローカルサーバを起動する。

 

ファイル構造

f:id:olt_gbf:20180508125905p:plain

必要ライブラリ

以下npmとNode.jsはある程度理解できている前提とする。


$ npm init $ npm install react $ npm install react-dom $ npm install --save-dev webpack babel-core babel-loader $ npm install --save-dev babel-preset-react babel-preset-es2015 $ npm install html-webpack-plugin

 

webpack.connfig.js設定

これでローカルサーバを起動し、index.html/App.js/babelなどを

いい感じに紐づけることができる。

作成したJSファイルに以下のように記述していく。

webpackの仕様がよく変わるらしい?ので

2017年の参考サイトでもエラーが出ます。

パッケージによってもエラーが出るらしいですが

2018/05/05時点での各最新パッケージにて実行しました。

 
const HtmlWebpackPlugin = require('html-webpack-plugin'); //installed via npm
const webpack = require('webpack'); //to access built-in plugins
const path = require('path');

module.exports = {
entry: path.resolve(__dirname, 'js/App.js'),
output: {
path: path.resolve(__dirname, './dist'),
filename: 'bundle.js'
},
devServer: {
contentBase: __dirname + './index.html',
port: 3000,
},
resolve: {
modules: [path.resolve(__dirname, "src"), "node_modules"],
extensions: ['.js', '.jsx']
},
module: {
rules: [
{
test: /\.js$/,
loaders: 'babel-loader',
query: {
presets:['react','es2015']
}
},
]
},
plugins: [
new HtmlWebpackPlugin({template: './index.html'})
]
};

package.json設定

npmによって生成されたpackage.jsonに追記していきます。

追記箇所1については、

サーバを起動している間変更があれば

コンパイルを自動でするための設定。

追記箇所2については、

BabelにES2015とReact.jsを利用ための設定。

ここを.bablrcに記述するサイトが多いですが非推奨。

{
    "name": "react_sample",
    "version": "1.0.0",
    "description": "",
    "main": "app.js",
    //追記箇所1
    "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
      "build": "webpack",
      "start": "webpack-dev-server"
    },
    "author": "",
    "license": "ISC",
    "dependencies": {
      "eslint": "4.19.1",
      "fs": "0.0.1-security",
      "html-loader": "^0.5.5",
      "html-webpack-plugin": "^3.2.0",
      "http": "0.0.0",
      "mime": "^2.3.1",
      "path": "^0.12.7",
      "react": "16.3.2",
      "react-dom": "16.3.2",
      "webpack": "4.7.0"
},
    "devDependencies": {
      "babel-cli": "6.26.0",
      "babel-loader": "7.1.4",
      "babel-preset-env": "1.6.1",
      "babel-preset-es2015": "6.24.1",
      "babel-preset-react": "6.24.1",
      "webpack-cli": "2.1.2",
      "webpack-dev-server": "^3.1.4"
},
//追記箇所2
    "babel": {
      "presets": [
     "env",
     "react",
     "es2015"
]
}
}

 

JSファイルについて

localhost:3000でフォームとSendボタンを表示し、

Sendボタンが押されると、

アラートを出すコードになっている。

App.js

Javaなどでいうmainクラスのように扱える。

FormApp.jsをimportしている。

 
import React, { Component } from 'react';
import { FormApp } from './FormApp';
import ReactDOM from 'react-dom';

class App extends React.Component {
render() {
return (
<FormApp />
);
};
};
ReactDOM.render(
<App />,
document.getElementById('root')
);
export default App;
 
FormApp.js

App.jsに継承するように記述することが可能で、

コンポーネントといい、DOM操作の記述ファイルにおいて

階層構造をとることが可能。

 
import React, { Component } from 'react';

export class FormApp extends Component {

constructor(props) {
super(props);
this.state = { items: [], text: '' };
 
this.handleSend = this.handleSend.bind(this);
};

render() {
return (
<div>
<input type="text" />
<button onClick={this.handleSend}>SEND</button>
</div>
);
};
 

 

以上で終了です。

1. npm run build

2. npm start

以上を実行すればlocalhost:3000で

動作確認ができると思います。

でわでわ //

 

簡単な実装はこっちで書いてます

qiita.com