Docker + Laravel + React + TypeScript
Docker で React × TypeScript × Laravel の環境を構築する
流れ
laravel のリポジトリを clone する。main ブランチには node が入っていないので、 1.x ブランチから clone する。
git clone -b 1.x https://github.com/ucan-lab/docker-laravel.git cd docker-laravel make create-project
React 環境構築
make npm docker-compose exec app composer require laravel/ui docker-compose exec app php artisan ui react --auth
ビルド
make npm-install make npm-dev
TypeScript インストール
cd backend npm install ts-loader typescript react-router-dom @types/react @types/react-dom @types/react-router-dom --save-dev
touch tsconfig.json
{ "compilerOptions": { "outDir": "./built/", "sourceMap": true, "strict": true, "noImplicitReturns": true, "noImplicitAny": true, "module": "es2015", "jsx": "react", "experimentalDecorators": true, "emitDecoratorMetadata": true, "moduleResolution": "node", "target": "es6", "lib": ["es2016", "dom"], "allowSyntheticDefaultImports": true }, "include": ["resources/ts/**/*"] }
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Laravel</title> <link rel="stylesheet" href="{{ mix('css/app.css') }}" /> </head> <body> <div id="app"></div> </body> <script src="{{ mix('/js/index.js') }}"></script> </html>
import React from 'react'; import ReactDOM from 'react-dom'; const App: React.FC = () => { return ( <div> <p>こんにちは</p> </div> ) } if (document.getElementById('app')) { ReactDOM.render(<App />, document.getElementById('app')); }
npm run watch