SSR(Server Side Rendering)방식: 백에서 데이터를 프론트서버로 넘겨주고 그것을 바탕으로 브라우저에 넘겨준다.
CSR(Client Side Rendering) spa방식: 프론트서버에서 브라우저에 데이터를 제외한 정적 파일(html, JS, CSS, 이미지)들을 넘겨준다.
next 설치
npm i next
npm i next@9
@
가 버전을 정해줌리액트와 리액트 돔 설치
npm i react react-dom
명령어로 설치pacakge.json
파일에서 script의 dev: next
로 바꿔줌
next
라는 명령어로 해야됨next는 import React from 'react';
가 필요 없음(하지만 써도 상관없음)
초반 폴더구조는 이런식으로 생김 pages는 꼭 있어야됨(이안에 파일들이
라우팅(naver.com/news, naver.com/music 등 서버 뒤에 다른 주소로 들어오는 것들을 처리하는것)
localhost:3000/about
주소로 들어가고 싶으면 pages폴더에 about.js
파일을 만들면 된다./profile/a
profile/b
이렇게 하나의 라우팅에 여러개의 하위구조가 있다면profile
폴더를 만들고 그안에 a.js
b.js
를 만들면 됨[name].js로 만들면 페이지 이름을 동적으로 바꿀수도 있음
prop-types
사용 : prop으로 넘겨주는 변수들을 한번 검사해주는 기능(뭘 검사하는지는 모르겠음)
npm i prop-types
설치components(다른 이름도 가능하나 이 이름이 좋은듯)폴더를 하나 만들어서 레이아웃.js를 하나 만들고
이런식으로 설정함
그리고 상속받을 파일로 가서
이런식으로 리액트 return 부분을 레이아웃으로 한번 감싸면 됨
import Link from 'next/link';
이거를 추가하고 Link태그를 쓰면 됨npm i -D eslint eslint-plugin-import eslint-plugin-react eslint-plugin-react-hooks
.eslintrc
파일을 루트에 만들기{
"parserOptions": {
"ecmaVersion": 2020,
"sourceType": "module",
"ecmaFeatures": {
"jsx": true
}
},
"env": {
"browser": true,
"node": true,
"es6": true
},
"extends": [
"eslint:recommended",
"plugin:react/recommended"
],
"plugins": [
"import",
"react-hooks"
],
"rules": {
}
}
이내용 타입하면 됨. 지금은 recommended라서 엄격한편의 규칙은 아님
코드를 보고 엄격하게 하고 싶으면 엄격한 정도를 바꿀 수 있음
CORS: 브라우저-백엔드간 요청에 필요한 부분 도메인이 다르거나 포트가 다르면 신경써야하는부분
CSR, SSR에 관한 질문을 한번 다시 해주는듯. 아직 무슨말인지 모르겠어서 정리를 못하겠음
필요하면 다시 보기
코드 스플리팅: CSR일때 브라우져에 요청으로 프론트 서버에서 js와 html로 정보를 전송할 때 싱글 페이지다보니까 about만 필요해도 profile등 여러 페이지의 정보를 함께 돌려주는데 요청했던 about 페이지만 '분리'해서 전송해주는게 코드 스플리팅
몽고DB(NoSQL)을 쓰는경우
Ant Design: 쓸만한 CSS 프레임워크(made in China), 리액트, 뷰, 앵귤러 가능
아이콘들이 만들어져 있기 때문에 가져다 쓰기만 하면된다.
ant design, 머터리얼 ui, 시맨틱 ui, 부트스트랩이 있었는데 다 느낌이 비슷해서 다른 사이트들과 비슷해짐. 그래서 고객이 잇는 사이트들은 안쓰거나 쓰더라도 엄청 커스터마이징해서씀
styled-component: 컴포넌트에 이미 스타일이 입혀져 있는거, 컴포넌트에 CSS스타일을 입힐 수 있음
emotion.sh/docs/styled 위에 스타일드 컴포넌트랑 관련이 있음 위에꺼보다 최신임
npmtrends.com/에서 npm에서 인기수치를 볼 수 있음
antd와 styled-components 설치
npm i antd styled-components @ant-design/icons
원래 css는 import를 못하는데 antd는 내부에 웹팩을 내장하고 있어서 import를 할 수 있음
import 'antd/dist/antd.css'
를 page안에 js파일마다 넣어줘야 하는데 이렇게 공통적으로 넣어야하는것들을 page/_app.js
를 만들어서 처리할 수 있다.
_app.js의 역할: pages폴더에 있는 index.js등이 한번 _app.js를 거쳐(Component 인자를 통해 들어옴) 나가게 된다.
import Head from 'next/head'
를 한뒤 <Row gutter={8}>
<Col xs={24} md={6}>
왼쪽 메뉴
</Col>
<Col xs={24} md={12}>
{children}
</Col>
<Col xs={24} md={6}>
오른쪽 메뉴
</Col>
</Row>
- 여기서 gutter는 컬럼들간의 여백(padding)을 줌
<a href="https://www.naver.com" target="_blank" rel="noreferrer noopener">Naver</a>
state
를 사용해서 구현한다<Button type="primary" htmlType="submit" loading={false}>로그인</Button>
<Link href="/signup"><a><Button>회원가입</Button></a></Link>
const onChangeId = useCallback((e) => {
setId(e.target.value);
}, []);
이런식으로 사용<div style={{ marginTop: '10'}}>
컴포넌트 내에서 스타일적용 로그인폼이 따닥따닥 붙어있어서
<Input.Search enterButton style={{verticalAlign : 'middle'}}/>
이런식으로 준적도 있음그런데 위에처럼 div태그에 오브젝트로 style을 넣으면 안된다고 한다.
{} === {}
라고 치면 false라고 나오는데 리액트가 virtual DOM으로 어디가 달라졌는지 검사하다가 서로 다른 오브젝트라고 판단해서 다시 렌더링을 해버림(리액트의 경우 SPA로써 state가 이외의 곳은 변하지 않아야 하는게 핵심 장점)이때 styled-component를 사용함
import styled from 'styled-components';
const ButtonWrapper = styled,div`
margin-top: 10px;
`;
return (
<ButtonWrapper>
</ButtonWrapper>
)
import styled from 'styled-components';
const SearchInput = styled(Input.Search)`
vertical-align: middle;
`;
render(
<SearchInput enterButton/>
);
useMemo
를 사용한다import {useMemo} from 'react'
const style = useMemo(() => ({marginTop: 10}), []);
<div style={style}>//이런식으로 디자인 원하는 곳에 넣어줌
이렇게 하면 값이 캐싱되어서 리렌더링이 일어나지 않음[]
배열안이 바뀌지 않는 이상 다시 그리지 않음<Button>
태그에 `htmlType="submit"속성을 추가한다
Button태그를 감싸고 있는 Form
태그에 onFinish={onSubmitForm}
속성을 준다(여기서 onFinish는 e.preventDefault()
가 자동으로 내장돼있음
여기에서 Form태그는 antd에서 불러온 컴포넌트인데 antd에서 불러온 태그는 e.preventDefault()가 다 내장되어 있어서 추가적으로 쓰면 안됨
여기에서 setIsloggedIn은 props로 넘겨서 LoginForm파일로 전달하고
const LoginForm = ({setIsLoggedIn}) => {...
이렇게 인자로 받아드림
const onSubmitForm = useCallback(() => {
console.log(id, password);
setIsLoggedIn(true);
}, [id, password]);
그리고 onSubmitForm함수에서 버튼이 눌리면 setIsLoggedIn
이 true가 되게끔 만들어줌(로그인이 되었다는 신호를 주면서 가짜 로그인 구현)
이번에는 antd에 있는 card로 프로필을 구현
styled component 단점중 하나가 스타일이 적용된 컴포넌트가 기존 컴포넌트와 이름이 달라야 해서 변수명이 너무 많아진다.
'@ant-design/icons'
에서 가져와 쓰면됨-LoginForm페이지에서 propTypes를 구현해줌
#### 이제 form에서 계속 중복되는 코드들을 줄여보자
form안에 아래와 같은 코드들이 엄청나게 중복되는데 hooks파일내에
const onChangeId = useCallback((e) => {
setId(e.target.value);
}, []);
import { useState, useCallback } from 'react';
export default (initialValue = null) => {
const [value, setValue] = useState(initialValue);
const handler = useCallback((e) => {
setValue(e.target.value);
}, []);
return [value, handler];
}
const [id, setId] = useState('');
const onChangeId = useCallback((e) => {
setId(e.target.value);
}, []);
이랬던 코드를
const [id, onChangeId] = useInput('');
이렇게 바꿀 수 있다.
passWordCheck: 패스워드확인이 패스워드랑 같은지 체크해줌
passWordError: 패스워드확인의 상태의 기본값을 false로 해줬다가 같으면 true로 해줌
비밀번호같이 체크해줘야 하는것들은 폼에서도 체크하지만 제출할때 한번 더 체크해주는게 좋다. 더 나아가 서버쪽에서도 체크해주면 좋음.