ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [2019.07.11] React + TypeScript + Webpack 환경 설정
    개발 블로깅/React 개념 2019. 7. 11. 09:48

     

     

    React의 보일러 플레이트 CRA를 사용한 것이 아닌, 직접 웹팩 세팅에 TypeScript를 적용한 환경설정을 해보자.


    # 프로젝트 디렉토리 생성

    $ mkdir React_TypeScript
    $ cd React_TypeScript

    프로젝트로 사용할 디렉토리를 생성하고 해당 디렉토리로 이동한다.

    # packge.json 생성

    $ npm init -y

    해당 프로젝트의 디렉토리에 사용할 packge.json을 생성한다.

    # webpack 세팅

    $ npm i -D webpack webpack-cli

    프로젝트에 사용할 webpack을 개발용 패키지로 설치한다.

     

    $ touch webpack.config.js

    이후에 webpack 실행에 관한 설정을 하는 webpack.config.js 파일을 root 경로에 생성한다.

     

    webpack.config.js파일에 아래와 같이 입력한다.

    const path = require('path');
    module.exports = {
       entry: './src/index.tsx',
    output: {
         path: path.join(__dirname, '/dist'),
         filename: 'bundle.min.js'
      }
    }

     

    • entry : 연결되어 있는 각 파일 중, 제일 처음으로 시작되는 최상위 파일. 해당 최상위 파일부터 각 각 하위로 따라 내려가며 번들화 작업을 한다.
    • output: 번들화 된 파일을 export 할 경로와 파일명.

    위의 설정에는, 'src/index.tsx'의 파일이 running 시 동작되는 것 중 제일 처음으로 동작하는 최상위 파일이며, 해당 번들화 된 파일은 루트 경로의 '/dist/bundle.min.js'파일로 추출된다.

     

    # TypeScript 설치

    $ npm i typescript awesome-typescript-loader -D

    위 명령어를 보면 typescript 뿐 아니라, 'awesome-typescript-loader'라는 것을 함께 설치할 것을 알 수 있다.

    webpack은 일반적인 javascript 코드만 이해하므로, loader를 사용하면 다양한 유형의 파일을 발견하고 처리할 수 있다.

    Typescript파일 번들링 작업 모듈은 일반적으로 'ts-loader'와 'awesome-typescript-loader'가 있는데, 여기서는 'awesome-typescript-loader''를 쓰도록 하겠다.

     

    # tsconfig.json으로 typescript 사용 환경 설정하기

    root 경로에 tsconfig.json 파일을 하나 생성하고 아래와 같이 추가한다.

    {
      "compilerOptions": {
        "sourceMap": true,
        "noImplicitAny": false,
        "module": "commonjs",
        "target": "es6",
        "lib": [
          "es2015",
          "es2017",
          "dom"
        ],
        "removeComments": true,
        "allowSyntheticDefaultImports": false,
        "jsx": "react",
        "allowJs": true,
        "baseUrl": "./",
        "paths": {
          "components/*": [
            "src/components/*"
          ],
        }
      }
    }

     

    # webpack.config.js에서 모듈 설정하기 

    그럼 해당 모듈을 webpack.config.js에서 추가로 설정한다.

    const path = require('path');
    
    module.exports = {
      entry: './src/index.tsx',
      resolve: {
        extensions: ['.ts', '.tsx', '.js']
      },
      output: {
        path: path.join(__dirname, '/dist'),
        filename: 'bundle.min.js'
      },
      module: {
        rules: [
          { 
            test: /\.tsx?$/, 
            loader: 'awesome-typescript-loader'
          }
        ]
      }
    }

     

    # React 설치

    $ npm i react react-dom @types/react @types/react-dom

    설치한 모듈 중 react, react-dom 뿐 아니라, @types/react, @types/react-dom을 설치한 것을 알 수 있다.

    이는 typescript 방식으로 사용할 수 있도록 호환성을 제공해주는 모듈이다. 

     

    #간단한 react component 생성

    root경로에 src디렉토리를 하나 생성 후, 변수의 타입을 지정해 줄 수 있는 interface를 생성한다.

    '/src/PageInterface.ts'

    export default interface Page {
      color: string;
    }

     

    '/src/components/App.tsx'

    import * as React from 'react';
    
    import PageInterface from '../PageInterface';
    
    class App extends React.Component<PageInterface, {}> {
      render() {
        return (<div>
          <h1>Welcome to React with Typescript</h1>
          <p>The color of this page is: {this.props.color}</p>
        </div>
        );
      }
    }
    
    export default App;

     

    '/src/index.tsx'

    import * as React from 'react';
    import * as ReactDOM from 'react-dom';
    
    import App from './components/App';
    
    ReactDOM.render (
    <App color="Blue" />,
      document.getElementById("root")
    );

     

    'src/index.html'

    <!DOCTYPE html> 
    <html lang="en"> 
      <head> 
        <meta charset="UTF-8"> 
        <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
        <meta http-equiv="X-UA-Compatible" content="ie=edge"> 
        <title>TypeScript + React</title> 
      </head> 
      <body> 
        <div id="root"> 
    
        </div>
      </body>
    </html>

     

     

    # HTML Plugin 추가

    webpack의 번들링 작업이 끝난 후 나온 html파일이 자동으로 bundle.min.js파일을 참조하는 코드를 추가하도록 도와주는 플러그인을 설치한다.

    $ npm i html-webpack-plugin -D

     

    webpack.config.js 파일에 해당 플러그인 파일을 적용한다.

    const path = require('path');
    
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    
    module.exports = {
      entry: './src/index.tsx',
      resolve: {
        extensions: ['.ts', '.tsx', '.js']
      },
      output: {
        path: path.join(__dirname, '/dist'),
        filename: 'bundle.min.js'
      },
      module: {
        rules: [
          {
            test: /\.tsx?$/,
            loader: 'awesome-typescript-loader'
          }
        ]
      },
      plugins: [
        new HtmlWebpackPlugin({
          template: './src/index.html'
        })
      ]
    }

     

    # packge.json의 script 명령어 추가

    "scripts": { 
      "start": "webpack --mode development", 
      "build": "webpack --mode production" 
    }
    

    npm start로 실행시키게 되면, webpack 명령어에 의해 webpack.config.js파일에 설정한 방식대로 동작하게 되어, dist디렉토리 안에 번들링 된 파일이 추출된다.

     

    # typescript파일을 번들링 시키기

    $ npm start

    스크립트 명령어를 실행시킨다.

    그러면 번들링 작업이 실행되면서, 번들링 작업 후에 dist 디렉토리와 번들링된 파일이 생성된 것을 확인할 수 있다.

     

    # 개발용 환경 구축

    개발중이면 이러한 번들작업과 웹브라우저 실행을 일일이 하게되면 매우 귀찮다. 그래서 실시간 번들링 작업과 자동 새로고침이 되는 개발용 환경을 구축해보자.

    webpack 개발용 서버 모듈을 설치한다.

    npm i webpack-dev-server --D

     

    그리고 package.json의 스크립트 명령어를 아래와 같이 변경한다.

    "scripts": { 
      "start": "webpack-dev-server --mode development --open --hot", 
      "build": "webpack --mode production" 
    }

     

    npm start 명렁어에서, webpack 개발용 서버로 실행을 시킨다는 것을 알 수 있다.

    • --open : default로 브라우저를 열어주는 옵션
    • --hot : 개발 중 변경된 사항을 자동으로 번들링 작업
    반응형

    댓글

Designed by Tistory.