mkdir react-example && cd react-example && yarn init -y
$ yarn add react, react-dom
$ yarn add -D webpack webpack-dev-server webpack-cli
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>React-Example</title>
</head>
<body>
<div id="root">Hello world:)</div>
<script src="../src/index.js"></script>
</body>
</html>
const innerTextOfRoot = document.getElementById('root').innerText;
alert(innerTextOfRoot);
이제 webpack으로 실행시켜봅시다.
시작 전에 package.json
에 scripts태그를 아래처럼 추가해줍니다.
{
...
"scripts" : {
"start": "npx webpack serve --mode development --port 3000",
},
...
}
그리고 아래처럼 root에서 명령 실행!
$ yarn start
콘솔에 찍힌 것처럼 http://localhost:3000/
로 들어가보면 아래처럼 프로젝트의 root가 나오는 것을 볼 수 있습니다.
우선은 webpack을 설치해서 server를 실행해보는 것까지 완료!
물론 html 파일에서 react, react-dom을 불러와서 스크립트를 모듈화하여 작성해나가는 방법도 있겠지만, create-react-app 에서 하는 방식처럼 해볼 예정입니다.
body 태그 안에 id값이 root인 div 엘리먼트만 남겨두고 다 지울 거에요.
이유는 웹팩에서 javascript 파일로 시작할 것이기 때문에 script 태그는 필요없기 때문!
<!DOCTYPE html>
<html lang="en">
...
<body>
<div id="root"></div>
</body>
</html>
import App from './App';
import React from 'react';
import ReactDOM from 'react-dom';
ReactDOM.render(<App />, document.getElementById('root'));
class를 통해서 컴포넌트를 만들어줍니다.
(물론 React 공식문서에는 class를 지양하라고 나오지만 여기에서는 우선 ES6+문법을 사용해서 예제를 진행해보겠습니다.)
import React from 'react';
class App extends React.Component {
render() {
return <div>Hello world :) </div>
}
}
export default App;
webpack에서 서버를 시작할 때 index.js에서 시작하고 싶기 때문에 이에 관련하여 간단한 설정을 해볼 것입니다.
웹팩 설정파일은 commonJS로 작성하는데, 기본적으로 객체를 넘겨주는 형태입니다.
그 안에 webpack에서 필요한 key 값을 아래처럼 정해놨습니다.
더 자세하게 알고 싶다면 Webpack 공식 홈페이지 참고
entry
: 시작점 지정 (웹팩이 내부적으로 dependency 그래프를 만들 때의 시작점 파일)output
: 빌드되어 나오는 결과물이 return되는 곳module
: javascript 이외의 자원들을 javascript에 가져다 쓸 수 있도록 loader를 load 해주는 곳plugins
지금은 우선적으로 index.js 로 Webpack 서버를 시작하고 싶다는 목표가 있으므로 아래처럼 간단하게 설정 해볼 것입니다.
module.exports = {
entry: {
app: './src/index.js'
}
}
그리고 실행했는데 아래처럼 에러가 나오네요...
ERROR in ./src/index.js 5:16
Module parse failed: Unexpected token (5:16)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
| import ReactDOM from 'react-dom';
|
> ReactDOM.render(<App />, document.getElementById('root'));
|
우선, commonJS만을 읽을 수 있는 웹팩으로서는 아래처럼 생각할 수 있을 것입니다.
babel
📌우선 패키지부터 설치해야합니다.
$ yarn add -D @babel/core @babel/preset-env @babel/preset-react babel-loader
그리고 babel 이랑 의사소통할 수 있는 파일인 .babelrc
을 root에 만들어줍니다.
{
"presets": [
"@babel/preset-env",
"@babel/preset-react"
]
}
이해가 안된다면 아래처럼 생각해보면 되요!
"@babel/preset-env"
안에 모든 babel 플러그인 설정들이 있으니 다 사용하게 해줘! 그리고"@babel/preset-react"
도 추가해뒀는데 react에서 사용하는 jsx 코드도 인식하게 해줘!
이제 webpack이 babel을 인식할 수 있도록 loader에 babel-loader
를 추가해줘야합니다.
module.exports = {
entry: {
app: './src/index.js'
},
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: 'babel-loader'
}
]
},
resolve: {
extensions: ['.js', '.jsx']
},
}
/node_modules
은 제외하고 loading 해줘! 말해주는 곳이렇게 하고 yarn start
하면 원하는대로 나오지 않는다. 그 이유는 바로 html 파일을 로딩할 수 있게 해주는 플러그인을 설치하지 않았기때문!
yarn add -D html-webpack-plugin
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const srcDir = path.resolve(__dirname, './src');
const publicDir = path.resolve(__dirname, './public');
module.exports = {
...,
plugins: [
new HtmlWebpackPlugin({
template: publicDir + '/index.html',
filename: './index.html'
}),
]
};
그리고 실행해보기
$ yarn start
드디어 원하는 모습대로 나왔다~~!
👏👏👏👏👏 여기까지 개발서버 구축하는 것 완료했습니다.
다음 포스트는 typescript, 상대경로 설정하는 부분을 다루겠습니다.
전체 코드는 react-boilerplate-webpack-babel 에서 볼 수 있습니다.