React(createReactApp使っていない), typeScriptを用いて環境構築しています。
indexでクリックボタンを表示し、アラートを出すシンプルなコードを記述していますが、
buttonタグの中にonClickが表示されていないので、クリックしてもイベントが発生しません。
editor,ブラウザのコンソール上にエラーは表示されておりません。
以下のようなコードを作成しています。
index
1import React from 'react'; 2import ReactDOM from 'react-dom'; 3import App from './app'; 4 5ReactDOM.render( 6 <React.StrictMode> 7 <App /> 8 </React.StrictMode>, 9 document.getElementById('container') 10);
app
1import React from 'react'; 2 3const App = () => { 4 const clickMe = () => { 5 alert('test'); 6 }; 7 8 return ( 9 <> 10 <p>Hello World</p> 11 <button onClick={clickMe}>clickMe</button> 12 </> 13 ); 14}; 15export default App; 16
ブラウザ上ではbuttonタグは以下のように表示されています。
<button>clickMe</button>
補足情報(FW/ツールのバージョンなど)
構築手順
nodeインストール(v16)
--パッケージの初期化--------------------------------------------
yarn init
--パッケージのインストール--------------------------------------------
1 yarn add react
2 yarn add react-dom
3 yarn add react-router-dom
4 yarn add styled-components
5 yarn add -D typescript
6 yarn add -D webpack
7 yarn add -D webpack webpack-cli ts-loader
8 yarn add -D eslint
9 yarn add -D prettier
10 yarn add -D @types/react
11 yarn add -D @types/react-dom
12 yarn add -D @types/react-router-dom
13 yarn add -D @types/styled-components
--typescriptの設定--------------------------------------------
14 yarn tsc --init
--eslint,prettierの設定--------------------------------------------
15 yarn eslint --init
16 yarn add eslint-config-prettier
17 yarn add eslint-plugin-prettier
--ビルド--------------------------------------------
18 yarn webpack
※resourcesフォルダ配下にindex.htmlを作成しておく
--ビルドの自動化--------------------------------------------
19 yarn add -D clean-webpack-plugin html-webpack-plugin
--開発環境サーバを導入--------------------------------------------
20 yarn add -D webpack-dev-server
21 yarn webpack-dev-server
webpack
1const path = require('path'); 2const HtmlWebpackPlugin = require('html-webpack-plugin'); 3 4module.exports = { 5 mode: 'development', 6 entry: './src/index.tsx', 7 output: { 8 filename: 'bundle.js', 9 path: path.resolve(__dirname, 'dist'), 10 }, 11 module: { 12 rules: [ 13 { 14 test: /.tsx?$/, 15 use: 'ts-loader', 16 }, 17 ], 18 }, 19 resolve: { 20 extensions: ['.ts', '.tsx', '.js', '.jsx'], 21 }, 22devtool: 'eval-source-map', 23 plugins: [ 24 new HtmlWebpackPlugin({ 25 template: 'resources/index.html', 26 }), 27 ], 28 devServer: { 29 static: path.join(__dirname, 'dist'), 30 compress: true, 31 historyApiFallback: true, 32 open: true, 33 port: 8080, 34 }, 35}; 36
tsconfig
1{ 2 "compilerOptions": { 3 "target": "es5", 4 "lib": [ 5 "DOM", 6 "ES2019" 7 ], 8 "jsx": "react", 9 "module": "commonjs", 10 "esModuleInterop": true, 11 "forceConsistentCasingInFileNames": true, 12 "strict": true, 13 "skipLibCheck": true, 14 }, 15 "files": ["src/index.tsx"] 16} 17
packagejson
1{ 2 "name": "test", 3 "version": "0.0.0", 4 "main": "index.js", 5 "license": "NOLICENCED", 6 "dependencies": { 7 "@material-ui/core": "^4.12.3", 8 "@material-ui/icons": "^4.11.2", 9 "eslint-config-prettier": "^8.3.0", 10 "eslint-plugin-prettier": "^4.0.0", 11 "react": "^17.0.2", 12 "react-dom": "^17.0.2", 13 "react-router-dom": "^6.2.1", 14 "styled-components": "^5.3.3" 15 }, 16 "devDependencies": { 17 "@types/react": "^17.0.37", 18 "@types/react-dom": "^17.0.11", 19 "@types/react-router-dom": "^5.3.2", 20 "@types/styled-components": "^5.1.18", 21 "@typescript-eslint/eslint-plugin": "^5.8.0", 22 "@typescript-eslint/parser": "^5.8.0", 23 "clean-webpack-plugin": "^4.0.0", 24 "eslint": "^7.32.0", 25 "eslint-config-standard": "^16.0.3", 26 "eslint-plugin-import": "^2.25.3", 27 "eslint-plugin-node": "^11.1.0", 28 "eslint-plugin-promise": "^5.2.0", 29 "eslint-plugin-react": "^7.27.1", 30 "html-webpack-plugin": "^5.5.0", 31 "prettier": "^2.5.1", 32 "ts-loader": "^9.2.6", 33 "typescript": "^4.5.4", 34 "webpack": "^5.65.0", 35 "webpack-cli": "^4.9.1", 36 "webpack-dev-server": "^4.7.0" 37 }, 38 "scripts": { 39 "start": "yarn webpack-dev-server" 40 } 41}
dist配下のhtml
indexhtml
1<!DOCTYPE html> 2<html lang="jp"> 3 4<head> 5 <meta charset="UTF-8" /> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 7 <title>memo-map</title> 8<script defer src="bundle.js"></script></head> ⇐**ビルド時に追加されている** 9 10<body> 11 <div id="container"></div> 12 <script src="bundle.js"></script> 13</body> 14 15</html>