React を 触ってみた (2) – React + babel + webpack
前回は 開発環境を ととのえるところまで やったので 今回は Hello World を 表示させるところ まで 作成していこうと思います
前回の記事
React を 触ってみた (1) – 開発環境
https://tekuaru.jack-russell.jp/2018/04/27/1694/
基本的に ページ下部に 記してある 参考にしたURL先の内容を なぞっています
自分が作業した 順に 書いていくので 無駄な作業が多く なるかもしれませんが 優しく見守っていただければと思います
React + babel + webpack の インストール
(Dir : /var/www/html/)
まずは 作成に必要な パッケージを インストールします
1 | npm install --save-dev react react-dom babel-core babel-loader babel-plugin-transform-react-jsx babel-preset-react webpack |
各々のバージョンは 以下のようになりました
1 2 3 4 5 6 7 | "babel-core": "^6.26.3", "babel-loader": "^7.1.4", "babel-plugin-transform-react-jsx": "^6.24.1", "babel-preset-react": "^6.24.1", "react": "^16.3.2", "react-dom": "^16.3.2", "webpack": "^4.6.0" |
マイナーバージョン の 違いでも 書き方が変わって 動かない場合があるので このバージョンと異なる場合 各自 調べながら進めていく形になると思います
補足 : 何かエラーが出た…
パッケージを インストールしようとしたら エラーが出ちゃったよって人
エラー内に このように書かれていませんか??
1 | ERR! Refusing to install react as a dependency of itself |
前回の npm init 時に プロジェクト名を react とか つけていませんか??
パッケージ名と同じ プロジェクト名は つけられないので package.json を 編集してください
ex) react-test
補足 : git で 管理しようとしたら ものすごいファイルが 作業ツリーにある…
パッケージを インストールすると node_modules という ディレクトリ が できて その中にパッケージが 置かれているみたいです
git で 管理する場合は node_modules は 管理しなくて良いので .gitignore で 除外しておきましょう
/.gitignore
1 | /node_modules/ |
ファイル作成
まずは ディレクトリ構造
今は 以下のように なっていますが 今後 ディレクトリは 増えていきます
/var/www/html/
-> resources
-> css
-> js
-> src
-> component
推奨のディレクトリ構造とは 違うので あまり参考にしないでください…
次に コードを 書いていきますが 手探りの中 作業しているので
とりあえず 今は おまじない的な感じで 参考のURL先を元に 作成します
/index.html
01 02 03 04 05 06 07 08 09 10 11 | <! DOCTYPE html> < html lang = "ja" > < head > < meta charset = "utf-8" > < meta name = "viewport" content = "width=device-width, initial-scale=1, shrink-to-fit=no" > </ head > < body > < div id = "root" ></ div > < script type = 'text/javascript' src = "./resources/js/index.bundle.js" async></ script > </ body > </ html > |
React で 描写するための 要素を ルートDOMノードと言うみたいです
今回は id=”root” が 振ってある div要素ですね
その内部が Reactによって 管理されるそうです
そして React から コンパイルしたファイル ( index.bundle.js ) を 読み込んでいます
次は id=”root” に 描写の指定をする ファイルですかね
( 詳しくは 違うのかもしれませんが 今は そんな感じで 捉えています )
/src/index.jsx
1 2 3 4 5 6 7 8 9 | import React from 'react' import ReactDOM from 'react-dom' import Main from './component/main' ReactDOM.render( <Main />, document.getElementById( 'root' ) ) |
描画の内容は /src/component/main.jsx に 記述します
Hello World と 表示させる部分
/src/component/main.jsx
1 2 3 4 5 6 7 | import React from 'react' export default class Main extends React.Component { render() { return <h1>Hello World</h1> } } |
React.Component を extends して Main という class を 作って render 関数を 呼び出すみたいです
export default というのは import した時 ( 今回は /src/index.jsx で import していますね ) に default で 読み出される という事みたいです
コンパイルして表示してみる
webpack で ビルドする為には 設定ファイル ( .babelrc & webpack.config.js ) と言うものが必要になるので 作成します
/.babelrc
1 2 3 | { "presets": ["react"] } |
/webpack.config.js
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | const path = require( 'path' ); module.exports = { // モードの設定 // mode: 'production', mode: 'development' , // エントリーポイントの設定 entry: { 'index' : [ path.resolve(__dirname, 'src/index.jsx' ), ], }, // 出力の設定 output: { // 出力するファイル名 filename: '[name].bundle.js' , // 出力先のパス path: path.resolve(__dirname, 'resources/js' ), }, // ローダーの設定 module: { rules: [ { // ローダーの処理対象ファイル test: /\.(js|jsx)$/, // ローダーの処理対象から外すディレクトリ exclude: /node_modules/, // 利用するローダー use: 'babel-loader' , }, ], }, resolve: { extensions: [ '.js' , '.jsx' ] }, } |
設定に 不安が残るのですが 多分こんな感じだと思います
コンパイル
実際に動かしてみます
1 | node_modules /webpack/bin/webpack .js |
すると
1 2 | The CLI moved into a separate package: webpack-cli Would you like to install webpack-cli? (That will run npm install -D webpack-cli) ( yes /NO ) |
と表示されました
webpack-cli も パッケージとして 必要みたいです
y と 入力して インストール しましょう
僕の環境では “webpack-cli”: “^2.0.15” が インストール されました
すると /resources/js/ 以下に index.bundle.js という ファイルが生成されました
( こちらは コンパイルすれば いつでも生成されるので .gitignore に 追加しておこうと思います )
実際に 表示させてみる
First React Project
http://react/
Hello World と 表示されました
とりあえず 今日の目標は完了です!!
参考
I referred to ReactJSで作る今時のSPA入門(基本編).
https://qiita.com/teradonburi/items/fb91e5feacab5071cfef