Deployment steps
- Test code
- Optimize code
- Lazy loading
- Build app for production
- building app doesn't mean we have to write more codes.
- 이미 작성되어있는 특정 script를 실행하는 것이다.
- => production을 위한 코드(자동으로 최적화되고 압축된 코드)를 반환한다.
- Upload code to server
- 3에서 만들어진 코드 패키지를 업로드한다.
- Configure Server
Optimize
what is lazy loading?
코드를 최적화하는 방법은 여러 가지가 있다. 예를 들어, props이 변경되었을 때에만 컴포넌트를 재평가하는 React.memo도 최적화의 한 방법이 된다. Lazy loading도 이런 최적화 방법 중 하나이다.
+) 최적화가 최고의 코드를 작성하는 것을 의미하는 것은 아니다.
- Lazy loading | 어떤 코드가 필요할 때에만 해당 코드를 load한다.
- 사용자가 SPA에 방문하면, 모든 JS 코드를 하나로 묶은 번들을 한 번에 다운로드한다.
- 이 코드 번들을 가능한 작게 만들어야 한다.
- => 예를 들어, 사용자가 어플리케이션의 특정 페이지에 방문했을 때에만 보여지는 컴포넌트에 대한 코드는, 처음부터 다운 받을 필요가 없다.
- 여러 Route를 사용하고 있을 때, Route 별로 코드를 분리해서 쉽게 lazy loading을 이용할 수 있다.
- 보통 App.js 에서 모든 route를 정의하고, 해당 route에서 렌더링할 컴포넌트를 import한다.
- 즉, 모든 컴포넌트를 app에 import 하게 된다.
- => 최적화 없이 앱을 실행하면 모든 component 파일이 최초의 번들 코드에 포함된다.
how to use lazy loading?
import React, { Suspense } from 'react';
import { Route, Routes } from 'react-router-dom';
import LoginPage from './pages/login/login';
// import MainPage from './pages/main/main';
const MainPage = React.lazy(() => import( './pages/main/main'));
function App() {
return (
<Suspense fallback={<p>loading...</p>}>
<Routes>
<Route path="*" element={<LoginPage />} />
<Route path="/main" element={<MainPage />} />
</Routes>
</Suspense>
);
}
- dynamic import | 해당 스크립트를 필요로 할 때 import 한다. => 필요할 때에 새로운 js를 요청한다.
- React.lazy( () => import( 'path' ) )
- 인자로 함수를 전달받는다.
- import 함수를 실행한다.
- 대부분의 사용자가 방문할 페이지를 lazy loading할 필요는 없다.
- Suspense | fallback UI(대체 UI)
- route에 방문했을 때, 즉 해당 컴포넌트가 필요할 때에 코드를 다운로드 한다.
- 다운로드가 완료 되기 전까지는 컴포넌트를 렌더링할 수 없기 때문에 에러가 발생한다. => 대체 ui를 정의해야 한다.
Building app for production
// package.json
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
}
- npm start | app을 개발하기 위한 스크립트를 실행한다.
- $ npm start
- 우리가 작성하는 코드가 브라우저에서 동작하도록 코드를 변환(not optimize)한다.
- local server를 가동한다.
- npm build | app을 배포하기 위해 사용하는 스크립트를 실행한다.
- $ npm run build
- 스크립트는 프로젝트 폴더에 build라는 폴더를 생성하고, 여기에 우리가 작성한 코드를 최소화/최적화한 파일을 위치시킨다.
- 서버를 가동하지는 않는다.
- 해당 스크립트를 실행할 때마다, build 폴더를 덮어쓴다.
- 따라서 build 폴더에서 작업하는 것이 아니라, 이전처럼 src 폴더에서 작업한다.
Upload code to real Server | firebase로 배포하기
statis website & hosting service provider
- SPA is a static web site
- 리액트 어플리케이션 뿐만 아니라 모든 SPA는 static website이다.
- 즉, HTML, CSS, JS 파일(browser side)로만 구성되며, 서버 측의 코드(ex. node.js, PHP...)는 포함되어 있지 않다.
- 이러한 SPA를 배포하고 싶다면 static website hosting provider가 필요하며, firebase hosting service는 이런 provider 중 하나이다.
- SPA를 배포할 때, 서버 측 코드를 hosting 하는 서비스는 필요하지 않다.
firebase deployment steps
- firebase 콘솔에서 배포할 프로젝트를 선택하고, build 메뉴에서 hosting 서비스를 클릭 > get started 클릭한다.
- $ npm install -g firebase-tools
- firebase hosting을 이용하려면 firebase-tools이 설치되어 있어야 한다.
- $ firebase tools --version 명령어를 이용하면, firebase tools이 이미 설치되어있는지 확인해 볼 수 있다.
- $ firebase login | firebase 로그인, 브라우저 또는 커맨드에서 로그인할 수 있다.
- $ firebase init
- 터미널에서 해당 명령어를 이용할 때에는, 프로젝트의 가장 상위 레벨에 위치해 있어야 한다.
- 터미널에 해당 명령어를 입력하면, 다음과 같이 몇가지 질문에 옵션을 선택해야 한다.
- Which firebase CLI feature do you want to set up for this folder? | hosting 선택(스페이스 바) 후 엔터
- let's associate this project directory with a Firebase project | 현재 폴더를 firebase 콘솔의 프로젝트와 연결할 것인지 묻는 질문으로, Use an existing project 옵션을 선택한다.
- what do you want to use as your public directory?
- deploy할 폴더가 무엇인지를 묻는 질문으로, 기본값은 public 폴더이다.
- cra의 npm run build 명령어를 입력하면 production 코드가 build 폴더 내에 생성되므로, build 폴더로 직접 지정(입력)해 주어야 한다.
- Configure as a single-page-app(re-write all urls to index.html)?
- 모든 url을 index.html에 덮어 쓰겠냐는 질문으로, y/N => y 옵션을 선택한다.
- 사용자가 어떤 URL로 요청하는지에 상관 없이, 서버가 항상 같은 응답(html, css, js)을 하게 된다.
- => 이런 과정을 "configure server(서버 구성)" 단계로 분리할 수 있으며, 호스팅 서비스가 무엇인지에 따라 그 방법은 다를 수 있다.
- set up automatic builds and deploys with Github? | n
- File build/index.html alreay exists. Overwrite? | n, npm run build 명령어에 의해 생성된 index.html을 그대로 이용한다.
- $ firebase deploy
- 4 단계에서 모든 배포 설정이 완료되면, deploy 명령어를 이용해 어플리케이션을 배포할 수 있다.
- $ firebase hosting:disable | hosting을 종료할 수 있다.
'Study > React' 카테고리의 다른 글
컴포넌트 설계에 대해 궁금한 점 (0) | 2022.10.09 |
---|---|
react-firebase | authentication (0) | 2022.08.16 |
Validation (0) | 2022.06.27 |
custom Hooks (0) | 2022.06.24 |
HTTP Request (0) | 2022.06.23 |