티스토리 뷰
웹팩에 대해 이해하기 위해 CRA를 사용하지 않고 설정을 해보았습니다
https://www.valentinog.com/blog/babel 을 의역한 글입니다. 오류가 있으면 알려주세요
React, webpack 및 Babel 설정 방법 : 목차
다음 내용을 다룹니다
- webpack 설치 및 구성 방법
- Babel 설치 및 구성 방법
- React 설치 방법
- 두 개의 React 구성 요소를 만드는 법 ( Container / Presentational )
- 번들을 HTML 페이지에 포함시키는 방법
- webpack dev 서버를 설치하고 구성하는 방법
1 2 3 4 | npm i webpack --save-dev //npm i -D webpack 으로 단축해도 됩니다 npm i webpack-cli --save-dev | cs |
packge.json 안에 webpack 명령 추가
1 2 3 | "scripts": { "build": "webpack --mode production" } | cs |
React, webpack 및 Babel 설정 방법 : Babel 설정
React 컴포너트는 대부분 ES6문법으로 작성됩니다. ES6는 많은 기능이 향상되었지만 오래된 브라우저에서는 이해 할 수없습니다. 예를 들면 class 키워드를 사용할 수 없습니다. state를 가지고 있는 컴포넌트는 클래스 문법을 사용합니다. ( hooks가 나오면서 지양하는 추세 인거 같습니다 ) 따라서 ES6 문법을 구형 브라우저에서도 작동을 시키려면 변환이 필요합니다
그리고 그 변환을 transpiling 이라고 합니다. Webpack만으로는 ES6 자바스크립트 문법을 ES5로 변환하지 못합니다. 이를 가능하게 하기 위해 loader를 사용합니다. loader에 무언가를 입력하면 다른 무언가로 바꾸어 줍니다.
babel-loader는 ES6 문법을 브라우저가 이해할 수 있도록 해주는 웹팩 로더입니다. 물론 babel-loader는 babel을 사용합니다.
1. babel preset env는 ES6문법을 ES5문법으로 컴파일 해줍니다. ( babel-preset-es2015는 현재 사용하지 않습니다 )
2. babel preset reacct는 JSX 등을 ES5로 컴파일 해줍니다
dependencies에 설치 해줍니다
1 | npm i @babel/core babel-loader @babel/preset-env @babel/preset-react --save-dev | cs |
.babelrc 파일을 생성합니다. Babel설정을 해주는 파일입니다
1 2 3 | { "presets": ["@babel/preset-env", "@babel/preset-react"] } | cs |
이제 최소한의 웹팩 설정을 할 준비가 되었습니다.
webpack.config.js 파일을 생성합니다
1 2 3 4 5 6 7 8 9 10 11 12 13 | module.exports = { module: { rules: [ { test: /\.(js|jsx)$/, exclude: /node_modules/, use: { loader: "babel-loader" } } ] } }; | cs |
설정은 간단합니다.
js 또는 jsx 확장자를 가진 모든 파일에 대해 webpack은 es6를 es5로 변환하기 위해 babel-loader를 통해 코드를 파이프 합니다.
React, webpack 및 Babel 설정 방법 : React Components 작성
*해당 부분은 원문에 비해 간략화 되어있습니다
React를 사용하기 위해 react와 react-dom을 npm으로 설치합니다
1 | npm i react react-dom | cs |
그 후에 src폴더 안에 component 폴더를 생성합니다
1 | mkdir -p src/component | cs |
해당 폴더안에 App.js 파일을 생성한 후 기본적인 컴포넌트 코딩을 합니다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | //src/component/App.js import React from 'react'; class App extends React.Component { constructor(){ super() } clickHandler(){ console.log('click') } render () { return ( <div> react webpack <button onClick={this.clickHandler}>button</button> </div> ) } } export default App; | cs |
src/index.js 파일을 생성합니다
1 2 3 4 5 | //src/index.js import App from "./component/App"; import React from "react"; import ReactDOM from "react-dom"; ReactDOM.render(<App />, document.querySelector("#app")); | cs |
React, webpack 및 Babel 설정 방법 : HTML webpack 플러그인
리액트를 나타내려면 HTML페이지를 만들어야 합니다. 스크립트 태그는 번들된 파일 안에 들어갑니다
webpack에서 HTML을 처리하려면 2가지 요소가 필요합니다 : html-webpack-plugin, html-loader
1 | npm i html-webpack-plugin html-loader --save-dev | cs |
webpack.config.js를 수정합니다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | const HtmlWebPackPlugin = require("html-webpack-plugin"); module.exports = { module: { rules: [ { test: /\.(js|jsx)$/, exclude: /node_modules/, use: { loader: "babel-loader" } }, { test: /\.html$/, use: [ { loader: "html-loader" } ] } ] }, plugins: [ new HtmlWebPackPlugin({ template: "./src/index.html", filename: "./index.html" }) ] }; | cs |
.src/index.html 파일을 생성합니다 ( 선호하는 css 라이브러리를 자유롭게 사용하세요)
1 2 3 4 5 6 7 8 9 10 11 12 13 | <!DOCTYPE html> <html lang = "en" > <head > <meta charset = "utf-8" > <link rel = "stylesheet" href = "https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" > <title > React, Webpack 및 Babel 설정 방법 </title> </head> <body> <div id="app"> </div> </body> </html> | cs |
이제 빌드를 실행하면 번들된 파일이 생성됩니다
1 | npm run build | cs |
빌드가 완료되면 ./dist 폴더가 생성되고 그 안에 HTML 파일이 생성됩니다.
번들된 js 파일은 ./dist 폴더 안에 main.js의 이름으로 생성되며 자동으로 html에 삽입이 됩니다.
./dist 폴더안의 index.html을 실행시키면 react로 코딩된 페이지를 볼 수 있습니다.
하지만 파일을 변경할 때 마다 빌드를 할 수 없으니 webpack dev 서버도 설치합니다
React, webpack 및 Babel 설정 방법 : webpack dev 서버
webpack dev 서버는 파일이 수정 후 저장되면 자동으로 브라우저 창을 새로고침 해주는 패키지 입니다
1 | npm i webpack-dev-server --save-dev | cs |
package.json 파일에 stripts를 추가합니다
1 2 3 4 | "scripts": { "start": "webpack-dev-server --mode development --open", "build": "webpack --mode production" } | cs |
이제 npm start 를 통해 webpack dev 서버를 실행하여 개발할 수 있습니다.
React, webpack 및 Babel 설정 방법 : Class 문법을 사용 할 때 Arrow Function 사용하기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import React from 'react'; class App extends React.Component { constructor(){ super() } //arrow function clickHandler=()=> { console.log('click') } render () { return ( <div> react webpack <button onClick={this.clickHandler}>button</button> </div> ) } } export default App; | cs |
이전의 설정만 하게 되면 클래스 문법안에서 arrow function을 사용할 경우 에러가 뜹니다. 해당 문법을 사용하기 위해선 플러그인 설치가 필요합니다
1 2 3 4 5 6 7 8 9 10 11 | npm i -D @babel/plugin-proposal-class-properties //.babelrc { "presets": [ "@babel/preset-env", "@babel/preset-react" ], "plugins": [ "@babel/plugin-proposal-class-properties" ] } | cs |
플러그인 설치후 .babelrc 파일에 추가해 주면 사용할 수 있습니다.
CRA를 사용하지 않고 웹팩 세팅을 해보았습니다. 다시 한번 정리하면서 번들과 바벨 웹팩에 대한 개념이 정리가 되었습니다.
오타나 오류가 있다면 알려주세요
'React' 카테고리의 다른 글
react ie 11 적용하기 ( feat.polyfill ) (0) | 2019.09.29 |
---|---|
하위 태그에 클릭 이벤트 해제 - currentTarget (0) | 2019.09.02 |
component lifecycle (0) | 2019.04.28 |
react 기초 (0) | 2019.03.31 |
react props, state Bloging (0) | 2019.02.26 |