정보가 많아짐에 따라 서버에서 그려서 뷰를 보여주던 기존의 방식이 속도가 느린 문제가 있었음
이를 해소하기 위해 캐싱과 압축을 하여 제공하기도 함
하지만 인터렉션이 많은 모던 웹 앱에선 충분하지 못 할 수도 있음
렌더링을 서버에서 담당 : 서버자원 사용, 불필요한 트래픽 낭비
SPA는 하나의 화면만 있는게 아님
화면에 따라 주소도 만들어 줘야 함 : 라우팅
리액트는 라우팅이 내장되어 있지 않아서 직접 브라우저의 PI를 사용하고 상태를 설정하여 다른 뷰를 보여줘야 함
react-router : 써드 파티 라이브러리
앱의 규모가 커지면 자바스크립트 파일 사이즈가 너무 커짐
유저가 실제로 방문하지 않을 수도 있는 페이지에 관련된 렌더링 관련 스크립트도 불러오기 때문
{
"compilerOptions": {
"baseUrl": "src"
},
"includes": ["src"]
}
라우터 경로 설정 방법 1. Switch 이용(react-router-dom)
<div>
<Route exact path="/" component={Home}/>
<Switch>
<Route path="/about/:name" component={About}/>
<Route path="/about" component={About}/>
</Switch>
</div>
라우터 경로 설정 방법 2. 물음표 기호 붙이기
<div>
<Route exact path="/" component={Home}/>
<Route path="/about/:name?" component={About} />
</div>
URL 쿼리 가져오기
앱 내부 페이지를 이동하는데 일반적인 <a href="https://anyURL.com"></a>
형식으로 만들면 새로고침 됨
import { Link } from 'react-router-dom';
<Link to="/about">About</Link>
와 같이 Link를 사용
설정한 URL이 활성화가 되면, 특정 스타일 혹은 클래스를 지정 가능
Router처럼 NavLink도 exact를 속성값으로 붙여 줘야 함
<NavLink exact to="/about" activeStyle={activeStyle}>About</NavLink>
// 클래스로 설정하고 싶다면 activeStyle 대신 activeClassName 을 설정
// router
<Route exact path="/" component={Home} />
<Switch>
<Route exact path="/about/:name" component={About} />
<Route exact path="/about" component={About} />
<Route exact path="/posts" component={Posts} />
<Route exact path="/posts/:id" component={Posts} />
</Switch>
// 라우트 속 라우트 (Posts.js)
<div>
<h2>Post List</h2>
<ul>
<Link to="/posts/1">Post #1</Link>
<Link to="/posts/2">Post #2</Link>
<Link to="/posts/3">Post #3</Link>
<Link to="/posts/4">Post #4</Link>
</ul>
<Route
exact
path={match.url}
render={() => <h3>Please select any post</h3>}
/>
<Route path="/posts/:id" component={Post} />
</div>
웬만하면 exact를 라우터에 붙이고 모든 경로를 다 써주고
설정안한건 404로 빼는게 낫겠다.
라우트가 아닌 컴포넌트에서 라우터에서 사용하는 객체 - location, match, history를 사용하려면 withRouter라는 HoC를 사용
1. 사용하는걸로 test
2. 빼고 hooks(useLocation)로 test
둘다 정상 동작
새삼 next.js에서 라우터를 다 잡아주는게 정말 편하다는 걸 느꼈다.
SPA의 단점 중 하나는 사용하지 않을 수 있는 페이지의 자바스크립트까지 한꺼번에 번들링하여 초기 로딩속도가 느릴 수 있다는 점이다.
코드 스플리팅으로 번들파일을 여러개의 파일로 분리 시킬 수 있다.
코드 스플리팅의 원리 : 한개의 파일에서 모든걸 불러오는게 아닌, 우리가 설정하는 대로, 라이브러리나 컴포넌트가 실제로 필요해질 때, 나중에 불러오는 것
npm run eject
eject 하려는데 fail이 되었다.
This git repository has untracked files or uncommitted changes:
src/App.js
M src/pages/Posts.js
M src/pages/index.js
jsconfig.json
Remove untracked files, stash or commit any changes, and try again.
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! react-router-tutorial@0.1.0 eject: `react-scripts eject`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the react-router-tutorial@0.1.0 eject script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! C:\Users\TVCF\AppData\Roaming\npm-cache\_logs\2021-07-26T00_44_35_572Z-debug.log
This git repository has untracked files or uncommitted changes:
git을 commit을 하지 않은 파일들이 존재할 때 뜨는 에러이다.
commit, push를 한 뒤엔 정상적으로 eject가 된다.
vendor : 공급업체
코드 스플리팅을 하려면 Vendor 설정을 해줘야 함
프로젝트 전역적으로 사용되는 라이브러리 분리 : Vendor 파일
webpack.config.dev.js 파일이 존재 하지 않음
일단 벨로퍼트님이 2017년에 정리한 글을 계속 따라가며 읽어보고
현재 코드스플리팅 방식이 바뀌었다면 어떻게 바뀌었는지
또 next js에서 하는 방식과 CRA에서 하는 방식은 어떻게 다른지 알아보자.
청크(chunk) : 코드를 비동기적으로 불러오면 웹팩에서 처리하면서 코드를 분리
비동기적으로 파일을 불러오기 위해, import를 최상단에 사용하는 것이 아니라, 특정 함수에서 불러오도록 작성(dynamic import)
코드 스플리팅을 할 때마다 상태관리를 해주긴 번거로움
웹팩 설정하는 방법은 따로 공부해야겠다.
eject 시 webpack.config.dev.js, webpack.config.prod.js 파일이 생성이 안되고
webpack.config.js 만 생성 됨