node
: 자바스크립트 실행기
package.json이 생김
여기에다가 react 개발에 필요한 모든 패키지들을 넣어주면 됨!
npm으로 react, react-dom webpack, babel 설치하기
npm i -D @babel/core @babel/preset-env @babel/preset-react babel-loader
+npm i -D @babel/plugin-proposal-class-properties
+webpack.config.js
에 plugins: ['@babel/plugin-proposal-class-properties']
추가
package.json 내용
쪼개서 코드 작성하기
const React = require('react');
const { Component } = React;
class WordRelay extends Component {
state = {
};
render() {
}
}
module.exports = WordRelay;
문제
는 html에서 인식하는 거 src에는 딱 하나의 파일만 넣을 수 있음webpack
등장!웹팩은 webpack.config.js에서 모든게 돌아감
webpack.config.js 설정
const path=require('path')//node에서 경로 조작하는 것
module.exports={
name:'wordrelay-setting',//끝말잇기 설정할래~
mode: 'development', //실서비스:production
devtool:'eval',
resolve: {
extension: ['.js','.jsx']
},
//entry와 output이 젤 중요!
entry:{
//입력
app:['./client'],
//client.jsx가 WordRelay.js 불러오기때문에 WordRelay.js 안 적어줘도 됨
//확장자도 안적어줘도 됨 => resolve 사용
},
module:{
rules: [{
test:/\.jsx?/,//정규표현식 js파일이랑jsx 파일을 이 rule을 적용하겠다.
loader: 'babel-loader',
options:{
presets:['@babel/preset-env', '@babel/preset-react'],
plugins: ['@babel/plugin-proposal-class-properties']
}
}]
},
output:{
//출력
path: path.join(__dirname, 'dist'), //join: 경로를 알아서 합쳐줌 >현재 폴더안에 dist
filename: 'app.js'
},
};
webpack 실행시켜주려고 입력하면 !
명령어로 등록이 안되어 있어 오류남..
1.package.json안의 script부분에 dev:"webpack"
추가 후
npm run dev
로 실행시키기
"scripts": {
"test": "echo \"Error: ...",
"dev": "webpack"
},
2.npx webpack
으로 실행 시키기
webpack
이 실행되면dist
파일안에app.js
파일이 생겨져 있음!
webpack에서 중요한 세가지라고 했던 것은
pugins:[]
//확장 프로그램
추가적으로 무언가 하고 싶을 때 사용
ex) plugins: [ new webpack.LoaderOptionsPlugin({debug:true}) ]
자동 빌드 하는 법
npm i -D webpack-dev-server
와
npm i -D react-hot-loader
설치
package.json
에서 "scripts": {"dev": "webpack-dev-server --hot"}
추가
client.jsx
에서 const { hot } = require('react-hot-loader/root');
불러와서 const Hot = hot(WordRelay);
한 후 ReactDom.render(<Hot />, doc ..);
webpack.config.js
에서 babel-loader option의 plugins에 추가 plugins: ['@babel/plugin-proposal-class-properties', 'react-hot-loader/babel',]
index.html
에서 <script src="./app.js"></script>
로 변경 (dist 빼기)
//WordRelay.jsx
const React = require('react');
const { Component } = React;
class WordRelay extends Component {
state = {
word:'김지원',
value:'',
result:'',
};
onSubmitForm =(e) => {
e.preventDefault();
if (this.state.word[this.state.word.length - 1] === this.state.value[0]) {
this.setState({
result: '딩동댕',
word: this.state.value,
value: '',
});
this.input.focus();
} else {
this.setState({
result: '땡',
value: '',
});
this.input.focus();
}
};
onChangeInput = (e) => {
this.setState({value: e.target.value});
};
input;
onRefInput = (c) => {
this.input = c;
};
render() {
return(
<>
<div>{this.state.word}</div>
<form onSubmit={this.onSubmitForm}>
<input ref={this.onRefInput} value={this.state.value} onChange={this.onChangeInput} />
<button>입력!</button>
</form>
<div>{this.state.result}</div>
</>
)
}
}
module.exports = WordRelay;
//client.jsx
const React = require('react');
const ReactDom = require('react-dom');
const { hot } = require('react-hot-loader/root');
const WordRelay = require('./WordRelay');
const Hot = hot(WordRelay);
ReactDom.render(<Hot />, document.querySelector("#root"));
//webpack.config.js
const path=require('path')//node에서 경로 조작하는 것
module.exports={
name:'wordrelay-setting',//끝말잇기 설정할래~
mode: 'development', //실서비스:production
devtool:'eval',
resolve: {
extensions: ['.js','.jsx']
},
//entry와 output이 젤 중요!
entry:{
//입력
app:['./client'],
//client.jsx가 WordRelay.jsx 불러오기때문에 WordRelay.jsx 안 적어줘도 됨
//확장자도 안적어줘도 됨 => resolve 사용
},
module:{
rules: [{
test:/\.jsx?/,//정규표현식 js파일이랑jsx 파일을 이 rule을 적용하겠다.
loader: 'babel-loader',
options:{
presets:[['@babel/preset-env', {
targets:{
browsers:['> 1% in KR'],//browserlist
},
debug:true,
}],
'@babel/preset-react',
],
plugins: ['@babel/plugin-proposal-class-properties',
'react-hot-loader/babel',
]
}
}]
},
output:{
//출력
path: path.join(__dirname, 'dist'), //join: 경로를 알아서 합쳐줌 >현재 폴더안에 dist
filename: 'app.js'
},
};
class -> 화살표 함수
로 변경
state를 const{ useState, useRef } =React;
와 const[word, setWord] = useState('김지원');
이렇게 변경
ref는 const inputRef = useRef(null);
선언 후 current
항상 붙여서 사용 inputRef.current.focus();
class 메소드에다가 const
붙이기 const onSubmitForm =(e) => {...
render()
지우기 //Q.왜징??
this.state.word
를 word
로 변경
setState
안쓰고 setValue
사용
const React = require('react');
const{ useState, useRef } = React;
const WordRelay = () => {
const[word, setWord] = useState('김지원');
const [value, setValue] = useState('');
const [result, setResult] = useState('');
const inputRef = useRef(null);
const onSubmitForm =(e) => {
e.preventDefault();
if (word[word.length - 1] === value[0]) {
setResult('딩동댕');
setWord(value);
setValue('');
inputRef.current.focus();
} else {
setResult('땡');
setValue('');
inputRef.current.focus();
}
};
const onChangeInput = (e) => {
setValue(e.target.value);
};
return(
<>
<div>{word}</div>
<form onSubmit={onSubmitForm}>
<input ref={inputRef} value={value} onChange={onChangeInput} />
<button>클릭!</button>
</form>
<div>{result}</div>
</>
);
}
module.exports = WordRelay;