npm run deploy
// ๋ฐฐํฌ ๋ช
๋ ์ด
// react ํจํค์ง ๋ค์ด๋ก๋
npm install -g create-react-app
// react ํ๋ก์ ํธ ์์ฑ
create-react-app project
// spa๋ฅผ ์ฌ์ฉํ๊ธฐ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
npm install --save react-router-dom
//git page์ ์ฌ๋ฆฌ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
npm install --save gh-pages
// url๋งํฌ๋ฅผ ๊ฑฐ๋๋ฐฉ์
<Link to="/link">
// url ๋งํฌ๋ฅผ ๊ฑฐ๋๋ฐ ์ ํํ ๋งํฌ๊ฐ์๋๋ฉด ์ถ๋ ฅ๋์ง์๋๋ค.
<Link exact to="/link">
// ๋ฐ์ url์ ๋ฐ๋ฅธ component ์ถ๋ ฅ
<Route path="/link" component={component}>
// ๋ฐ์ url์ ๋ฐ๋ฅธ component ์ถ๋ ฅ
<Route path="/link" render={() => { <h2>hello</h2>}}>
// as๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณ๋ช
์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
import { BrowerRouter as Router, Route, Link} from 'react-router-dom'
npm install --save prop-types
or
yarn add prop-types
// class ๋ช
์ผ๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ
// ์๋์ฒ๋ผ class๋ช
defaultProps๋ฅผ ํด์ค๋ค.
// defaultProps๋ props๊ฐ ์๋์ด์ฌ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด์์ฃผ๊ฑฐ๋ ํ์
์ ์ง์ ํ ๋ ์ฌ์ฉ์ ํ๋ค.
className.defaultProps = {
propName : propType.string;
}
<!-- classname ์์ฑ์ {this.state.a ? 'a' : ''} -->
<li className={this.state.classNamePush == 'zzzz' ? 'on' : ''}>
<!-- ๋ค์ค className์ ์ค์ ํ ๊ฒฝ์ฐ
3ํญ์ฐ์ฐ์๋ก ๋ค์ด๋๋ฏนํ๊ฒ ํ๋ ค๋ฉด ()์ ์ฌ์ฉ์ด์ฉํด์ ์ฌ์ฉํด์ผํ๋ค.\
-->
<div className={"profile-about-me " + (this.state.menuOn === 'info' ? 'on' : '')}>
// React์์ event๋ฅผ ๋ฐ์ํ ๊ฒฝ์ฐ
// constructor = this.event.bind๋ฅผ ํ๊ฑฐ๋
// html์ function ์์ event๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค
menuClickOn = function(menu){
console.log(menu);
this.setState({menuOn : menu})
}
<ul className="profile-menu">
<li onClick={ () => { this.menuClickOn('info')}}>์๊ธฐ์๊ฐ์</li>
<li onClick={ () => { this.menuClickOn('project')}}>ํ๋ก์ ํธ๊ฒฝํ</li>
<li onClick={ () => { this.menuClickOn('announce')}}>๋ฐํ๋ด์ฉ</li>
</ul>
import * as Fun from '../fun';
// ๋ณต์กํ ๊ณ์ฐ ๊ณต์์ด๋ ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฉ๋ ํจ์๋ฅผ ์ง์ ํด์ ์ฌ์ฉํ๋ค.
// *๋ export ๋ ๋ชจ๋ ๊ฒ์ ๊ฐ์ง๊ณ ์จ๋ค
componentWillMount() // react ์ปดํฌ๋ํธ๊ฐ ์คํํ ๋ ์ ์ผ๋จผ์ ์คํ, ์ฃผ๋ก axios๋ฅผ ์ฌ์ฉํ ๋ ์ฌ์ฉ
componentDidUpdate() // status or props ๋ณ๊ฒฝ๋ ๋ ์ฌ์ฉํ๋ค.
/** axios๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
http์ ๋ฉ์๋๋
get, post, put, delete
Rest API์ http ๋ฉ์๋๋ก ์ฌ์ฉ
*/
// params๋ฅผ ๋ฃ์ผ๋ฉด url์ ํ๋ผ๋ฉํฐ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ๋ค
axios.get('/url', {params : { id : 1}}).then( (response) => {}).catch((e) => {});
axios.post('/url', {a:1, b:2}).then( (response) => {}).catch((e) => {});
or
axios({
method: 'get',
url: '/url',
responseType: 'stream'
})
axios({
method: 'post',
url: '/user/12345',
data: {
firstName: 'Fred',
lastName: 'Flintstone'
}
});
// axios์ parameter์ url, data(๊ฐ์ฒด), header(๊ฐ์ฒด) ์ฌ์ฉํ๋ฉด ๋๋ค.
axios.get(url, params, header).then().catch(e)
npm install --save firebase
import FireBase from 'firebase';
FireBase.initializeApp();
npm install --save react-summernote
or
yarn add react-summernote
// summer note๋ jquery ๊ธฐ๋ฐ์ผ๋ก ์๋์ด ๋๋ค
// jquery ํ๋ก๊ทธ์ธ ์ฌ์ฉ
npm install --save jquery
or
yarn add jquery
// react์์ string ํ์ html์ html ํ์ผ๋ก ๋ณํ์ ํ๋ค
dangerouslySetInnerHTML = { {__html : value}}
/**
* express์์ cors๋ฅผ ํ๋๋ฐ๋ ์๋ฌ๊ฐ ๋ฌ๋ค
* ํ์ธ์ ํด๋ณด๋ localhost๋ฅผ ์์ฑํ ๋ http://๋ฅผ ๊ผญ๋ถํ์ค์ผํ๋ค
* ๊ทธ๋ ๊ฒ cors๋ฅผ ๋ฒ์ด๋ ์์๋ค.
*/
axios.get('http://localhost:8004/profile', {}).then((response) => {
console.log(response);
});
// ๊ธ๋ก๋ฒ๋ก ์ ์ธํด์ ์ฌ์ฉ์ ํ ์ ์๋ค.
axios.defaults.baseURL = 'https://api.example.com';
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
// axios๋ฅผ ์ ์ธ
const instance = axios.create({
// ๊ธฐ๋ณธ๊ฐ์ ์ธํ
// timeout์ ๋ณดํต 0์ด๋ก ์ง์
baseURL = 'https://api.example.com';
});
// ์ธ์คํด์ค์ ๋ชจ๋ ์์ฒญ์ 2.5์ด ๊ฐ๋ง ๋๊ธฐ ํ ํ์์์ ์ฒ๋ฆฌํฉ๋๋ค.
instance.defaults.timeout = 2500;
// https://flamingotiger.github.io/frontend/react/react-helmet/
npm install --save react-helmet @types/react-helmet
- ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ ๋ชฉ, ์ค๋ช , ์ด๋ฏธ์ง๋ก ์ฌ์ดํธ์ ์ ์ฑ ์ ํ ์ ์๊ณ , head์ meta tag์ ์ ์ด์ ์ฌ์ฉ์ํ๋ค.
์์ฑ | ๋ป |
---|---|
subject | ํํ์ด์ง์ ์ฃผ์ |
title | ํํ์ด์ง์ ์ด๋ฆ |
description | ํํ์ด์ง์ ์ค๋ช |
Keywords | ํค์๋๋ฅผ ์ ๋ ฅ |
Author | ๋ง๋ค์ฌ๋ ์ด๋ฆ |
robots | All, index,follow, noindex,follow. index,nofollow, noindex,nofollow |
// a tag์์ href๋ก ๋ฉ์ผ์ ๋ณด๋ด๋ ค๊ณ ํ๋ฉด mailto๋ฅผ ์์ ๋ถํ์ ์ฌ์ฉ์ ํด์ผํ๋ค.
<a href="mailto:[email protected]">[email protected]</a>
<Link to={'/profile?:pa&:page&:search'}>
</Link>
<Route path="/profile?:pa&:page&:search" component={Compornt}></Route>
// React ํจ์์์ lazyํจ์๊ฐ ๋ณ๋๋ก ์๋ค. lazy๋ ๋ถ๋ฆฌ๊ณ ๋์ ์ฌ์ฉ์ ํ๋ ๊ฒ์ ์ง์นญํ๋๋ฐ ์ฃผ๋ก ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฅผ ๋ ์ฌ์ฉ์ ํ๋ค
// ๊ทธ๋์ js ํ์ผ ๊ฐ์ ๊ฒฝ์ฐ๋ ์ปดํฌ๋ํธ๊ฐ ๋ถ๋ฆฐํ lazy๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
// ex)
React.lazy( () => import aaaa from './route/React');
/**
* kakao login ์ถ๊ฐ
**/
npm install react-kakao-login
/**
* google login ์ถ๊ฐ
* */
npm install react-google-login
/**
* facebook login
* **/
npm install react-facebook-login --save --force
/**
* naver๋ ๋ฐ๋ก ์ง์์ ์ํด์ค์ ์ ์ธ์ ํด์ผํ๋ค.
*
* ์ธ๋ถ ์คํฌ๋ฆฝํธ๋ฅผ ๋ถ๋ฌ๋ด๊ธฐ์ํ npm
* npm ์ ํจํค์ง๋ฅผ ์ฐพ์ผ์ญ์์ค.
* ๋ด ํ๋ก์ ํธ์์ ํจํค์ง๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ์ค์นํ์ญ์์ค (npm install typekit).
* import ๋ด๊ฐ ํ์๋กํ๋ ํจํค์ง (import Typekit from 'typekit';)
* */
<script type="text/javascript" src="[https://static.nid.naver.com/js/naveridlogin_js_sdk_2.0.0.js](https://static.nid.naver.com/js/naveridlogin_js_sdk_2.0.0.js)" charset="utf-8"></script>
// with npm
npm install @material-ui/icons // svg ํ์์ ์์ด์ฝ ํ๋ ์์ํฌ npm
// with npm
npm install @material-ui/core // ui๋ฅผ ๊ทธ๋ฆด์ ์๋ ํ๋ ์์ํฌ npm
yarn add cross-env
or
npm install cross-env
"start": "cross-env NODE_PATH=src/ react-scripts start",
"build": "cross-env NODE_PATH=src/ react-scripts build",