2021.04.17
npm init
= node module들을 관리하기 위한 package.json을 생성해 준다.npm install -D webpack webpack-cli
= webpack을 사용하기 위해 설치 (웹팩은 개발할 때만 사용되기 때문에 개발용으로 설치해 준다.)webpack.config.js
파일을 생성한다. (이름은 기본적으로 webpack.config.js
로 설정하고 다른 이름일 경우 따로 설정을 해줘야 한다.)npm install -D @babel/core @babel/preset-env @babel/preset-react babel-loader
: 바벨을 설치 해 준다. (jsx파일을 사용하기 위해서는 바벨이 필수적이다.)preset
이라 한다.JSX
코드를 React.CreateElement
호출 코드로 변환)const path = require('path'); //node가 설치되어 있으면 자동으로 설치된다. node에서 경로를 쉽게 조작할 수 있게 제공해주는 패키지
const webpack = require('webpack');
module.exports = {
name: 'service-setting', //어떤 서비스에 대한 웹팩 설정인지 이름 (만드는 서비스 이름을 넣어준다.) 필수요소는 아님!
mode: 'development', //mode를 작성 개발 : development, 실서비스 : production
devtool: 'eval', // 개발 : eval, 프로덕션 : hidden-source-map
resolve: {
extensions: ['.js', '.jsx', '.css'] //파일들의 확장자를 입력한다.
},
//entry, output 제일 중요
entry: {
app: './main', //합칠 파일들을 배열 형태로 입력한다.
}, //입력
module: {
rules: [{
test: /\.jsx?$/, //규칙을 적용할 파일들을 입력
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env', '@babel/preset-react'],
plugins: [], //따로 추가해야 하는 플러그인이 있을 경우 여기에 작성한다.
}, //babel의 옵션을 설정
}], //여러 개의 규칙을 지정할 수 있으므로 배열 형태로 작성한다.
},
plugins: [
new webpack.LoaderOptionsPlugin({ debug: true }),
], //추가적으로 하고 싶은 작업, 플러그인(확장프로그램)들을 전부 여기에 작성한다.
output: {
path: path.join(__dirname, 'dist'), // path.join()해주면 경로를 알아서 합쳐준다. __dirname : 현재 폴더의 경로를 담고있다.
filename: 'app.js', //출력 파일의 이름을 설정
publicPath: "/dist/",
}, //출력
//path : 실제 경로, publicPath : 가상의 경로(webpack-dev-server가 사용하는 결과물간의 상대 결로)
};
웹팩에서는 알아서 파일에서 불러오는 다른 파일을 인식하기 때문에 다른 파일에서 불러오는 파일을 entry에 입력하지 않아도 된다.
프로젝트의 규모가 커지면 entry에 js, jsx, css 등등 다양한 확장자를 가진 파일들이 들어간다. 그럴때 확장자를 입력하지 않고 resolve 속성을 사용한다.
웹팩 설정을 마치고 터미널에 webpack
명령어를 입력하면 알아서 실행된다.
" 'webpack'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다. " 이렇게 에러가 나는 경우
명령어로 등록을 해준다.
package.json 파일에 scripts로 등록해준다.
//package.json
"scripts": {
"dev": "webpack serve --env development"
}
npx webpack
입력
babel-loader
를 설정하는데 presets
에도 설정이 따로 있을 수 있다.
@babel/preset-env
는 자동으로 옛날 브라우저들을 지원해 준다. 하지만 옵션을 통해서 좀 더 구체적인 브라우저를 설정할 수 있다.
presets의 옵션을 추가해줄 경우 배열 형태로 작성, 첫 번째 인자로 presets 이름을 입력하고 두 번째 인자로 옵션을 입력
module : {
options: {
presets: [
['@babel/preset-env', {
targets: {
browsers: ['last 2 chrome versions'], //특정 브라우저만 설정
},
}],
'@babel/preset-react',
],
plugins: [],
},
},
참고링크에 browsers에 사용가능한 list들이 나와있다.
ex) > 5% in KR
: 한국에서 브라우저 점유율이 5%이상인 브라우저는 전부 지원한다는 의미이다.
npm install -D webpack-dev-server
: 개발용 서버 설치npm install react-refresh @pmmmwh/react-refresh-webpack-plugin -D
: 핫 리로딩시 필요한 플러그인//webpack.config.js
const RefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin');
module.exports = {
module : {
options: {
presets: [
['@babel/preset-env', {
targets: {
browsers: ['last 2 chrome versions'], //특정 브라우저만 설정
},
}],
'@babel/preset-react',
],
plugins: ["react-refresh/babel"], //babel-loader plugin에 추가해준다.
},
},
plugins: [
new RefreshWebpackPlugin()
],// plugins에 추가해준다.
//데브서버도 따로 설정해줘야 한다.
devServer: {
publicPath: '/dist/', //output의 publicPath를 그대로 입력
hot: true,
},
}
webpack-dev-server : webpack.config.js
파일의 설정대로 빌드한 결과물을 (publicPath에서 설정한 폴더) dist 폴더에 저장을 해둔다. index.html
을 실행하면 저장한 결과물을 제공해준다.
핫 리로딩 : 변경점을 강제한다. 즉, 소스코드에 변경점이 생기면 그 변경점을 기준으로 저장한 결과물을 수정한다.
핫 리로딩을 위해 설치한 react-refresh @pmmmwh/react-refresh-webpack-plugin
플러그인들을 설치하지 않아도 리로딩된다 생각할 수 있지만, 설치하지 않으면 그냥 리로딩이 되는 것이다.
리로딩과 핫 리로딩은 다른 것 이다.
리로딩은 단순한 새로고침이다. 새로고침은 할때 마다 기존 데이터가 다 날라간다.
반면 핫 리로딩은 기존 데이터를 유지하면서 화면을 바꿔주는 것이다.
npm install react react-dom
= react를 사용하기 위해 설치<!-- 기존(스크립트로 불러올 경우) -->
<html>
<head>
<meta charset="UTF-8" />
<title></title>
<!-- 주의: 사이트를 배포할 때는 "development.js"를 "production.min.js"로 대체하세요. -->
<script src="https://unpkg.com/react@17/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
//react 코드 작성
</script>
</body>
</html>
<html>
<head>
<meta charset="UTF-8" />
<title></title>
</head>
<body>
<div id="root"></div>
<script src="./dist/app.js"></script>
</body>
</html>
//react 패키지 설치해서 불러올 경우
//JSX 문법을 사용하는 경우 확장자를 .jsx로 한다.
const React = require('react');
const ReactDom = require('react-dom');