今回の記事では、
Djangoプロジェクト内にReactでfrontendを反映させる方法
について解説していきます
frontend用のappを作成と初期設定
$ python manage.py startapp frontend
app名をここでは、
frontend
とします
settings.py に appの追加
INSTALLED_APPS = [
                   .
                   .
                   .
                   'frontend',
]
frontendをINSTALLED_APPSに追加します
TEMPLATES = [
    {
        'DIRS': [ BASE_DIR / "templates"],
    },
]
TEMPLATES内のDIRSを上記に変更します
mainフォルダ内のurls.py
from django.urls import path, include
urlpatterns = [
    .
    .
    .
    .
    path('react/', include('frontend.urls')),
]
includeをインポートするのを忘れずに!
ここでは、
/react/
をfrontendのパスとしています
frontend内のurls.py
from django.urls import path
from django.views.generic import TemplateView
urlpatterns = [
    path('', TemplateView.as_view(template_name="frontend/index.html"), name="index_js")
]
下記で作成するテンプレートファイルにパスを通します
app内の設定
templatesフォルダ > frontendフォルダ > index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>React Index</title>
</head>
<body>
{% load static %}
    <div id="app"></div>
    <script src="{% static 'frontend/main.js/main.js' %}"></script>
</body>
</html>
templatesフォルダ > frontendフォルダ > index.html
とそれぞれ作成します
srcフォルダ > index.js
import React from "react"
import ReactDom from "react-dom"
import App from "./App"
let myComponent = document.getElementById("app")
if (myComponent !== null){
    ReactDom.render(<App />, myComponent)
}
index.html内のid「app」にApp.jsの内容をrenderするよう指示を出しています
srcフォルダ > App.js
import React, {Component} from "react"
const App = () => {
    return (
        <div>Hello World</div>
    )
}
export default App
Hello Worldと記述されるようにしましょう
npmの設定
npmのインストールについて、ここでは割愛させて頂きます
package.json
{
    "name": "src",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": {
        "dev": "webpack --mode development --watch --entry ./frontend/src/index.js --output-path ./frontend/static/frontend/main.js",
        "build": "webpack --mode production --entry ./frontend/src/index.js --output-path ./frontend/static/frontend/main.js"
    },
    "keywords": [],
    "author": "",
    "license": "ISC",
    "devDependencies": {
        "@babel/core": "^7.12.16",
        "@babel/preset-env": "^7.12.16",
        "@babel/preset-react": "^7.12.13",
        "antd": "^4.12.3",
        "babel-loader": "^8.2.2",
        "babel-plugin-transform-class-properties": "^6.24.1",
        "css-loader": "^5.0.2",
        "file-loader": "^6.2.0",
        "formik": "^2.2.6",
        "moment": "^2.29.1",
        "prop-types": "^15.7.2",
        "react": "^17.0.1",
        "react-cookies": "^0.1.1",
        "react-dom": "^17.0.1",
        "react-router-dom": "^5.2.0",
        "sass": "^1.32.8",
        "sass-loader": "^11.0.1",
        "style-loader": "^2.0.0",
        "webpack": "^5.23.0",
        "webpack-cli": "^4.5.0",
        "webpack-dev-server": "^3.11.2",
        "whatwg-fetch": "^3.5.0",
        "yup": "^0.32.9"
    },
    "jest": {
        "transformIgnorePatterns": [
            "/node_modules/(?!antd|@ant-design|rc-.+?|@babel/runtime).+(js|jsx)$"
        ]
    }
}
このままコピペで良いかと思います
.babelrc
{
    "presets": ["@babel/preset-env", "@babel/preset-react"],
    "plugins": ["transform-class-properties"]
}
webpack.config.js
module.exports = {
    output: {
        filename: "main.js",
    },
    module: {
        rules: [
            {
                test: /\.js$/,
                exclude: /node_modules/,
                use:
                    {
                        loader: "babel-loader"
                    }
            },
            {
                test: /\.css$/,
                exclude: /node_modules/,
                use:[
                    "style-loader",
                    {loader: "css-loader",
                    options: { url: false }
                    }
                ]
            }
        ]
    },
    devServer: {
        historyApiFallback: true,
      }
}
ファイルツリー
こんな感じになりました!
src ├── frontend │ ├── init.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ │ └── init.py │ ├── models.py │ ├── src │ │ ├── App.css │ │ ├── App.js │ ├── static │ │ └── frontend │ │ └── main.js │ │ └── main.js │ ├── templates │ │ └── frontend │ │ └── index.html │ ├── tests.py │ ├── urls.py │ └── views.py ├── main │ ├── init.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── manage.py ├── package-lock.json ├── package.json ├── requirements.txt ├── snippets │ └── decorators.py ├── static │ ├── css │ │ ├── header.css │ │ └── index.css │ ├── images │ └── js ├── templates └── webpack.config.js
npm install とローカルサーバーの実行
下記を順に実行
$ npm install
$ npm run dev
$ python manage.py runserver
その後、
http://localhost:8000/react/
へアクセスすると、
Hello World
が表示されているのがわかります!
以上となります
本日もありがとうございました!!!
 
  
  
  
  
