create-react-app 없이 React + Typescript 개발 환경 세팅하기

PeaceSong·2021년 10월 3일
0

0. Intro

"생각보다 create-react-app 없이 리액트 프로젝트를 못 만드시는 분이 많더라구요 "

우리 팀 시니어분이 화상 회의에서 지나가는 말로 위와 같은 말을 하셨던 기억이 있다. 엥? 그거 전데요?
그래서 대학생 때 했었던 Booksbridge 프로젝트를 심심해서 리팩토링하는 프로젝트를 진행해보려는 김에 create-react-app 없이 바닥부터 개발 환경을 세팅해보기로 했다.

1. package manager

node 패키지를 관리하는 도구는 크게 npmyarn이 있다. yarn이 조금 더 빠르고 안정적이라고 하는데, 여기서는 일단 npm을 사용했다.

새 디렉토리를 만들고 npm init 명령어로 해당 디렉토리를 node 프로젝트 패키지로 만들 수 있다.
npm init을 실행하면 package name, version, git repo 등 해당 프로젝트의 여러 기본 정보를 설정할 수 있는데, 어차피 나중에라도 수정할 수 있으므로 자유롭게 기입한다.

만약 모두 기본값으로 설정하고 싶다면 npm init -y를 사용하면 된다.

2. typescript

타입이 없는 언어는 근본이 없는 언어이다.

내가 늘 하는 소리이다 (아마도 농담임). typescript는 근본 없는 javascript에 근본을 부여한다. 프로젝트에 근본을 불어넣기 위해서, typescript 모듈을 설치하자.

npm install -D typescript

이제 package.jsondevDependencies에 타입스크립트가 추가되었다!

"devDependencies": {
  "typescript": "^4.4.3" 
}

해당 프로젝트 내에서 타입스크립트의 설정을 셋업하기 위해 tsconfig.json 파일을 만들어보자. 이 파일도 처음부터 만들 수 있지만, 그건 너무 귀찮으니 tsc --init 명령어로 tsconfig.json을 자동으로 생성하자.

tsconfig.json 파일의 각 엔트리가 의미하는 바는 옛날에 내 레포에 정리해뒀으니 참고하면 되겠다.

3. webpack

webpack의 주 목적은 js뿐만 아니라 css나 이미지 등 여러 자원(모듈)들을 번들링하여 브라우저에게 제공하는 것이다. 프로젝트에서 웹팩을 사용하기 위해 다음 명령어를 사용하자.

npm install -D webpack webpack-cli webpack-dev-server html-webpack-plugin ts-loader

웹팩을 제대로 실행하기 위해서 webpack.config.js 파일을 새로 만들어 설정해야 한다. 다음과 같이 설정하자.

const HtmlWebpackPlugin = require('html-webpack-plugin');
const path = require('path');

module.exports = {
  // src/index.tsx` 파일을 진입점으로 설정
  entry: path.resolve(__dirname, 'src/index.tsx'),
  resolve: {
    alias: {
      '@booksbridge': path.resolve(__dirname, 'src')
    }
  },
  module: {
    rules: [
      {
        // .ts, .tsx 파일들을 ts-loader를 이용해 컴파일하여 번들링
        test: /\.(ts|tsx)$/,
        exclude: /node_modules/,
        resolve: {
          extensions: ['.ts', '.tsx', '.js', '.json'],
        },
        use: 'ts-loader',
      }
    ]
  },
  devServer: {
    historyApiFallback: true // SPA를 위한 설정
  },
  plugins: [
    // index.html`에 번들링된 스크립트 파일과 스타일이 자동으로 연결
    new HtmlWebpackPlugin({ 
      template: 'index.html'
    }),
  ]
};

resolvealias 설정을 한 이유는, 파일에서 상대경로로 참조하지 않고 절대경로로 더 간편하게 참조하도록 하기 위해서이다.

상대경로 참조

import SomeComponent from '../../../components/SomeComponent'

절대경로 참조

import SomeComponent from '@booksbridge/components/SomeComponent'

웹팩 설정을 끝마쳤으므로, package.json에서 스크립트 설정을 해줄 수 있게 되었다.

"scripts": {
  "start": "webpack serve --port 3000",
  "build": "webpack"
}

프로젝트 설정 완료 후 npm startnpm build처럼 실행할 수 있을 것이다.

4. index.html

루트 디렉토리에 index.html 파일을 생성해주자. 아래 내용을 쓸 것이다.

<!DOCTYPE html>
<html>
<head lang="en">
  <title>Booksbridge</title>
</html>
<body>
  <div id="app-root"></div>
</body>

5. react

애초에 리액트 프로젝트를 하기로 했으니 리액트를 설치해야 한다.

npm install -S react react-dom

그런데 나는 이 프로젝트를 타입스크립트로 진행하기로 했다. 따라서 reactreact-dom의 타입 정보도 같이 가져와야 한다.

npm install -S @types/react @types/react-dom

6. 디렉토리 설정

위에서 src/index.tsxindex.html에 대해 설정을 해주었으니, 당연히 이 경로에 파일들을 만들어주어야 한다.
아래와 같은 디렉토리 구조가 될 것이다.

/booksbridge
  └src
    └index.tsx
  └index.html
  └package-lock.json
  └package.json
  └tsconfig.json
  └webpack.config.js
  └.gitignore
└node_modules

7. CSS

css 파일을 번들링하여 최종 결과물에 포함시키기 위해서는 css loader도 설정해야 한다.

npm install style-loader css-loader 

그런데 요즘 핫한 sass도 쓰고 싶어졌다.

npm install sass sass-loader node-sass

css loader를 받았으니, webpack.config.js에 설정값을 넣어주어야 한다. loader를 사용하기 위해 module.rules에 다음과 같은 설정을 덧붙여주자.

module: {
  rules: [
    ...({/*typescript loader 설정값*/}),
    {
      test: /\.s[ac]ss$/i, // .scss, .sass파일에 적용하는 규칙
      use: [
        'style-loader',
        'css-loader',
        'sass-loader'
      ]
    }
  ]
}

8. 리액트 진입점 설정

이제 모든 것이 준비되었고, 프로젝트를 시작하면 된다. 가장 기초적인 리액트 컴포넌트를 로드하도록 설정하자.
src/ 디렉토리 밑에 App.tsx 파일을 생성하자.

// src/App.tsx
import React, { FC } from 'react'

const App: FC = () => {
  return (
    <div>
      {'Hello, World!'}
    </div>
  )
}

export default App

App 컴포넌트를 index.tsx에서 불러와서 렌더해주자.

// src/index.tsx
import React from 'react'
import ReactDOM from 'react-dom'

import App from '@booksbridge/App'

ReactDOM.render(
  <App />,
  document.getElementById('app-root')
)

이제 yarn start 명령어로 로컬서버를 띄우고 localhost:3000으로 접속하면 Hello, World!가 보일 것이다!

tmi

사람들이 하도 오타를 내서 npm installnpm isntall로 써서인지, npm isntallnpm install과 똑같이 동작하도록 되어있다. 정말 자비로우십니다 선생님.

profile
127.0.0.1

0개의 댓글

관련 채용 정보