React

[React] typescript 프로젝트에 webpack 적용하기

itaeiou 2022. 2. 10. 23:43
반응형

create-react-app 으로 만든 typescript 프로젝트에 webpack 적용하기

필요한 패키지 설치

npm i -D file-loader ts-loader
npm i -D webpack webpack-cli html-webpack-plugin webpack-dev-server
npm i -D babel-loader @babel/core @babel/preset-env @babel/preset-react
npm i -D typescript @babel/preset-typescript ts-loader fork-ts-checker-webpack-plugin
npm i -D rimraf

webpack 관련 패키지

  • webpack: Webpack(웹팩) 라이브러리
  • webpack-cli: Webpack(웹팩)을 명령어로 조작하기 위한 라이브러리
  • html-webpack-plugin: Webpack(웹팩)에서 HTML을 다루기 위한 플러그인
  • webpack-dev-server: Webpack(웹팩)으로 로컬에서 개발하기 위한 테스트 서버

babel 관련 패키지

  • babel-loader: Webpack(웹팩)에서 babel(바벨)을 다루기 위한 라이브러리
  • @babel/core: babel(바벨)로 컴파일하기 위한 라이브러리
  • @babel/preset-env: babel(바벨)로 컴파일시 어떤 타겟으로 지정할지 설정하는 라이브러리
  • @babel/preset-react: React(리액트)를 babel(바벨)로 컴파일하기 위한 라이브러리

typescript 관련 패키지

  • typescript: Typescript(타입스크립트) 필수 라이브러리
  • @babel/preset-typescript: babel(바벨)에서 Typescript(타입스크립트)를 빌드하기 위해 필료한 라이브러리
  • ts-loader: Webpack(웹팩)에서 Typescript(타입스크립트)를 컴파일 하기 위해 필요한 라이브러리
  • fork-ts-checker-webpack-plugin: ts-loader의 성능을 향상시키기 위한 라이브러리

os관련 패키지

  • rimraf: Mac과 윈도우즈에서 동일한 명령어로 폴더를 삭제하기 위한 라이브러리

 

webpack 설정하기

webpack.config.js 파일을 생성해 아래 내용을 작성합니다.

const path = require('path'); //절대경로를 참조하기 위해 path를 불러오기

const HtmlWebpackPlugin = require('html-webpack-plugin'); //웹팩에서 HTML을 다루기위한 플로그인을 불러오기

// Typescript(타입스크립트)를 빌드할 때 성능을 향상시키기 위한 플러그인를 불러오기
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');

module.exports = {
    // 번들 파일로 만들기 위한 시작 파일(entry)을 설정
    //생성될 번들 파일은 js 폴더 하위에 app.js라는 이름으로 생성
    //이 파일은 ./src/index.tsx를 시작으로 번들링(하나로 합치기)합니다.
    entry: {
        'js/app': ['./src/index.tsx'],
    },

    //생성된 번들 파일(bundle)은 ./build/ 폴더에 생성
    //publicPath를 지정함으로써 HTML등 다른 파일에서 생성된 번들을 참조할 때, /을 기준으로 참조
    output: {
        path: path.resolve(__dirname, 'build/'),
        publicPath: '/',
    },

    //React(리액트) 파일인 jsx와 js는 babel(바벨)을 이용하여 빌드
    module: {
        rules: [
            {
                test: /\.(ts|tsx)$/,
                exclude: /node_modules/,
                use: [
                    'babel-loader',
                    {
                        loader: 'ts-loader',
                        options: {
                            transpileOnly: true,
                        },
                    },
                ],
            }
        ],
    },

    //./src/index.html 파일을 build 경로에 index.html로 파일을 생성
    //파일을 생성할 때, Webpack(웹팩)이 만든 번들 파일(/js/app.js)를 HTML에 추가하여 생성
    plugins: [
        new HtmlWebpackPlugin({
            template: 'public/index.html',
            filename: 'index.html',
            favicon: 'public/favicon.ico'
        }),
        new ForkTsCheckerWebpackPlugin(),
    ],
    resolve: {
        modules: [path.resolve(__dirname, './src'), 'node_modules'],
        extensions: ['.ts', '.tsx', '.js', '.json', '.css'],
        alias: {
            src: path.resolve(__dirname, './src'),
            components: path.resolve(__dirname, './src/components')
        }
    }
};

 

tsconfig.json 설정하기

루트 디렉토리에 tsconfig.json 파일을 아래와 같이 수정합니다.

{
  "compilerOptions": {
    "target": "es6",
    "module": "esnext",
    "moduleResolution": "node",
    "noResolve": false,
    "noImplicitAny": false,
    "removeComments": false,
    "sourceMap": true,
    "allowJs": true,
    "jsx": "react",
    "allowSyntheticDefaultImports": true,
    "keyofStringsOnly": true,
    "baseUrl": ".",
    "paths": {
      "*": ["src/*"]
    }
  },
  "typeRoots": [
    "node_modules/@types",
    "src/@type"
  ],
  "exclude": [
    "node_modules",
    "build",
    "scripts",
    "acceptance-tests",
    "webpack",
    "jest",
    "src/setupTests.ts",
    "./node_modules/**/*"
  ],
  "include": [
    "./src/**/*",
    "@type"
  ]
}

아래 코드는 alias 설정을 위한 코드입니다.

alias에서 에러가 난다면 tsconfig.json에서 baseUrl과 paths 설정을 했는지 확인해보세요!

"baseUrl": ".",
"paths": {
    "*": ["src/*"]
}

 

babel 설정하기

루트 디렉토리에 .babelrc 파일을 생성하고 아래와 같이 작성합니다.

{
  "presets": [
    [
      "@babel/preset-env",
      { "targets": { "browsers": ["last 2 versions", ">= 5% in KR"] } }
    ],
    "@babel/react",
    "@babel/typescript" // Typescript(타입스크립트)가 컴파일 가능하도록 추가
  ]
}

 

package.json 실행명령어 수정하기

package.json에서 scripts를 아래와 같이 수정합니다.

 

  "scripts": {
    "start": "webpack serve --mode development --open",
    "prebuild": "rimraf build",
    "build": "webpack --progress --mode production"
  },
  • "start": "webpack server --mode development --open": npm start 또는 npm run start로 실행되는 스크립트입니다. Webpack(웹팩)의 개발 서버를 development 모드로 실행시킵니다. Webpack(웹팩)을 실행시킬 때는 항상 모드(development 또는 production)를 설정해야합니다. --open 옵션은 실행 후 바로 해당 페이지를 열어주기위해 사용합니다.
  • "prebuild": "rimraf build": npm run build로 build 스크립트를 실행하면 build 스크립트전에 이 스크립트가 실행됩니다. pre와 post로 스크립트 실행전, 실행후 실행시키고 싶은 스크립트를 실행시킬 수 있습니다. 저는 빌드후 생성되는 폴더를 지우고 다시 만들기 위해 사용하고 있습니다.
  • "build": "webpack --progress --mode production": npm run build로 실행되는 스크립트입니다. Webpack(웹팩)을 production 모드로 실행시켜 번들링(bundling)합니다. –progress은 빌드 진행 과정을 모니터링하기 위한 옵션입니다.

 

실행하기

npm start
npm run build

npm start 를 실행하면 브라우저에서 http://localhost:8080/이 오픈됩니다.

 

npm run build 로 지정된 폴더(build)에 프로젝트를 빌드할 수 있습니다. 

 

참고

설명을 너무 잘 정리해주셔서 쉽게 설정할 수 있었습니다.

아래 블로그도 꼭 한번 읽어보시길 바래요!

Webpack으로 React 프로젝트 만들어보기(❌CRA)

Webpack으로 만든 React 프로젝트에 Typescript 환경 설정하기(❌CRA)

Webpack, React, Typescript, Jest 환경에서 Alias 적용하기 (절대 경로 import)

반응형