에디터 설정
- VSCode 에디터
기본 브라우저 설정
- 크롬 브라우저
모듈 번들러란?
- 웹 개발에 필요한 자원 (HTML, CSS, JS, Image 등등 ) 을 모두 각각의 모듈로 보고, 이를 조합해서 병합된 하나의 결과물을 만들어주는 도구
웹팩 (WebPack) 이란?
- 최신 프론트엔드 프레임워크에서 가장 많이 사용되는 모듈 번들러
- 최종 배포용 파일을 만들어줌
- <script> 태그가 여러개 있을 때 순서보장도 중요하기 때문에 이런 것도 WebPack이 해준다.
- 사용 이유에 대해서는 참고
웹팩 설치 방법
- 새로운 폴더를 생성한다
- 폴더에서 터미널을 열어 아래의 코드를 입력해 package.json 을 초기화해준다.
npm init -y
- package.json 파일이 생성된 것을 확인한다.
- 아래의 코드를 터미널에 입력해 웹팩을 설치해준다.
npm i -D webpack webpack-cli webpack-dev-server
-
- 만약에, package.json 에서 업데이트 된 버전을 다시 설치하고 싶다면?
- 버전을 다르게 설치하고 싶은 패키지의 키 값에 수정 버전을 입력한다.
- 터미널에 npm i 를 입력해주면 수정된 버전으로 다시 설치가 된다.
- -D 를 입력하는 이유?
- devDependencies 라는 의미
- 로컬 개발이나, 테스트를 위한 패키지를 뜻함.
- 만약에, package.json 에서 업데이트 된 버전을 다시 설치하고 싶다면?
웹팩 사용 방법
- src 폴더를 만들어준다.
- src 폴더 안에 구성
- css 폴더 / style.css
- js 폴더 / index.js
- src 폴더 안에 구성
- package.json 이 있는 폴더에 webpack.config.js 파일을 생성해준다.
- 파일 내에 아래 코드를 작성해준다.
const path = require("path");
module.exports = {
entry : "./src/js/index.js",
output : {
filename : "bundle.js",
path: path.resolve(__dirname, "./dist"),
clean : true
},
devtool : "source-map",
mode : "development",
}
- entry 속성이란?
- 자바스크립트 파일의 진입점
- output 속성에 대해
- 웹팩을 돌리고 난 결과물의 파일 경로
- output 속성 옵션 형태
- filename 은 최소한으로 지정해줘야하며, 코드와 같이 path 속성과 함께 정의합니다.
- filename : 웹팩으로 빌드한 파일의 이름
- path : 해당 파일의 경로
- path.resolve() : 인자로 넘어온 경로들을 조합하여 유효한 파일 경로를 만들어준 Node.js API
- 웹팩은 상대경로를 찾을 수 없어서, path 라는 모듈을 불러와서, resolve 라는 메소드를 require 해준다.
- 그리고 __dirname 을 적어서 상대경로를 찾을 수 있도록 해줌.
- clean : 생성될 파일 경로에 이미 같은 파일이 있다면, 지우고 새로 만들어줌
- filename 은 최소한으로 지정해줘야하며, 코드와 같이 path 속성과 함께 정의합니다.
- devtool : "source-map" ?
- 빌드한 파일과 원본 파일을 빌드업 해주는 속성
- mode
- 기본으로 production , development 값이 있음.
- production : 배포 모드 (기본 값)
- development : 개발 모드
- 기본으로 production , development 값이 있음.
웹팩의 추가적인 압축 플러그인 설치
- 아래의 코드를 터미널에 입력해 플러그인을 설치해준다.
npm i -D terser-webpack-plugin
- 설치한 플러그인을 webpack.config.js 에 불러와준다.
const TerserWebpackPlugin = require('terser-webpack-plugin');
- 아래의 코드를 작성해준다.
const path = require("path");
const TerserWebpackPlugin = require('terser-webpack-plugin');
module.exports = {
entry : "./src/js/index.js",
output : {
filename : "bundle.js",
path: path.resolve(__dirname, "./dist"),
clean : true
},
devtool : "source-map",
mode : "development",
optimization : { // 추가된 코드
minimizer: [
new TerserWebpackPlugin()
]
}
}
*optimization Minimizer
- Bundle 파일을 압축하는 것
- TerserPlugin을 이용한 압축방식이기 때문에, minimize를 설정을 위해서는 terser-webpack-plugin 모듈을 install 해야한다.
하지만, Webpack5부터는 해당 Plugin이 내장 지원이 되므로, 이를 생략할 수 있다.
- 아래의 코드를 터미널에서 입력하면, 설정한 코드의 파일들이 생성 된 것을 확인해볼 수 있다.
npx webpack
* browser 에 관한 오류나 여러 오류가 나오신다면 저장을 했는지 확인해보기
완성 모습
HTML 과 CSS 를 설정해줄 모듈 설치
- index.html 파일을 생성
- html 기본 세팅을 완료한 뒤 , 터미널에 아래의 코드를 입력해 모듈을 설치해준다.
npm i -D html-webpack-plugin
- webpack.config.js 파일로 가서, plugin 아래와 같이 설치한 내용을 추가해준다.
const HtmlWebpackPlugin = require('html-webpack-plugin');
plugins : [
new HtmlWebpackPlugin({
title: "Virtual-Keyboard",
template : "./index.html",
inject : "body",
favicon : "./favicon.ico"
})
]
HtmlWebpackPlugin 의 기본 설정
1. title : 웹 페이지의 타이틀 제목 설정
2. template : 빌드를 할 때 text 를 무엇으로 사용할 것인지
3. inject : 빌드를 해줄 때 js 파일을 어디에 넣어줄 것인지
4. favicon : 같은 경로에 있는 favicon.ico 파일을 사용할 것임. (수정할 때 파일만 바꿔주면 됨) (파일명 수정 가능)
* html-webpack-plugin 의 template 을 index.html 로 사용할 경우
- index.html 안에서 lodash 라는 문법을 사용할 수 있게 해줌.
* Lodash 란?
- 유틸 성 메소드나, 템플릿 관련 메소드 등을 제공해주는 라이브러리
- index.html 파일로 가서 아래와 같이 title 태그에 Lodash 문법을 사용해준다.
<title>
<%= htmlWebpackPlugin.options.title %>
</title>
CSS 와 관련된 모듈 설치
npm i -D mini-css-extract-plugin css-loader css-minimizer css-minimizer-webpack-plugin
- mini-css-extract-plugin 을 webpack.config.js 파일에 추가해준다. (윗 방법과 동일)
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
plugins : [
new HtmlWebpackPlugin({
title: "Virtual-Keyboard",
template : "./index.html",
inject : "body",
favicon : "./favicon.ico"
}),
new MiniCssExtractPlugin({
filename : "style.css"
}) // 추가된 코드
]
- index.js 로 가서 css 파일을 import 해준다.
import "../css/style.css"
모듈 설정
- css 파일을 css 플러그인에 있는 loader 를 사용해, loader 하겠다는 의미로 쓰기 위해 설정
- plugin 작성한 것 밑에 작성해준다.
,
module:{
rules: [
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, "css-loader"]
}
]
}
CSS 를 압축해주는 설정 (css-minimizer-webpack-plugin)
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
optimization : {
minimizer: [
new TerserWebpackPlugin(),
new CssMinimizerPlugin() // 추가된 코드
]
}
build 하기
- package.json 의 scripts 에 build 를 추가해준다.
- mode=production 을 추가한 이유
- 모드를 배포 모드로 함으로써, 불필요한 코드를 줄여 최적화 시켜주는 역할을 해줌.
- mode=production 을 추가한 이유
"scripts": {
"build" : "webpack --mode=production"
},
- 터미널에 아래와 같은 코드를 입력해 , build 를 해준다.
npm run build
- build 완료 된 모습
webpack-dev-server 사용하기
* webpack-dev-server 란?
- 빠른 실시간 리로드 기능을 갖춘 개발 서버
- 디스크에 저장되지 않은 메모리 컴파일을 사용하기 때문에 컴파일 속도가 빨라짐
- webpack.config.js 에도 devServer 옵션을 통해 옵션을 지정하여 사용 가능
* webpack-dev-server 의 동작 원리
- 서버 실행 시 소스 파일들을 번들링하여 메모리에 저장소스 파일을 감시
- 소스 파일이 변경되면 변경된 모듈만 새로 번들링
- 변경된 모듈 정보를 브라우저에 전송
- 브라우저는 변경을 인지하고 새로고침되어 변경사항이 반영된 페이지를 로드
- webpack-config.js 파일에서 아래와 같은 코드를 추가해준다. (위치는 아무곳 상관 없음)
devServer : {
host : "localhost",
port: 8080,
open: true,
watchFiles: "index.html"
},
open 속성
- devserver 를 사용할 때마다 창을 새로 열어달라고 하는 속성
watchFiles 속성
- 설정된 파일이 변경될 때마다 리로드 될 수 있도록 해주는 속성
- package.json 파일에서 "scripts" 부분에 아래와 같이 추가해준다.
"scripts": {
"build" : "webpack --mode=production",
"dev": "webpack-dev-server"
},
- 아래와 같은 코드로 dev-server 를 사용해준다.
npx webpack-dev-server
dev-server에서 favicon 적용이 안되는 분
- Favicons Webpack Plugin 을 설치한다.
npm install --save-dev favicons favicons-webpack-plugin
- webpack.config.js 파일에 import 해주고, plugins에 플러그인을 추가해준다.
const FaviconsWebpackPlugin = require('favicons-webpack-plugin');
plugins : [
new HtmlWebpackPlugin({
title: "Virtual-Keyboard",
template : "./index.html",
inject : "body",
favicon : "./favicon.ico"
}),
new MiniCssExtractPlugin({
filename : "style.css"
}),
new FaviconsWebpackPlugin('./favicon.ico')
],
dev-server 에서는 왜 favicon 이 안보일까? 한 5시간동안 이유를 못찾았습니다..
배포된 index.html 을 라이브 서버로 보면, favicon 이 보이더라구요
이유를 혹시 알고 계신 분들은 댓글 부탁드릴게요 !
'CS > 개발지식' 카테고리의 다른 글
Sass (Syntactically Awesome Style Sheets) (0) | 2023.02.01 |
---|---|
크로스 브라우징 (Cross browsing) (0) | 2022.12.26 |
렌더링 엔진 (0) | 2022.12.26 |
웹 브라우저의 동작 순서 (0) | 2022.12.26 |
코드 리팩토링와 클린 코드 (0) | 2022.12.26 |