HOME>WEBプログラム覚書>[Webpack][React]既存サイトにさっくりReactを導入するためのWebpack設定

[Webpack][React]既存サイトにさっくりReactを導入するためのWebpack設定

WordPressとかで構築されててViewに必要なデータは揃ってるしAPI作るのが面倒な場合。

やりたいことは、こんな感じでファイルごとに異なるJavascriptファイルを読み込む。Javascriptに引き渡す値はViewに書く。

front-page.php

  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>Title</title>
  6. </head>
  7. <body>
  8.     <div id="App"></div>
  9. </body>
  10. <?php
  11. $data = [
  12.    'title' => 'front-page.php',
  13.     'desc'  => 'テキストボックスを変更するとタイトルが変わるよ'
  14. ];
  15. ?>
  16. <script>
  17.     const data = <?php echo json_encode($data); ?>;
  18. </script>
  19. <script src="/js/front-page.bundle.js"></script>
  20. </html>

archive.php

  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>Title</title>
  6. </head>
  7. <body>
  8.     <div id="App"></div>
  9. </body>
  10. <?php
  11. $data = [
  12.    'title' => 'archive.php',
  13.     'desc'  => 'テキストボックスを変更するとタイトルが変わるよ'
  14. ];
  15. ?>
  16. <script>
  17.     const data = <?php echo json_encode($data); ?>
  18. </script>
  19. <script src="/js/archive.bundle.js"></script>
  20. </html>

node moduleのインストール

  1. $ node -v
  2. v8.9.1
  3. $ npm -v
  4. 5.6.0
  5. $ npm install --save-dev webpack webpack-cli babel-loader @babel/core @babel/cli @babel/preset-env @babel/preset-react react react-dom

package.json

2019年3月15日現在、各モジュールのバージョンは下記となる
  1. "devDependencies": {
  2.     "@babel/cli": "^7.2.3",
  3.     "@babel/core": "^7.3.4",
  4.     "@babel/preset-env": "^7.3.4",
  5.     "@babel/preset-react": "^7.0.0",
  6.     "babel-loader": "^8.0.5",
  7.     "react": "^16.8.4",
  8.     "react-dom": "^16.8.4",
  9.     "webpack": "^4.29.6",
  10.     "webpack-cli": "^3.2.3"
  11. }

スクリプトも追記しておく。

  1. "scripts": {
  2.     "build": "webpack --mode=production",
  3.     "develop": "webpack --mode=development",
  4.     "watch": "webpack --mode=development --watch"
  5. },

ディレクトリ、ファイル構成

最終的なディレクトリ、ファイル構成はこのようにする前提で。

  1. develop
  2. |   archive.php
  3. |   front-page.php
  4. |
  5. +---js // ビルド後出来上がったjsファイル
  6. |       archive.bundle.js
  7. |       front-page.bundle.js
  8. |
  9. \---webpack
  10.     |   package-lock.json
  11.     |   package.json
  12.     |   webpack.config.js
  13.     |
  14.     +---archive
  15.     |       App.js
  16.     |       index.js
  17.     |
  18.     \---front-page
  19.             App.js
  20.             index.js

webpack.conf

  1. module.exports = {
  2.     devtool: 'inline-source-map',
  3.     mode: 'development',
  4.     entry: {
  5.         "front-page": './front-page/index.js',
  6.         "archive": './archive/index.js'
  7.     },
  8.     // ファイルの出力設定
  9.     output: {
  10.         //  出力ディレクトリ
  11.         // __dirnameは webpack.config.js があるディレクトリの絶対パス
  12.         path: __dirname + '/../js/',
  13.  
  14.         // 出力ファイル名
  15.         // [name]はentryがハッシュの場合、keyで置換される
  16.         filename: '[name].bundle.js'
  17.     },
  18.     module: {
  19.         rules: [{
  20.             test: /\.js?$/,
  21.             exclude: /node_modules/,
  22.             use: {
  23.                 loader: 'babel-loader',
  24.                 options: {
  25.                     "presets": ["@babel/preset-env", "@babel/preset-react"]
  26.                 },
  27.             }
  28.         }]
  29.     }
  30. };

JSXファイル

ビルドの起点となるfront-page/index.js

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import App from './App';
  4.  
  5. ReactDOM.render(
  6.     <App data={data} />,
  7.     document.getElementById('App')
  8. );

front-page/index.jsからimportされるApp.js

  1. import React from 'react';
  2.  
  3. export default class App extends React.Component {
  4.     constructor(props) {
  5.         super(props);
  6.         this.state = props.data;
  7.     }
  8.  
  9.     onChangeTitle(e) {
  10.         this.setState({'title': e.target.value});
  11.     }
  12.  
  13.     render() {
  14.         return <section className="hello-world">
  15.             <h1>{this.state.title}</h1>
  16.             <p>{this.props.data.desc}</p>
  17.             <input type="text" value={this.state.title} onChange={this.onChangeTitle.bind(this)} />
  18.         </section>
  19.     }
  20. }

ビルド後はindex.jsとApp.jsが一つのファイルになったfront-page.bundle.jsができる。
archiveも同様にindex.htmlとApp.jsを作成し下記コマンドを打つ。

  1. npm run build

エラーが無ければOK

投稿日 2019年3月15日 04:16
カテゴリ JavaScript
タグ React | webpack | 設定
トラックバック URL http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1801

コメント

コメントする
Name
Email Address
URL